From 9e4d38fc8a4eaeda1982a19541903171c5a7251c Mon Sep 17 00:00:00 2001 From: DaviRain-Su Date: Mon, 4 Sep 2023 13:14:45 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20Creators?= =?UTF-8?q?DAO/creatorsdao.github.io@b57d402b12a91fec1595845b9e9ab8b909788?= =?UTF-8?q?8c2=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 404.html | 4 ++-- Solana-Co-Learn/index.html | 6 +++--- .../module1/block-chain-basic/index.html | 6 +++--- .../build-an-interaction-script/index.html | 6 +++--- .../module1/client-side-development/index.html | 6 +++--- .../index.html | 6 +++--- .../write-data-to-the-blockchain/index.html | 6 +++--- .../build-a-movie-review-app/index.html | 6 +++--- .../custom-instructions/index.html | 6 +++--- .../module1/custom-instruction/index.html | 6 +++--- .../run-it-back-deserialization/index.html | 6 +++--- Solana-Co-Learn/module1/index.html | 6 +++--- .../anchor_program_hello/index.html | 6 +++--- .../local_program_development/index.html | 6 +++--- .../native_program_hello/index.html | 6 +++--- .../solang_program_hello/index.html | 6 +++--- .../build-an-nft-minter-front-end/index.html | 6 +++--- .../deploy-to-vercel/index.html | 6 +++--- .../start-your-own-custom-project/index.html | 6 +++--- .../module1/wallet-usage/index.html | 6 +++--- .../connecting-to-wallet/index.html | 6 +++--- .../module1/wallets-and-frontends/index.html | 6 +++--- .../interact-with-a-program/index.html | 6 +++--- .../index.html | 6 +++--- .../displaying-nfts-from-a-wallet/index.html | 6 +++--- .../displaying-nfts/index.html | 6 +++--- .../displayings-nfts-in-a-ui/index.html | 6 +++--- Solana-Co-Learn/module2/index.html | 6 +++--- .../create-candy-machine/index.html | 6 +++--- .../create-reward-tokens/index.html | 6 +++--- .../create-the-minting-ui/index.html | 6 +++--- .../index.html | 6 +++--- .../candy-machine-and-the-sugar-cli/index.html | 6 +++--- .../nfts-and-minting-with-metaplex/index.html | 6 +++--- .../nft-your-face/index.html | 6 +++--- .../nfts-one-solana/index.html | 6 +++--- .../give-your-token-an-identity/index.html | 6 +++--- Solana-Co-Learn/module2/spl-token/index.html | 6 +++--- .../spl-token/mint-token-on-solana/index.html | 6 +++--- .../spl-token/the-token-program/index.html | 6 +++--- .../spl-token/token-metadata/index.html | 6 +++--- Solana-Co-Learn/module3/index.html | 6 +++--- .../hello-world/index.html | 6 +++--- .../module3/introduction-to-rust/index.html | 6 +++--- .../index.html | 6 +++--- .../the-magic-internet-computer/index.html | 6 +++--- .../build-a-movie-review-program/index.html | 6 +++--- .../native-solana-development/index.html | 6 +++--- .../state-management/index.html | 6 +++--- .../the-rust-layer-cake/index.html | 6 +++--- .../build-an-nft-staking-program/index.html | 6 +++--- .../nft-staking/how-staking-works/index.html | 6 +++--- Solana-Co-Learn/module3/nft-staking/index.html | 6 +++--- .../index.html | 6 +++--- .../module3/security-and-validation/index.html | 6 +++--- .../secure-our-program/index.html | 6 +++--- .../index.html | 6 +++--- .../cross-program-invocations/index.html | 6 +++--- .../mint-token-for-users/index.html | 6 +++--- .../the-cross-program-boss-fight/index.html | 6 +++--- Solana-Co-Learn/module4/index.html | 6 +++--- .../pdas/build-on-chain-comments/index.html | 6 +++--- Solana-Co-Learn/module4/pdas/index.html | 6 +++--- .../module4/pdas/pda-deep-dive/index.html | 6 +++--- .../build-a-staking-ui/index.html | 6 +++--- .../build-a-token-minter/index.html | 6 +++--- .../module4/ship-a-staking-app/index.html | 6 +++--- .../put-it-all-together/index.html | 6 +++--- Solana-Co-Learn/module4/testing/index.html | 6 +++--- .../testing/testing-solana-programs/index.html | 6 +++--- .../testing/writing-tests-in-rust/index.html | 6 +++--- .../build-the-front-end/index.html | 6 +++--- .../module5/a-full-stack-anchor-app/index.html | 6 +++--- .../redeeming-with-anchor/index.html | 6 +++--- .../staking-with-anchor/index.html | 6 +++--- .../unstaking-with-anchor/index.html | 6 +++--- .../anchor-into-typescript/index.html | 6 +++--- .../index.html | 6 +++--- .../module5/anchor-on-the-front-end/index.html | 6 +++--- Solana-Co-Learn/module5/index.html | 6 +++--- .../build-with-solana-frameworks/index.html | 6 +++--- .../module5/introduction-to-anchor/index.html | 6 +++--- .../setting-up-anchor/index.html | 6 +++--- .../the-anchor-framework/index.html | 6 +++--- .../build-with-anchor-cpis/index.html | 6 +++--- .../build-with-anchor-pdas/index.html | 6 +++--- .../cpis-in-anchor/index.html | 6 +++--- .../module5/program-in-anchor/index.html | 6 +++--- .../pdas-in-anchor/index.html | 8 ++++---- .../module6/finishing-touches/index.html | 6 +++--- .../finishing-touches/onwards/index.html | 6 +++--- .../preparing-for-takeoff/index.html | 6 +++--- .../the-final-pieces/index.html | 6 +++--- .../finishing-touches/the-last-ship/index.html | 6 +++--- Solana-Co-Learn/module6/index.html | 6 +++--- .../randomness/build-a-randomiser/index.html | 6 +++--- Solana-Co-Learn/module6/randomness/index.html | 6 +++--- .../randomness/opening-loot-boxes/index.html | 6 +++--- .../index.html | 6 +++--- .../build-a-loot-box-program/index.html | 6 +++--- .../ship-week/create-gear-tokens/index.html | 6 +++--- Solana-Co-Learn/module6/ship-week/index.html | 6 +++--- .../ship-week/intro-to-ship-week/index.html | 6 +++--- .../tags/anchor-program-hello/index.html | 4 ++-- Solana-Co-Learn/tags/backpack/index.html | 4 ++-- Solana-Co-Learn/tags/basic/index.html | 4 ++-- Solana-Co-Learn/tags/blockchain/index.html | 4 ++-- Solana-Co-Learn/tags/candy-machine/index.html | 4 ++-- Solana-Co-Learn/tags/candy/index.html | 4 ++-- .../tags/client-side-development/index.html | 4 ++-- .../tags/custom-instruction/index.html | 4 ++-- Solana-Co-Learn/tags/deploy/index.html | 4 ++-- .../tags/displayings-nfts/index.html | 4 ++-- .../index.html | 4 ++-- Solana-Co-Learn/tags/frontend/index.html | 4 ++-- .../tags/how-staking-works/index.html | 4 ++-- Solana-Co-Learn/tags/index.html | 4 ++-- Solana-Co-Learn/tags/intro-rust/index.html | 4 ++-- .../tags/local-development/index.html | 4 ++-- Solana-Co-Learn/tags/metaplex/index.html | 4 ++-- Solana-Co-Learn/tags/mint-spl-token/index.html | 4 ++-- .../tags/native-program-hello/index.html | 4 ++-- .../tags/native-solana-development/index.html | 4 ++-- .../tags/native-solana-program/index.html | 4 ++-- Solana-Co-Learn/tags/nft-staking/index.html | 4 ++-- Solana-Co-Learn/tags/nft/index.html | 4 ++-- .../nfts-and-minting-with-metaplex/index.html | 4 ++-- Solana-Co-Learn/tags/program/index.html | 4 ++-- Solana-Co-Learn/tags/rpc/index.html | 4 ++-- .../tags/rust-layer-cake/index.html | 4 ++-- .../tags/security-and-validation/index.html | 4 ++-- Solana-Co-Learn/tags/solana/index.html | 4 ++-- .../tags/solang-program-hello/index.html | 4 ++-- Solana-Co-Learn/tags/spl-token/index.html | 4 ++-- .../tags/srcure-our-program/index.html | 4 ++-- .../start-your-own-custom-project/index.html | 4 ++-- .../tags/state-management/index.html | 4 ++-- Solana-Co-Learn/tags/sugar-cli/index.html | 4 ++-- Solana-Co-Learn/tags/token-metadata/index.html | 4 ++-- Solana-Co-Learn/tags/token-program/index.html | 4 ++-- .../tags/wallet-and-frontend/index.html | 4 ++-- Solana-Co-Learn/tags/wallet-usage/index.html | 4 ++-- Solana-Co-Learn/tags/wallet/index.html | 4 ++-- .../close-0f372b199e28778bfccf280dd97f0794.png | Bin 479689 -> 0 bytes ...close2-0d45330a967878bbbfbae556b00f4905.png | Bin 414705 -> 0 bytes ...uction-8f202d0e3ebf42c9ca5e6ed8139c7588.png | Bin 390867 -> 0 bytes ...-pda-1-817ff47274ee09b49043ddf5c68f45e6.png | Bin 385916 -> 0 bytes ...-pda-2-81d9e41dc9526915a235d07c717a6a7c.png | Bin 370392 -> 0 bytes ...le-pda-3f9f8a45c0471959b1a9054f010e9ea1.png | Bin 402863 -> 0 bytes .../pda-a9c6ddb13900f1ba8227d91ae376ee5e.png | Bin 406036 -> 0 bytes ...ealloc-645e17306212937fb3db8f48920372d1.png | Bin 432172 -> 0 bytes ...660f19.884a203e.js => 00660f19.5d77dd01.js} | 2 +- ...293396.df658009.js => 02293396.7d764b04.js} | 2 +- ...31789f.58dcacb2.js => 0231789f.0ff570e3.js} | 2 +- ...79d735.91e7c374.js => 0279d735.986e63e8.js} | 2 +- ...0b84d0.a82aa765.js => 030b84d0.47759038.js} | 2 +- ...b4e199.5df8bed6.js => 03b4e199.e4331266.js} | 2 +- ...e84b79.2c43f813.js => 04e84b79.ae09678c.js} | 2 +- ...373b8d.b8085bc5.js => 05373b8d.d8bedd9a.js} | 2 +- ...970efd.f81b7c7f.js => 05970efd.0d73c25c.js} | 2 +- ...d4960c.39ffe505.js => 06d4960c.38684b66.js} | 2 +- ...dea239.783b569d.js => 07dea239.b303b729.js} | 2 +- ...bd8814.7950a058.js => 0abd8814.abc1201c.js} | 2 +- ...59e1b8.918047c2.js => 0b59e1b8.47487a25.js} | 2 +- assets/js/0bd4181b.225d872f.js | 1 - assets/js/0bd4181b.e8097bfb.js | 1 + ...5a820c.ba6aec25.js => 0e5a820c.386d2cbb.js} | 2 +- ...c4e5de.a3c25c46.js => 11c4e5de.b5127a51.js} | 2 +- ...2b1818.045b4bcd.js => 132b1818.d4018d33.js} | 2 +- ...4905a3.5282fd85.js => 134905a3.46363ab7.js} | 2 +- ...39c338.e3ef9075.js => 1439c338.b8c07077.js} | 2 +- ...911b08.3f23c251.js => 15911b08.3f961d6a.js} | 2 +- ...c63dea.8c51c44c.js => 15c63dea.1c365ffa.js} | 2 +- ...e1a4d3.7a38a610.js => 15e1a4d3.37ba0465.js} | 2 +- ...30110d.8b713d1f.js => 1a30110d.0649b70e.js} | 2 +- ...315ff9.bb224721.js => 1c315ff9.bd45130f.js} | 2 +- ...e18368.256f25fa.js => 1ce18368.063f0461.js} | 2 +- ...c16822.9f1a62e3.js => 1fc16822.40780b2b.js} | 2 +- ...ee1861.403c8999.js => 1fee1861.43e8f4ac.js} | 2 +- ...640e54.e043091d.js => 21640e54.167447bc.js} | 2 +- ...5821f5.91b7f495.js => 225821f5.5b1be39b.js} | 2 +- ...e9b757.86e5e5b6.js => 22e9b757.7ddd61e8.js} | 2 +- ...3ecfa8.badcd87c.js => 253ecfa8.feb44387.js} | 2 +- ...898abe.07330263.js => 28898abe.a960b725.js} | 2 +- ...9fc64b.5d7073da.js => 299fc64b.7f80864c.js} | 2 +- ...adb9a9.be10c750.js => 2badb9a9.44e29dcc.js} | 2 +- ...0e360e.8671428d.js => 2e0e360e.c627b044.js} | 2 +- ...9c1d3c.484be8e3.js => 319c1d3c.8555e1ad.js} | 2 +- ...aaa719.94c1e676.js => 32aaa719.cd6e80f0.js} | 2 +- ...e1b15f.16e5374c.js => 33e1b15f.24dc910f.js} | 2 +- ...2f049c.d8cac568.js => 382f049c.ff29f922.js} | 2 +- ...53220b.7580d571.js => 3853220b.1ca30a31.js} | 2 +- ...95fba0.6139fb28.js => 3895fba0.b61a8a5d.js} | 2 +- ...dec77c.8944baf4.js => 38dec77c.3b031497.js} | 2 +- ...2e2670.b29e083f.js => 3e2e2670.f25e8c9e.js} | 2 +- ...4aae0f.a44d3c11.js => 3e4aae0f.249fb5f9.js} | 2 +- ...527dee.48dc65b8.js => 41527dee.231afd9f.js} | 2 +- ...1f1a10.6b6117e1.js => 461f1a10.2d4f4574.js} | 2 +- ...85b026.fa6fdd88.js => 4785b026.95c66794.js} | 2 +- ...2e7013.d6468dbc.js => 492e7013.dea113a0.js} | 2 +- ...348d3d.bbd885bb.js => 4b348d3d.dcef004d.js} | 2 +- ...bf9b05.32ee2122.js => 4cbf9b05.84b77004.js} | 2 +- ...c67e3d.278e9b1c.js => 4cc67e3d.af2773aa.js} | 2 +- ...c3eaac.5a840ebd.js => 4fc3eaac.2302153c.js} | 2 +- ...c5a03c.65a23550.js => 50c5a03c.46367883.js} | 2 +- ...21f6bb.42893573.js => 5121f6bb.695819a7.js} | 2 +- ...8d5032.57c3f61c.js => 518d5032.5e8cbda1.js} | 2 +- ...900396.950aec61.js => 57900396.b137f890.js} | 2 +- ...be2f65.2e0f2ad5.js => 59be2f65.eebcb5ec.js} | 2 +- ...26d4ea.53a4afe9.js => 5c26d4ea.91c3ae45.js} | 2 +- ...5aec54.12a3237e.js => 5e5aec54.09865560.js} | 2 +- ...60bfde.491f471f.js => 6360bfde.751164ed.js} | 2 +- ...eeab8d.5bc919fc.js => 64eeab8d.1b38e59a.js} | 2 +- ...4709d0.38c9b044.js => 664709d0.24815574.js} | 2 +- ...0b10c4.ee212df5.js => 680b10c4.d91a854a.js} | 2 +- ...780da6.90ba8941.js => 68780da6.caefb703.js} | 2 +- ...39f7f7.ff3c28da.js => 6939f7f7.e78102e1.js} | 2 +- ...7b977d.c65e630c.js => 697b977d.b19c66e3.js} | 2 +- ...fb31e5.ff55505c.js => 6afb31e5.c035913e.js} | 2 +- ...e96c59.98aa9ab1.js => 6ce96c59.d13ab234.js} | 2 +- ...2cf01d.818884bf.js => 6d2cf01d.d488d445.js} | 2 +- ...4d06cb.c235a278.js => 6d4d06cb.e1a64513.js} | 2 +- ...9c6a64.66e489b1.js => 709c6a64.2f78b662.js} | 2 +- ...1fc4ea.7610cffb.js => 711fc4ea.2488b898.js} | 2 +- ...5fb80e.6ed1eb43.js => 735fb80e.8484fcb7.js} | 2 +- ...018678.59f56c1c.js => 74018678.1c5a06fa.js} | 2 +- ...3c4032.32f486b1.js => 763c4032.ca2c5000.js} | 2 +- ...b6d6f1.f2062caf.js => 77b6d6f1.a85475e7.js} | 2 +- ...511f30.72c55f88.js => 7a511f30.6ba149cf.js} | 2 +- ...79628a.0a1aba08.js => 7b79628a.5e8b9e70.js} | 2 +- ...fff120.f9879488.js => 7bfff120.6f44daec.js} | 2 +- ...120c26.2d88a471.js => 7c120c26.2d342e5c.js} | 2 +- ...6341e5.50ab6641.js => 846341e5.7c64d4db.js} | 2 +- ...12be1c.edfd9c10.js => 8912be1c.780fd672.js} | 2 +- ...257d3a.7bfff0ac.js => 8a257d3a.cb1cbecb.js} | 2 +- ...5b4911.b4fa4cf6.js => 8a5b4911.b25ae660.js} | 2 +- ...7a8dd6.7dff03f7.js => 8c7a8dd6.06d3cf33.js} | 2 +- ...b0d4ba.b956ef87.js => 8fb0d4ba.4b3316e4.js} | 2 +- ...d2947f.6564d80b.js => 90d2947f.352fce21.js} | 2 +- ...8f4956.cd1eb37f.js => 918f4956.b96c6678.js} | 2 +- ...26c69f.d57d088e.js => 9326c69f.4f055d36.js} | 2 +- ...2d26d3.da4acc2d.js => 962d26d3.bb4d21c5.js} | 2 +- ...eab071.35ec3649.js => 9beab071.b90c65dd.js} | 2 +- ...b3df06.03f7c68f.js => 9eb3df06.9e318299.js} | 2 +- ...3ad8a9.7087d05f.js => a23ad8a9.0921b182.js} | 2 +- ...4592de.f7e6ab46.js => a24592de.d481e76b.js} | 2 +- ...adfba8.1b291d74.js => a2adfba8.1e3d7688.js} | 2 +- ...421f51.19d8902c.js => a4421f51.21bab2c4.js} | 2 +- ...905e0d.77fdf452.js => a5905e0d.79e0ecac.js} | 2 +- ...23cf16.48598ffe.js => a723cf16.f3d841f8.js} | 2 +- ...65f211.a46221eb.js => a765f211.3f4214fd.js} | 2 +- ...ff51aa.caf7d4b8.js => a8ff51aa.314496ba.js} | 2 +- ...2226e3.089ea849.js => a92226e3.a982f443.js} | 2 +- ...3451ec.fee7759c.js => aa3451ec.7e374560.js} | 2 +- ...542ad7.c52206d8.js => aa542ad7.87d8ba85.js} | 2 +- ...284665.18fad6af.js => af284665.cf6fb984.js} | 2 +- ...2b610d.490a33f5.js => af2b610d.bbe521bf.js} | 2 +- ...dd1190.10a490ce.js => b4dd1190.74492d5e.js} | 2 +- ...513900.28a58804.js => b5513900.2745e8da.js} | 2 +- ...baa538.457232db.js => b6baa538.2cf49b77.js} | 2 +- ...de6482.90ada6f6.js => b7de6482.70b71e97.js} | 2 +- ...90c1bf.3c2ca57e.js => ba90c1bf.78051748.js} | 2 +- ...3c3f96.055a4ee6.js => bc3c3f96.bf1b5af3.js} | 2 +- ...5b884f.1fd40168.js => be5b884f.70a64931.js} | 2 +- ...4c16a9.8711e25b.js => bf4c16a9.8c9a463c.js} | 2 +- ...5173cb.b77adaf5.js => c15173cb.b75c2b02.js} | 2 +- ...5ad139.10557f3d.js => c15ad139.753b7402.js} | 2 +- ...7a8821.988d5362.js => c17a8821.53bdca7f.js} | 2 +- ...d25036.78f92535.js => cad25036.6f63cfb0.js} | 2 +- ...afad7d.c8d12da8.js => ccafad7d.1a602015.js} | 2 +- ...97ea08.f360bd5f.js => d097ea08.c9b3f94d.js} | 2 +- ...f9cf27.32bee4b3.js => d0f9cf27.bef1e969.js} | 2 +- ...1aa6b4.80987c11.js => d41aa6b4.df88882a.js} | 2 +- ...3682a5.90604dda.js => d63682a5.840c6b9d.js} | 2 +- ...46cb9d.98708448.js => d846cb9d.f2c88c07.js} | 2 +- ...88dbb9.0bf920ba.js => d888dbb9.9cf19caf.js} | 2 +- ...22ca0e.759d03ca.js => d922ca0e.997adab7.js} | 2 +- ...f1fece.1594f37d.js => d9f1fece.c5398b18.js} | 2 +- ...858cd0.07a93311.js => dc858cd0.c8d652b9.js} | 2 +- ...bb43e1.3268d959.js => ddbb43e1.eb664749.js} | 2 +- ...087bb2.2f7fc670.js => de087bb2.7d70d63f.js} | 2 +- ...292380.ed32fd2d.js => e7292380.0355d904.js} | 2 +- ...134d4f.a063f3d0.js => e8134d4f.30df1262.js} | 2 +- ...f74709.f21cd16a.js => e9f74709.193cec74.js} | 2 +- ...a98804.f86422e5.js => eda98804.e8b7456d.js} | 2 +- ...b9b04a.645e8504.js => edb9b04a.824a3a5c.js} | 2 +- ...df81a1.9bfdc809.js => eddf81a1.41dd89f6.js} | 2 +- ...f31466.5fd64e14.js => eef31466.ded62b40.js} | 2 +- ...26e85d.788742e6.js => f126e85d.0c8a0fb9.js} | 2 +- ...8dbc91.63ed61b4.js => f18dbc91.987e3488.js} | 2 +- ...ef0834.477bacf5.js => f3ef0834.231b881f.js} | 2 +- ...cf1efc.999e27f1.js => f4cf1efc.dd8fe87d.js} | 2 +- ...55ca4d.8730b593.js => f655ca4d.4d9bfae4.js} | 2 +- ...bcb135.3e93f4fb.js => f8bcb135.f68b2a24.js} | 2 +- ...b3936f.2d808ffa.js => f9b3936f.40b8997e.js} | 2 +- ...93d5c7.0aa5fb4f.js => fa93d5c7.e1ea018f.js} | 2 +- ...c62127.8ed196d1.js => fcc62127.b1153a29.js} | 2 +- ...07bbf3.087bed2a.js => fd07bbf3.58530438.js} | 2 +- ...d7318f.ca69f378.js => fdd7318f.3b6b351f.js} | 2 +- ...in.7fd55f2f.js => runtime~main.bdb2b7f2.js} | 2 +- awesome-solana-zh/index.html | 6 +++--- blog/ada-and-pda/index.html | 4 ++-- blog/archive/index.html | 4 ++-- .../index.html | 4 ++-- blog/first-blog-post/index.html | 4 ++-- blog/index.html | 4 ++-- blog/solana-state-compression/index.html | 4 ++-- blog/tags/anchor/index.html | 4 ++-- blog/tags/blockchain/index.html | 4 ++-- blog/tags/blog/index.html | 4 ++-- blog/tags/co-learn/index.html | 4 ++-- blog/tags/index.html | 4 ++-- blog/tags/solana/index.html | 4 ++-- blog/tags/state-compression/index.html | 4 ++-- cookbook-zh/core-concepts/accounts/index.html | 6 +++--- cookbook-zh/core-concepts/cpi/index.html | 6 +++--- cookbook-zh/core-concepts/index.html | 6 +++--- cookbook-zh/core-concepts/pdas/index.html | 6 +++--- cookbook-zh/core-concepts/programs/index.html | 6 +++--- .../core-concepts/transactions/index.html | 6 +++--- .../getting-started/contributing/index.html | 6 +++--- cookbook-zh/getting-started/index.html | 6 +++--- .../getting-started/installation/index.html | 6 +++--- cookbook-zh/guides/account-maps/index.html | 6 +++--- cookbook-zh/guides/data-migration/index.html | 6 +++--- .../debugging-solana-programs/index.html | 6 +++--- .../guides/feature-parity-testing/index.html | 6 +++--- .../guides/get-program-accounts/index.html | 6 +++--- cookbook-zh/guides/index.html | 6 +++--- .../guides/retrying-transactions/index.html | 6 +++--- cookbook-zh/guides/serialization/index.html | 6 +++--- .../guides/versioned-transactions/index.html | 6 +++--- cookbook-zh/index.html | 6 +++--- cookbook-zh/references/accounts/index.html | 6 +++--- .../references/basic-transactions/index.html | 6 +++--- .../references/gaming/auto-approve/index.html | 6 +++--- .../references/gaming/distribution/index.html | 6 +++--- .../references/gaming/energy-system/index.html | 6 +++--- .../references/gaming/game-examples/index.html | 6 +++--- .../references/gaming/game-sdks/index.html | 6 +++--- .../references/gaming/hello-world/index.html | 6 +++--- cookbook-zh/references/gaming/index.html | 6 +++--- .../gaming/interact-with-tokens/index.html | 6 +++--- cookbook-zh/references/gaming/intro/index.html | 6 +++--- .../references/gaming/nfts-in-games/index.html | 6 +++--- .../gaming/porting-anchor-to-unity/index.html | 6 +++--- .../gaming/saving-game-state/index.html | 6 +++--- .../gaming/store-sol-in-pda/index.html | 6 +++--- cookbook-zh/references/index.html | 6 +++--- .../references/keypairs-and-wallets/index.html | 6 +++--- .../references/local-development/index.html | 6 +++--- cookbook-zh/references/name-service/index.html | 6 +++--- cookbook-zh/references/nfts/index.html | 6 +++--- .../references/offline-transactions/index.html | 6 +++--- cookbook-zh/references/programs/index.html | 6 +++--- cookbook-zh/references/staking/index.html | 6 +++--- cookbook-zh/references/token/index.html | 6 +++--- cookbook-zh/tags/account-map/index.html | 4 ++-- cookbook-zh/tags/account/index.html | 4 ++-- cookbook-zh/tags/accounts/index.html | 4 ++-- cookbook-zh/tags/contribute/index.html | 4 ++-- cookbook-zh/tags/cpi/index.html | 4 ++-- cookbook-zh/tags/data-migration/index.html | 4 ++-- cookbook-zh/tags/debug/index.html | 4 ++-- cookbook-zh/tags/distrbution/index.html | 4 ++-- cookbook-zh/tags/energy-system/index.html | 4 ++-- cookbook-zh/tags/example/index.html | 4 ++-- cookbook-zh/tags/game/index.html | 4 ++-- cookbook-zh/tags/hello-world/index.html | 4 ++-- cookbook-zh/tags/index.html | 4 ++-- cookbook-zh/tags/intro/index.html | 4 ++-- cookbook-zh/tags/keypair/index.html | 4 ++-- cookbook-zh/tags/learn/index.html | 4 ++-- cookbook-zh/tags/local-development/index.html | 4 ++-- cookbook-zh/tags/name-service/index.html | 4 ++-- cookbook-zh/tags/nft/index.html | 4 ++-- cookbook-zh/tags/pda/index.html | 4 ++-- cookbook-zh/tags/program/index.html | 4 ++-- cookbook-zh/tags/sdk/index.html | 4 ++-- cookbook-zh/tags/serialization/index.html | 4 ++-- cookbook-zh/tags/solana-cook-book/index.html | 4 ++-- cookbook-zh/tags/solana/index.html | 4 ++-- cookbook-zh/tags/staking/index.html | 4 ++-- cookbook-zh/tags/store-sol/index.html | 4 ++-- cookbook-zh/tags/test/index.html | 4 ++-- cookbook-zh/tags/token/index.html | 4 ++-- cookbook-zh/tags/transaction/index.html | 4 ++-- cookbook-zh/tags/transactions/index.html | 4 ++-- cookbook-zh/tags/unity/index.html | 4 ++-- cookbook-zh/tags/wallet/index.html | 4 ++-- cookbook-zh/tags/web-3-js/index.html | 4 ++-- index.html | 4 ++-- markdown-page/index.html | 4 ++-- 393 files changed, 767 insertions(+), 767 deletions(-) delete mode 100644 assets/images/close-0f372b199e28778bfccf280dd97f0794.png delete mode 100644 assets/images/close2-0d45330a967878bbbfbae556b00f4905.png delete mode 100644 assets/images/example-instruction-8f202d0e3ebf42c9ca5e6ed8139c7588.png delete mode 100644 assets/images/example-pda-1-817ff47274ee09b49043ddf5c68f45e6.png delete mode 100644 assets/images/example-pda-2-81d9e41dc9526915a235d07c717a6a7c.png delete mode 100644 assets/images/example-pda-3f9f8a45c0471959b1a9054f010e9ea1.png delete mode 100644 assets/images/pda-a9c6ddb13900f1ba8227d91ae376ee5e.png delete mode 100644 assets/images/realloc-645e17306212937fb3db8f48920372d1.png rename assets/js/{00660f19.884a203e.js => 00660f19.5d77dd01.js} (98%) rename assets/js/{02293396.df658009.js => 02293396.7d764b04.js} (98%) rename assets/js/{0231789f.58dcacb2.js => 0231789f.0ff570e3.js} (99%) rename assets/js/{0279d735.91e7c374.js => 0279d735.986e63e8.js} (98%) rename assets/js/{030b84d0.a82aa765.js => 030b84d0.47759038.js} (99%) rename assets/js/{03b4e199.5df8bed6.js => 03b4e199.e4331266.js} (99%) rename assets/js/{04e84b79.2c43f813.js => 04e84b79.ae09678c.js} (99%) rename assets/js/{05373b8d.b8085bc5.js => 05373b8d.d8bedd9a.js} (99%) rename assets/js/{05970efd.f81b7c7f.js => 05970efd.0d73c25c.js} (99%) rename assets/js/{06d4960c.39ffe505.js => 06d4960c.38684b66.js} (99%) rename assets/js/{07dea239.783b569d.js => 07dea239.b303b729.js} (99%) rename assets/js/{0abd8814.7950a058.js => 0abd8814.abc1201c.js} (98%) rename assets/js/{0b59e1b8.918047c2.js => 0b59e1b8.47487a25.js} (99%) delete mode 100644 assets/js/0bd4181b.225d872f.js create mode 100644 assets/js/0bd4181b.e8097bfb.js rename assets/js/{0e5a820c.ba6aec25.js => 0e5a820c.386d2cbb.js} (98%) rename assets/js/{11c4e5de.a3c25c46.js => 11c4e5de.b5127a51.js} (99%) rename assets/js/{132b1818.045b4bcd.js => 132b1818.d4018d33.js} (99%) rename assets/js/{134905a3.5282fd85.js => 134905a3.46363ab7.js} (99%) rename assets/js/{1439c338.e3ef9075.js => 1439c338.b8c07077.js} (99%) rename assets/js/{15911b08.3f23c251.js => 15911b08.3f961d6a.js} (98%) rename assets/js/{15c63dea.8c51c44c.js => 15c63dea.1c365ffa.js} (99%) rename assets/js/{15e1a4d3.7a38a610.js => 15e1a4d3.37ba0465.js} (99%) rename assets/js/{1a30110d.8b713d1f.js => 1a30110d.0649b70e.js} (99%) rename assets/js/{1c315ff9.bb224721.js => 1c315ff9.bd45130f.js} (99%) rename assets/js/{1ce18368.256f25fa.js => 1ce18368.063f0461.js} (99%) rename assets/js/{1fc16822.9f1a62e3.js => 1fc16822.40780b2b.js} (99%) rename assets/js/{1fee1861.403c8999.js => 1fee1861.43e8f4ac.js} (96%) rename assets/js/{21640e54.e043091d.js => 21640e54.167447bc.js} (99%) rename assets/js/{225821f5.91b7f495.js => 225821f5.5b1be39b.js} (99%) rename assets/js/{22e9b757.86e5e5b6.js => 22e9b757.7ddd61e8.js} (99%) rename assets/js/{253ecfa8.badcd87c.js => 253ecfa8.feb44387.js} (97%) rename assets/js/{28898abe.07330263.js => 28898abe.a960b725.js} (97%) rename assets/js/{299fc64b.5d7073da.js => 299fc64b.7f80864c.js} (97%) rename assets/js/{2badb9a9.be10c750.js => 2badb9a9.44e29dcc.js} (97%) rename assets/js/{2e0e360e.8671428d.js => 2e0e360e.c627b044.js} (98%) rename assets/js/{319c1d3c.484be8e3.js => 319c1d3c.8555e1ad.js} (98%) rename assets/js/{32aaa719.94c1e676.js => 32aaa719.cd6e80f0.js} (99%) rename assets/js/{33e1b15f.16e5374c.js => 33e1b15f.24dc910f.js} (99%) rename assets/js/{382f049c.d8cac568.js => 382f049c.ff29f922.js} (99%) rename assets/js/{3853220b.7580d571.js => 3853220b.1ca30a31.js} (99%) rename assets/js/{3895fba0.6139fb28.js => 3895fba0.b61a8a5d.js} (99%) rename assets/js/{38dec77c.8944baf4.js => 38dec77c.3b031497.js} (99%) rename assets/js/{3e2e2670.b29e083f.js => 3e2e2670.f25e8c9e.js} (99%) rename assets/js/{3e4aae0f.a44d3c11.js => 3e4aae0f.249fb5f9.js} (99%) rename assets/js/{41527dee.48dc65b8.js => 41527dee.231afd9f.js} (99%) rename assets/js/{461f1a10.6b6117e1.js => 461f1a10.2d4f4574.js} (99%) rename assets/js/{4785b026.fa6fdd88.js => 4785b026.95c66794.js} (97%) rename assets/js/{492e7013.d6468dbc.js => 492e7013.dea113a0.js} (98%) rename assets/js/{4b348d3d.bbd885bb.js => 4b348d3d.dcef004d.js} (98%) rename assets/js/{4cbf9b05.32ee2122.js => 4cbf9b05.84b77004.js} (99%) rename assets/js/{4cc67e3d.278e9b1c.js => 4cc67e3d.af2773aa.js} (98%) rename assets/js/{4fc3eaac.5a840ebd.js => 4fc3eaac.2302153c.js} (98%) rename assets/js/{50c5a03c.65a23550.js => 50c5a03c.46367883.js} (99%) rename assets/js/{5121f6bb.42893573.js => 5121f6bb.695819a7.js} (99%) rename assets/js/{518d5032.57c3f61c.js => 518d5032.5e8cbda1.js} (99%) rename assets/js/{57900396.950aec61.js => 57900396.b137f890.js} (98%) rename assets/js/{59be2f65.2e0f2ad5.js => 59be2f65.eebcb5ec.js} (99%) rename assets/js/{5c26d4ea.53a4afe9.js => 5c26d4ea.91c3ae45.js} (99%) rename assets/js/{5e5aec54.12a3237e.js => 5e5aec54.09865560.js} (98%) rename assets/js/{6360bfde.491f471f.js => 6360bfde.751164ed.js} (98%) rename assets/js/{64eeab8d.5bc919fc.js => 64eeab8d.1b38e59a.js} (99%) rename assets/js/{664709d0.38c9b044.js => 664709d0.24815574.js} (99%) rename assets/js/{680b10c4.ee212df5.js => 680b10c4.d91a854a.js} (99%) rename assets/js/{68780da6.90ba8941.js => 68780da6.caefb703.js} (99%) rename assets/js/{6939f7f7.ff3c28da.js => 6939f7f7.e78102e1.js} (99%) rename assets/js/{697b977d.c65e630c.js => 697b977d.b19c66e3.js} (99%) rename assets/js/{6afb31e5.ff55505c.js => 6afb31e5.c035913e.js} (99%) rename assets/js/{6ce96c59.98aa9ab1.js => 6ce96c59.d13ab234.js} (99%) rename assets/js/{6d2cf01d.818884bf.js => 6d2cf01d.d488d445.js} (99%) rename assets/js/{6d4d06cb.c235a278.js => 6d4d06cb.e1a64513.js} (98%) rename assets/js/{709c6a64.66e489b1.js => 709c6a64.2f78b662.js} (99%) rename assets/js/{711fc4ea.7610cffb.js => 711fc4ea.2488b898.js} (96%) rename assets/js/{735fb80e.6ed1eb43.js => 735fb80e.8484fcb7.js} (99%) rename assets/js/{74018678.59f56c1c.js => 74018678.1c5a06fa.js} (99%) rename assets/js/{763c4032.32f486b1.js => 763c4032.ca2c5000.js} (97%) rename assets/js/{77b6d6f1.f2062caf.js => 77b6d6f1.a85475e7.js} (99%) rename assets/js/{7a511f30.72c55f88.js => 7a511f30.6ba149cf.js} (99%) rename assets/js/{7b79628a.0a1aba08.js => 7b79628a.5e8b9e70.js} (99%) rename assets/js/{7bfff120.f9879488.js => 7bfff120.6f44daec.js} (99%) rename assets/js/{7c120c26.2d88a471.js => 7c120c26.2d342e5c.js} (99%) rename assets/js/{846341e5.50ab6641.js => 846341e5.7c64d4db.js} (99%) rename assets/js/{8912be1c.edfd9c10.js => 8912be1c.780fd672.js} (98%) rename assets/js/{8a257d3a.7bfff0ac.js => 8a257d3a.cb1cbecb.js} (99%) rename assets/js/{8a5b4911.b4fa4cf6.js => 8a5b4911.b25ae660.js} (99%) rename assets/js/{8c7a8dd6.7dff03f7.js => 8c7a8dd6.06d3cf33.js} (96%) rename assets/js/{8fb0d4ba.b956ef87.js => 8fb0d4ba.4b3316e4.js} (97%) rename assets/js/{90d2947f.6564d80b.js => 90d2947f.352fce21.js} (91%) rename assets/js/{918f4956.cd1eb37f.js => 918f4956.b96c6678.js} (99%) rename assets/js/{9326c69f.d57d088e.js => 9326c69f.4f055d36.js} (98%) rename assets/js/{962d26d3.da4acc2d.js => 962d26d3.bb4d21c5.js} (98%) rename assets/js/{9beab071.35ec3649.js => 9beab071.b90c65dd.js} (99%) rename assets/js/{9eb3df06.03f7c68f.js => 9eb3df06.9e318299.js} (97%) rename assets/js/{a23ad8a9.7087d05f.js => a23ad8a9.0921b182.js} (99%) rename assets/js/{a24592de.f7e6ab46.js => a24592de.d481e76b.js} (98%) rename assets/js/{a2adfba8.1b291d74.js => a2adfba8.1e3d7688.js} (99%) rename assets/js/{a4421f51.19d8902c.js => a4421f51.21bab2c4.js} (99%) rename assets/js/{a5905e0d.77fdf452.js => a5905e0d.79e0ecac.js} (99%) rename assets/js/{a723cf16.48598ffe.js => a723cf16.f3d841f8.js} (97%) rename assets/js/{a765f211.a46221eb.js => a765f211.3f4214fd.js} (98%) rename assets/js/{a8ff51aa.caf7d4b8.js => a8ff51aa.314496ba.js} (99%) rename assets/js/{a92226e3.089ea849.js => a92226e3.a982f443.js} (98%) rename assets/js/{aa3451ec.fee7759c.js => aa3451ec.7e374560.js} (99%) rename assets/js/{aa542ad7.c52206d8.js => aa542ad7.87d8ba85.js} (99%) rename assets/js/{af284665.18fad6af.js => af284665.cf6fb984.js} (99%) rename assets/js/{af2b610d.490a33f5.js => af2b610d.bbe521bf.js} (97%) rename assets/js/{b4dd1190.10a490ce.js => b4dd1190.74492d5e.js} (99%) rename assets/js/{b5513900.28a58804.js => b5513900.2745e8da.js} (99%) rename assets/js/{b6baa538.457232db.js => b6baa538.2cf49b77.js} (99%) rename assets/js/{b7de6482.90ada6f6.js => b7de6482.70b71e97.js} (99%) rename assets/js/{ba90c1bf.3c2ca57e.js => ba90c1bf.78051748.js} (96%) rename assets/js/{bc3c3f96.055a4ee6.js => bc3c3f96.bf1b5af3.js} (98%) rename assets/js/{be5b884f.1fd40168.js => be5b884f.70a64931.js} (99%) rename assets/js/{bf4c16a9.8711e25b.js => bf4c16a9.8c9a463c.js} (99%) rename assets/js/{c15173cb.b77adaf5.js => c15173cb.b75c2b02.js} (99%) rename assets/js/{c15ad139.10557f3d.js => c15ad139.753b7402.js} (98%) rename assets/js/{c17a8821.988d5362.js => c17a8821.53bdca7f.js} (99%) rename assets/js/{cad25036.78f92535.js => cad25036.6f63cfb0.js} (99%) rename assets/js/{ccafad7d.c8d12da8.js => ccafad7d.1a602015.js} (99%) rename assets/js/{d097ea08.f360bd5f.js => d097ea08.c9b3f94d.js} (99%) rename assets/js/{d0f9cf27.32bee4b3.js => d0f9cf27.bef1e969.js} (99%) rename assets/js/{d41aa6b4.80987c11.js => d41aa6b4.df88882a.js} (98%) rename assets/js/{d63682a5.90604dda.js => d63682a5.840c6b9d.js} (99%) rename assets/js/{d846cb9d.98708448.js => d846cb9d.f2c88c07.js} (99%) rename assets/js/{d888dbb9.0bf920ba.js => d888dbb9.9cf19caf.js} (99%) rename assets/js/{d922ca0e.759d03ca.js => d922ca0e.997adab7.js} (99%) rename assets/js/{d9f1fece.1594f37d.js => d9f1fece.c5398b18.js} (99%) rename assets/js/{dc858cd0.07a93311.js => dc858cd0.c8d652b9.js} (99%) rename assets/js/{ddbb43e1.3268d959.js => ddbb43e1.eb664749.js} (97%) rename assets/js/{de087bb2.2f7fc670.js => de087bb2.7d70d63f.js} (97%) rename assets/js/{e7292380.ed32fd2d.js => e7292380.0355d904.js} (97%) rename assets/js/{e8134d4f.a063f3d0.js => e8134d4f.30df1262.js} (98%) rename assets/js/{e9f74709.f21cd16a.js => e9f74709.193cec74.js} (98%) rename assets/js/{eda98804.f86422e5.js => eda98804.e8b7456d.js} (99%) rename assets/js/{edb9b04a.645e8504.js => edb9b04a.824a3a5c.js} (98%) rename assets/js/{eddf81a1.9bfdc809.js => eddf81a1.41dd89f6.js} (99%) rename assets/js/{eef31466.5fd64e14.js => eef31466.ded62b40.js} (99%) rename assets/js/{f126e85d.788742e6.js => f126e85d.0c8a0fb9.js} (99%) rename assets/js/{f18dbc91.63ed61b4.js => f18dbc91.987e3488.js} (97%) rename assets/js/{f3ef0834.477bacf5.js => f3ef0834.231b881f.js} (99%) rename assets/js/{f4cf1efc.999e27f1.js => f4cf1efc.dd8fe87d.js} (99%) rename assets/js/{f655ca4d.8730b593.js => f655ca4d.4d9bfae4.js} (96%) rename assets/js/{f8bcb135.3e93f4fb.js => f8bcb135.f68b2a24.js} (99%) rename assets/js/{f9b3936f.2d808ffa.js => f9b3936f.40b8997e.js} (99%) rename assets/js/{fa93d5c7.0aa5fb4f.js => fa93d5c7.e1ea018f.js} (99%) rename assets/js/{fcc62127.8ed196d1.js => fcc62127.b1153a29.js} (98%) rename assets/js/{fd07bbf3.087bed2a.js => fd07bbf3.58530438.js} (98%) rename assets/js/{fdd7318f.ca69f378.js => fdd7318f.3b6b351f.js} (98%) rename assets/js/{runtime~main.7fd55f2f.js => runtime~main.bdb2b7f2.js} (61%) diff --git a/404.html b/404.html index e7a47a6cb..3fd992d55 100644 --- a/404.html +++ b/404.html @@ -5,13 +5,13 @@ 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.

- + \ No newline at end of file diff --git a/Solana-Co-Learn/index.html b/Solana-Co-Learn/index.html index b7f86dd0e..6109f501a 100644 --- a/Solana-Co-Learn/index.html +++ b/Solana-Co-Learn/index.html @@ -5,13 +5,13 @@ Solana Co Learn | All in One Solana - +
-
Skip to main content
- +
Skip to main content
+ \ No newline at end of file diff --git a/Solana-Co-Learn/module1/block-chain-basic/index.html b/Solana-Co-Learn/module1/block-chain-basic/index.html index 539fe7a40..819d36397 100644 --- a/Solana-Co-Learn/module1/block-chain-basic/index.html +++ b/Solana-Co-Learn/module1/block-chain-basic/index.html @@ -5,7 +5,7 @@ 区块链基本概念介绍 | All in One Solana - + @@ -13,8 +13,8 @@
Skip to main content

区块链基本概念介绍

1. 什么是区块链?

1.1 区块链的定义

来自维基百科的定义:

  • 区块链是借由密码学和共识机制等技术建立与存储庞大交易资料串连的点对点网路系统。

网络上其它一些定义:

  • 区块链是一个去中心化的、可共享的、防篡改的分布式账本。
  • 区块链技术是一种高级数据库机制,允许在企业网络中透明的共享信息。
  • 区块链是一个共享的、不可篡改的账本,旨在促进业务网络中的交易记录和资产跟踪流程。

总结如下:

  • 从功能上说,区块链系统是一个去中心化的、可共享的、不可篡改的分布式账本。
  • 从使用技术上说,区块链系统是由密码学、共识机制、p2p等技术建立的软件系统。

1.2 比特币和区块链的关系

比特币的出现标志着区块链技术的产生,换句话说,比特币系统的主要技术就是区块链技术。 比特币是第一个区块链系统,中本聪可以说是区块链技术的始祖。

1.3 区块链技术的演进

  • 2008年,中本聪在网上发布了一篇名为《Bitcoin: A Peer-to-Peer Electronic Cash System》。
  • 2008年11月16日,中本聪公布了比特币系统的源代码。
  • 2009年1月3日(比特币的创世时刻),中本聪在互联网上上线了比特币网络。比特币的产生标志着区块链进入1.0时代。
  • 2013年,V神提出:图灵完备、可编程的区块链。从此之后区块链有了智能合约。以太坊的产生标志着区块链进入2.0时代。
  • 从以太坊之后,不断有新的区块链技术出现,像SolanaPolkadotComosNear等等。

2 从使用者的角度看,区块链是怎样运行的?

下面主要以比特币为例,看看区块链系统是怎么运行的。在开始之前,我们需要明确一下比特币的功能。比特币系统是一个软件系统,这个软件系统的主要功能实际就是记账,记录的内容就是谁有多少个比特币,例如“小明有3个比特币”。当然比特币真正的记账不会这么简单,因为它实际上是以一种叫做UTXO的结构在记账,但是此处希望大家明白的是它主要的功能就是记账。

2.1 比特币的运行

下面我们就从小明和小红之间的转账过程来看看区块链系统是怎么样运行的。 s

  • 假定开始时:小明已经有了3个比特币,小红没有比特币,此时在比特币系统中就会类似记录“小明, 3个比特币”。
  • 当小明通过比特币系统转给小红1个比特币后,比特币系统中的记录就会变成“小明,2个比特币;小红,1个比特币”。 -特别说明:比特币是使用UTXO的方式记账,此处为了方便演示区块链系统运行的过程,所以对记账以账户类型方式做替代,如需了解比特币正在的记账方式请查阅UTXO相关资料。

当“小明转给小红1个比特币”时,其发生的过程主要如下:

  1. 小明通过终端(手机或者电脑)将交易发给比特币系统的某个节点(例如上图中的计算机1),这个交易记录的主要信息就是“小明转给小红1个比特币”。

  2. 计算机1上的比特币程序就会做如下几件事情:

  • 检查交易的合法性。
  • 将交易广播给其它相连的节点(计算机上的比特币程序实际上就是比特币网络中的一个节点,后面我们都称为节点)。
  1. 其它节点通过网络收到这个交易后,也都会做如下的事情:
  • 检查交易的合法性。
  • 广播给其它相连的节点。
  1. 除了上述的上述的动作外,每个节点还会持续进行挖矿的操作(这里假定系统中所有的节点都是全节点,便于说明原理),具体行为为:
  • 将收到的交易进行打包,打包之后的结构叫做区块。
  • 区块的区块头里面要填充一些信息,这些信息包括前一个区块头的哈希,区块链中所有交易哈希的默克尔树的树根,还有解一个难题的难度值等。
  • 将打包好的区块广播给网络中的其它节点。
  1. 每个节点收到区块后(每个节点自己打包区块,同时也会从网络中收到其它的区块),会进行如下处理:
  • 对收到的区块进行验证。
  • 然后将新收到的区块进行存储,这样每个节点上就会有一个区块组成的链条形式的账本(因为每个区块头里面有前一个区块头的信息)。
  1. “小明转给小红1个比特币”这个交易信息最终就被记录在某个区块中,我们就可以认为这个信息已经被记录在比特币系统中了,其对应的效果就类似于记录“小明,2个比特币;小红,1个比特币”。

2.2 几个重要的问题

  1. 如何验证交易的合法性?

每个节点收到交易后如何验证交易的合法性,换句话说,就是怎么知道“小明可以给小红转1个比特币”。这是因为,每个节点都保存有区块链的账本(一个区块连着一个区块),在收到交易后,它会查自己账本中对应的情况,看小明是不是有3个比特币。

  1. 如何保证挖矿的节点真实的打包区块?

上面的交易相对来说好验证,但是如果某个节点打包时,自己私自写一个交易或者篡改一个交易到区块中,其它区块怎么验证,如果无法验证的话,那么这个账本的可信度岂不是无法保证。

这里就涉及到每个节点挖矿时都需要解决一个难题,而这个难题的计算需要一定的代价(需要不断的计算,花费电费),当它打包的区块被大部分节点都加入到区块链条中后,会得到相应的奖励。当其它节点收到别的节点打包的区块时,会进行下面的验证:

  • 验证这个难题的答案是不是正确。
  • 验证是不是区块链里面的每笔交易是不是正确(会根据自己本地的账本验证交易是不是正确)。

试想一下,如果有一个作恶的节点,当它花费一定的电量打包了一个区块,而此区块中有一笔或者多笔篡改的交易;当其它节点收到该区块后,根据上面的第二点验证时,验证不过,那么就会抛弃此区块。此时作恶节点就得不到挖矿的奖励,但是它挖矿时是花费了成本的,这对它来说并不划算,所以正常来说,挖矿的节点不会做这种吃力不讨好的事情。即使有个别的节点做这样的事情,也不会对最终的结果产生影响。

  1. 多个节点都在打包区块,那么当其它节点收到区块后,必然会出现一个高度有多个区块的情况(即每个区块的前一个区块头信息都一样),那么存储时以那个区块中的信息为准?

这个问题描述是下面这种情形:

在上图中,当节点5收到多个高度为n+1的区块,它的区块链链条该选择那个区块呢?在比特币中,选择链条最长的作为最终的账本,其它分叉上的区块就会无效。每个矿工节点在挖矿时,都会基于自己看到的最长的链条上的最新区块进行打包(例如接下来节点5要打包第n+3个区块,它就会选择在中间那个链条上block n+2作为父区块挖矿。),当所有节点都如此选择时,在所有节点上的链条最终会一致(就是那条最长的链条)。

小结:

上面的第2和第3个问题实际上可以合成一个问题,就是如何保证所有节点上的账本一致?而在区块链系统中解决这部分问题的机制就叫做共识机制。

3 从实现的角度看,看区块链的架构

3.1 比特币系统架构

根据上一节比特币系统的运行,我们大致可以知道比特币系统(区块链系统类似)的架构。

  • 用户可以发送交易到比特币系统,所以比特币系统中有Rpc server或者是http server
  • 节点之间可以通信,且节点之间的地位对等,那么需要P2P网络部分。
  • 每个节点收到交易后,首先是将交易放在交易池中,挖矿时是从交易池取出交易进行打包,所以需要交易池。
  • 需要保证所有节点上的账本一致,所以需要共识模块。
  • 区块形成的链条在每个节点上都是持久化存储的,所以需要数据库用于节点上数据的持久化。
  • 共识里面涉及到的区块链条、区块、交易等结构的一些定义和组织形式,所以需要账本模块。
  • 其它还涉及到一些安全、加密相关的模块。

根据这些推断,我们可以得出比特币的大致架构如下:

3.2 以太坊系统架构

下图是从网络中找到的以太坊的架构图:

我们可以看到和比特币的架构图大体上差不多,主要是多了智能合约相关的内容。

3. 通常的区块链系统架构

其实从前面的比特币和以太坊架构,我们也可以推断出来,大部分区块链系统的架构都差不太多,尤其是现在常见的区块链系统,其架构都类似于以太坊的架构。有差别的主要在于共识模块、分布式账本的具体实现。

4 solana的原理

前面主要介绍了区块链的基础知识,再讲讲Solana的相关原理。具体内容可以参考这篇文章

5 推荐资料

  • 《精通比特币》

参考资料💾

- +特别说明:比特币是使用UTXO的方式记账,此处为了方便演示区块链系统运行的过程,所以对记账以账户类型方式做替代,如需了解比特币正在的记账方式请查阅UTXO相关资料。

当“小明转给小红1个比特币”时,其发生的过程主要如下:

  1. 小明通过终端(手机或者电脑)将交易发给比特币系统的某个节点(例如上图中的计算机1),这个交易记录的主要信息就是“小明转给小红1个比特币”。

  2. 计算机1上的比特币程序就会做如下几件事情:

  1. 其它节点通过网络收到这个交易后,也都会做如下的事情:
  1. 除了上述的上述的动作外,每个节点还会持续进行挖矿的操作(这里假定系统中所有的节点都是全节点,便于说明原理),具体行为为:
  1. 每个节点收到区块后(每个节点自己打包区块,同时也会从网络中收到其它的区块),会进行如下处理:
  1. “小明转给小红1个比特币”这个交易信息最终就被记录在某个区块中,我们就可以认为这个信息已经被记录在比特币系统中了,其对应的效果就类似于记录“小明,2个比特币;小红,1个比特币”。

2.2 几个重要的问题

  1. 如何验证交易的合法性?

每个节点收到交易后如何验证交易的合法性,换句话说,就是怎么知道“小明可以给小红转1个比特币”。这是因为,每个节点都保存有区块链的账本(一个区块连着一个区块),在收到交易后,它会查自己账本中对应的情况,看小明是不是有3个比特币。

  1. 如何保证挖矿的节点真实的打包区块?

上面的交易相对来说好验证,但是如果某个节点打包时,自己私自写一个交易或者篡改一个交易到区块中,其它区块怎么验证,如果无法验证的话,那么这个账本的可信度岂不是无法保证。

这里就涉及到每个节点挖矿时都需要解决一个难题,而这个难题的计算需要一定的代价(需要不断的计算,花费电费),当它打包的区块被大部分节点都加入到区块链条中后,会得到相应的奖励。当其它节点收到别的节点打包的区块时,会进行下面的验证:

试想一下,如果有一个作恶的节点,当它花费一定的电量打包了一个区块,而此区块中有一笔或者多笔篡改的交易;当其它节点收到该区块后,根据上面的第二点验证时,验证不过,那么就会抛弃此区块。此时作恶节点就得不到挖矿的奖励,但是它挖矿时是花费了成本的,这对它来说并不划算,所以正常来说,挖矿的节点不会做这种吃力不讨好的事情。即使有个别的节点做这样的事情,也不会对最终的结果产生影响。

  1. 多个节点都在打包区块,那么当其它节点收到区块后,必然会出现一个高度有多个区块的情况(即每个区块的前一个区块头信息都一样),那么存储时以那个区块中的信息为准?

这个问题描述是下面这种情形:

在上图中,当节点5收到多个高度为n+1的区块,它的区块链链条该选择那个区块呢?在比特币中,选择链条最长的作为最终的账本,其它分叉上的区块就会无效。每个矿工节点在挖矿时,都会基于自己看到的最长的链条上的最新区块进行打包(例如接下来节点5要打包第n+3个区块,它就会选择在中间那个链条上block n+2作为父区块挖矿。),当所有节点都如此选择时,在所有节点上的链条最终会一致(就是那条最长的链条)。

小结:

上面的第2和第3个问题实际上可以合成一个问题,就是如何保证所有节点上的账本一致?而在区块链系统中解决这部分问题的机制就叫做共识机制。

3 从实现的角度看,看区块链的架构

3.1 比特币系统架构

根据上一节比特币系统的运行,我们大致可以知道比特币系统(区块链系统类似)的架构。

根据这些推断,我们可以得出比特币的大致架构如下:

3.2 以太坊系统架构

下图是从网络中找到的以太坊的架构图:

我们可以看到和比特币的架构图大体上差不多,主要是多了智能合约相关的内容。

3. 通常的区块链系统架构

其实从前面的比特币和以太坊架构,我们也可以推断出来,大部分区块链系统的架构都差不太多,尤其是现在常见的区块链系统,其架构都类似于以太坊的架构。有差别的主要在于共识模块、分布式账本的具体实现。

4 solana的原理

前面主要介绍了区块链的基础知识,再讲讲Solana的相关原理。具体内容可以参考这篇文章

5 推荐资料

参考资料💾

+ \ No newline at end of file diff --git a/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/index.html b/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/index.html index 838087ad2..fd39dc84f 100644 --- a/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/index.html +++ b/Solana-Co-Learn/module1/client-side-development/build-an-interaction-script/index.html @@ -5,13 +5,13 @@ 📝 构建一个互动脚本 | All in One Solana - +
-
Skip to main content

📝 构建一个互动脚本

你准备好与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软件包,请选择“是”。

接下来,只需导航到新创建的目录,并使用文本编辑器打开它:

cd solana-intro-client
code .

现在你可以开始你的Solana客户端开发之旅了!

⚙ 客户端脚本的设置

使用 create-solana-client 的好处在于,我们可以立即开始编写客户端代码!打开 index.ts,导入必要的依赖项,并添加这个 initializeKeypair 函数:

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('执行成功完成');
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('正在生成新密钥对... 🗝️');
const signer = Web3.Keypair.generate();

console.log('正在创建 .env 文件');
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("公钥:", signer.publicKey.toBase58());
}

你应该会在终端中看到类似的输出:

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

正在生成新密钥对... 🗝️
正在创建 .env 文件
公钥: jTAsqBrjsYp4uEJNmED5R66gHPnFW4wvQrbmFG3c4QS
执行成功完成

很好!如果你检查 .env 文件,你会发现一串字节格式的私钥!请注意保密此文件。如果你将此文件推送到公共的 GitHub 存储库,任何人都可以访问其中的资金,因此请确保不要用它处理真实的货币。

再次运行 npm start 会使用现有的私钥而不会创建新的。

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

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

看看这个超酷的空投功能。

async function airdropSolIfNeeded(
signer: Web3.Keypair,
connection: Web3.Connection
) {
// 检查余额
const balance = await connection.getBalance(signer.publicKey);
console.log('当前余额为', balance / Web3.LAMPORTS_PER_SOL, 'SOL');

// 如果余额少于 1 SOL,执行空投
if (balance / Web3.LAMPORTS_PER_SOL < 1) {
console.log('正在空投 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('新余额为', newBalance / Web3.LAMPORTS_PER_SOL, 'SOL');
}
}

这可能看得让人有些头大,但其实你对于这里正在发生的事情应该相当了解!我们正在借助我们熟悉的getBalance来查看我们的余额是否不足,如果不足,我们就会用requestAidrop函数来获取一些资金。

区块哈希和区块高度是识别区块的标识符,用以确保我们是最新的,也不会发送陈旧的交易。

不过,别试图反复运行它,因为水龙头有冷却时间,如果你不停地向它请求,请求将会失败。

在创建或获取密钥对之后,请确保更新initializeKeypair函数,以便调用空投。

// 当生成密钥对时
await airdropSolIfNeeded(signer, connection);

// 当从密钥解析时
await airdropSolIfNeeded(keypairFromSecret, connection);

现在,当你运行npm run start时,你将看到空投的情况:

当前余额为 0 SOL
正在空投 1 SOL
新的余额为 1 SOL
公共密钥: 7Fw3bXskk5eonycvET6BSufxAsuNudvuxF7MMnS8KMqX

我们已经准备好大展身手了,让我们一展拳脚吧 🥊!

🖱 调用链上程序

现在是时候让我们的客户端显示实力了。我们将在Solana网络上的现有程序中写入数据。有人可能会以为Solana的开发只和用Rust编写程序有关,其实不然!大部分区块链开发实际上与现有程序进行交互。

你可以构建数百个只与现有程序交互的应用,这就是真正有趣的地方!我们会让事情保持简单——我们的客户端会发送一个计数器程序,并递增计数器。这样你就能在网络上公告你是一名开发者了。

首先,我们需要告诉客户端它将与哪些程序交互。在导入语句下方的开头部分,添加这些地址:

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

PROGRAM_ID 是“ping”程序本身的地址。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设置为falseisWritable设置为true,因为该账户将被写入。

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

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

你刚刚将数据写入了区块链。感觉简单吗?

虽然看起来很简单,但你确实已经成功了。当推特上的人们都在热衷于猴子图片时,你正在构建真正有价值的东西。你在本节学到的内容——从Solana网络读取和写入数据——足以制作价值1万美元的产品。想象一下,当你完成这个项目时,你还能做些什么🤘!

🚢 挑战 - SOL转账脚本

既然我们一同学习了如何将交易发送到网络,现在是时候让你独立尝试了。

参照前一步骤的流程,从头开始创建一个脚本,让你能够在Devnet上从一个账户转移SOL到另一个账户。请确保打印交易签名,以便你可以在Solana Explorer上查看它。

回顾一下到目前为止你学到的东西:

  • 将数据写入网络是通过事务实现的
  • 交易需要指令
  • 指令向网络指示涉及哪些程序及其功能
  • SOL的转移是通过系统程序完成的(嗯,我在想这个过程叫什么名字。🤔 转移吗?)

你在这里需要做的就是找出准确的函数名称,以及指令应该是怎样的。你可以从Google开始查找:P

附注:如果你确定自己已经了解了这些内容,但转账仍然失败,那么问题可能是转账金额太少——尝试至少转账0.1 SOL

就像以往一样,在查看解决方案代码之前,尽量自己完成这个任务。当你真正需要参考解决方案时,请点击这里查看。👀

- +
Skip to main content

📝 构建一个互动脚本

你准备好与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软件包,请选择“是”。

接下来,只需导航到新创建的目录,并使用文本编辑器打开它:

cd solana-intro-client
code .

现在你可以开始你的Solana客户端开发之旅了!

⚙ 客户端脚本的设置

使用 create-solana-client 的好处在于,我们可以立即开始编写客户端代码!打开 index.ts,导入必要的依赖项,并添加这个 initializeKeypair 函数:

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('执行成功完成');
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('正在生成新密钥对... 🗝️');
const signer = Web3.Keypair.generate();

console.log('正在创建 .env 文件');
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("公钥:", signer.publicKey.toBase58());
}

你应该会在终端中看到类似的输出:

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

正在生成新密钥对... 🗝️
正在创建 .env 文件
公钥: jTAsqBrjsYp4uEJNmED5R66gHPnFW4wvQrbmFG3c4QS
执行成功完成

很好!如果你检查 .env 文件,你会发现一串字节格式的私钥!请注意保密此文件。如果你将此文件推送到公共的 GitHub 存储库,任何人都可以访问其中的资金,因此请确保不要用它处理真实的货币。

再次运行 npm start 会使用现有的私钥而不会创建新的。

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

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

看看这个超酷的空投功能。

async function airdropSolIfNeeded(
signer: Web3.Keypair,
connection: Web3.Connection
) {
// 检查余额
const balance = await connection.getBalance(signer.publicKey);
console.log('当前余额为', balance / Web3.LAMPORTS_PER_SOL, 'SOL');

// 如果余额少于 1 SOL,执行空投
if (balance / Web3.LAMPORTS_PER_SOL < 1) {
console.log('正在空投 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('新余额为', newBalance / Web3.LAMPORTS_PER_SOL, 'SOL');
}
}

这可能看得让人有些头大,但其实你对于这里正在发生的事情应该相当了解!我们正在借助我们熟悉的getBalance来查看我们的余额是否不足,如果不足,我们就会用requestAidrop函数来获取一些资金。

区块哈希和区块高度是识别区块的标识符,用以确保我们是最新的,也不会发送陈旧的交易。

不过,别试图反复运行它,因为水龙头有冷却时间,如果你不停地向它请求,请求将会失败。

在创建或获取密钥对之后,请确保更新initializeKeypair函数,以便调用空投。

// 当生成密钥对时
await airdropSolIfNeeded(signer, connection);

// 当从密钥解析时
await airdropSolIfNeeded(keypairFromSecret, connection);

现在,当你运行npm run start时,你将看到空投的情况:

当前余额为 0 SOL
正在空投 1 SOL
新的余额为 1 SOL
公共密钥: 7Fw3bXskk5eonycvET6BSufxAsuNudvuxF7MMnS8KMqX

我们已经准备好大展身手了,让我们一展拳脚吧 🥊!

🖱 调用链上程序

现在是时候让我们的客户端显示实力了。我们将在Solana网络上的现有程序中写入数据。有人可能会以为Solana的开发只和用Rust编写程序有关,其实不然!大部分区块链开发实际上与现有程序进行交互。

你可以构建数百个只与现有程序交互的应用,这就是真正有趣的地方!我们会让事情保持简单——我们的客户端会发送一个计数器程序,并递增计数器。这样你就能在网络上公告你是一名开发者了。

首先,我们需要告诉客户端它将与哪些程序交互。在导入语句下方的开头部分,添加这些地址:

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

PROGRAM_ID 是“ping”程序本身的地址。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设置为falseisWritable设置为true,因为该账户将被写入。

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

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

你刚刚将数据写入了区块链。感觉简单吗?

虽然看起来很简单,但你确实已经成功了。当推特上的人们都在热衷于猴子图片时,你正在构建真正有价值的东西。你在本节学到的内容——从Solana网络读取和写入数据——足以制作价值1万美元的产品。想象一下,当你完成这个项目时,你还能做些什么🤘!

🚢 挑战 - SOL转账脚本

既然我们一同学习了如何将交易发送到网络,现在是时候让你独立尝试了。

参照前一步骤的流程,从头开始创建一个脚本,让你能够在Devnet上从一个账户转移SOL到另一个账户。请确保打印交易签名,以便你可以在Solana Explorer上查看它。

回顾一下到目前为止你学到的东西:

  • 将数据写入网络是通过事务实现的
  • 交易需要指令
  • 指令向网络指示涉及哪些程序及其功能
  • SOL的转移是通过系统程序完成的(嗯,我在想这个过程叫什么名字。🤔 转移吗?)

你在这里需要做的就是找出准确的函数名称,以及指令应该是怎样的。你可以从Google开始查找:P

附注:如果你确定自己已经了解了这些内容,但转账仍然失败,那么问题可能是转账金额太少——尝试至少转账0.1 SOL

就像以往一样,在查看解决方案代码之前,尽量自己完成这个任务。当你真正需要参考解决方案时,请点击这里查看。👀

+ \ No newline at end of file diff --git a/Solana-Co-Learn/module1/client-side-development/index.html b/Solana-Co-Learn/module1/client-side-development/index.html index dc0a83c9d..241109cd6 100644 --- a/Solana-Co-Learn/module1/client-side-development/index.html +++ b/Solana-Co-Learn/module1/client-side-development/index.html @@ -5,13 +5,13 @@ 客户端开发 | All in One Solana - +
-
Skip to main content
- +
Skip to main content
+ \ No newline at end of file diff --git a/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/index.html b/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/index.html index ef8330000..8264acaae 100644 --- a/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/index.html +++ b/Solana-Co-Learn/module1/client-side-development/read-data-from-the-solana-network/index.html @@ -5,13 +5,13 @@ 从 Solana 🤓 区块链读取数据 | All in One Solana - +
-
Skip to main content

从 Solana 🤓 区块链读取数据

作为Solana开发者,这正是你学习之旅的起点。我们将从基础开始——从区块链中读取数据。

👜 Solana上的账户

Solana的字母表开始,我们有A代表账户。我们从账户开始,因为Solana上的智能合约(也称为“程序”)是无状态的——除了代码之外,它们不存储任何信息。一切都存储在账户中,所以账户对Solana来说至关重要。它们负责存储、合约和本地区块链程序的管理。

Solana 上有三种类型的账户:

  • 数据帐户 - 就是用来存储数据的!
  • 程序帐户 - 存储可执行程序(又称智能合约)的地方
  • 原生账户 - 用于核心区块链功能,例如权益和投票的账户

至于原生账户,是区块链运行所必需的,我们稍后会详细介绍。目前,我们只关注数据和程序账户。

在数据账户方面,还有两种进一步的类型:

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

我们很快会介绍这些具体是什么,现在请跟着一起学习。

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

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

我们现在只关注我们需要了解的部分,所以即使有些内容不那么清晰,也请勇往直前 - 我们将在学习过程中填补这些空白。

LamportSolana的最小单位,类似于以太坊的Gwei。一个Lamport等于0.000000001 SOL,所以这个字段告诉我们账户拥有多少SOL

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

executable 是一个布尔字段,表示该帐户是否包含可执行数据。至于数据,就是存储在帐户中的内容,至于租金,我们稍后会谈到!

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

📫 从网络中读取

好的,我们现在明白了什么是账户,那么如何读取它们呢?我们将借助一个名为 JSON RPC 终端点的工具!你可以通过下图了解,你将在 Solana 网络中充当客户端角色,尝试获取信息。

你可以通过调用 JSON RPCAPI来获取所需的内容,它会与网络沟通并返回你所需的数据。

假设我们要查询账户的余额,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)。

由于我们对一个非常简单的方法有大量的样板代码,我们可以使用SolanaWeb3.js SDK。以下是所需的代码:

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

这里有Solana RPC API 关于介绍如何使用getBalance文档

是不是很美观?我们仅用三行代码就能获取某人的Solana余额。试想一下,如果获取任何人的银行余额也能如此简单。

现在你已经了解了如何从Solana的账户中读取数据!虽然这看起来可能很简单,但只要使用这个函数,你就能查询Solana上任何账户的余额。试想一下,如果你能获取地球上任何银行账户的余额,这将是多么强大的能力。

🤑 构建一个余额获取器

现在是时候构建一个通用的余额查询器了(假设整个宇宙都在Solana上运行)。这将是一个简洁而强大的应用程序,能查询Solana上任何账户的余额。

首先,在你的工作空间中创建一个文件夹,比如放在桌面上。克隆起始库并按照以下步骤设置:

git clone https://github.com/CreatorsDAO/solana-intro-frontend
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 函数。首先,我们要将地址从字符串转换为公钥。记住,地址实际上并不是字符串,而是在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应用。真棒!继续加油!

🚢 挑战

现在,让我们通过一个小挑战来考验一下你所学的知识。从你刚刚完成的应用出发,你需要在用户界面中添加一项功能,显示输入的地址是否为可执行账户。

要判断一个账户是否可执行,你需要执行以下操作:

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

下面是一个可供测试的账户地址:ComputeBudget111111111111111111111111111111

请尽量自己尝试解决,不要提前查看答案!相信你会发现挑战其实并不复杂。

完成后,你可以在这里查看挑战解决方案的参考代码。

📚 更多关于账户相关的资源

- +
Skip to main content

从 Solana 🤓 区块链读取数据

作为Solana开发者,这正是你学习之旅的起点。我们将从基础开始——从区块链中读取数据。

👜 Solana上的账户

Solana的字母表开始,我们有A代表账户。我们从账户开始,因为Solana上的智能合约(也称为“程序”)是无状态的——除了代码之外,它们不存储任何信息。一切都存储在账户中,所以账户对Solana来说至关重要。它们负责存储、合约和本地区块链程序的管理。

Solana 上有三种类型的账户:

  • 数据帐户 - 就是用来存储数据的!
  • 程序帐户 - 存储可执行程序(又称智能合约)的地方
  • 原生账户 - 用于核心区块链功能,例如权益和投票的账户

至于原生账户,是区块链运行所必需的,我们稍后会详细介绍。目前,我们只关注数据和程序账户。

在数据账户方面,还有两种进一步的类型:

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

我们很快会介绍这些具体是什么,现在请跟着一起学习。

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

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

我们现在只关注我们需要了解的部分,所以即使有些内容不那么清晰,也请勇往直前 - 我们将在学习过程中填补这些空白。

LamportSolana的最小单位,类似于以太坊的Gwei。一个Lamport等于0.000000001 SOL,所以这个字段告诉我们账户拥有多少SOL

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

executable 是一个布尔字段,表示该帐户是否包含可执行数据。至于数据,就是存储在帐户中的内容,至于租金,我们稍后会谈到!

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

📫 从网络中读取

好的,我们现在明白了什么是账户,那么如何读取它们呢?我们将借助一个名为 JSON RPC 终端点的工具!你可以通过下图了解,你将在 Solana 网络中充当客户端角色,尝试获取信息。

你可以通过调用 JSON RPCAPI来获取所需的内容,它会与网络沟通并返回你所需的数据。

假设我们要查询账户的余额,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)。

由于我们对一个非常简单的方法有大量的样板代码,我们可以使用SolanaWeb3.js SDK。以下是所需的代码:

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

这里有Solana RPC API 关于介绍如何使用getBalance文档

是不是很美观?我们仅用三行代码就能获取某人的Solana余额。试想一下,如果获取任何人的银行余额也能如此简单。

现在你已经了解了如何从Solana的账户中读取数据!虽然这看起来可能很简单,但只要使用这个函数,你就能查询Solana上任何账户的余额。试想一下,如果你能获取地球上任何银行账户的余额,这将是多么强大的能力。

🤑 构建一个余额获取器

现在是时候构建一个通用的余额查询器了(假设整个宇宙都在Solana上运行)。这将是一个简洁而强大的应用程序,能查询Solana上任何账户的余额。

首先,在你的工作空间中创建一个文件夹,比如放在桌面上。克隆起始库并按照以下步骤设置:

git clone https://github.com/CreatorsDAO/solana-intro-frontend
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 函数。首先,我们要将地址从字符串转换为公钥。记住,地址实际上并不是字符串,而是在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应用。真棒!继续加油!

🚢 挑战

现在,让我们通过一个小挑战来考验一下你所学的知识。从你刚刚完成的应用出发,你需要在用户界面中添加一项功能,显示输入的地址是否为可执行账户。

要判断一个账户是否可执行,你需要执行以下操作:

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

下面是一个可供测试的账户地址:ComputeBudget111111111111111111111111111111

请尽量自己尝试解决,不要提前查看答案!相信你会发现挑战其实并不复杂。

完成后,你可以在这里查看挑战解决方案的参考代码。

📚 更多关于账户相关的资源

+ \ No newline at end of file diff --git a/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/index.html b/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/index.html index ff40791f1..4bb76661b 100644 --- a/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/index.html +++ b/Solana-Co-Learn/module1/client-side-development/write-data-to-the-blockchain/index.html @@ -5,13 +5,13 @@ ✍将数据写入区块链 | All in One Solana - +
-
Skip to main content

✍将数据写入区块链

我们已经熟练掌握了区块链的阅读操作,现在开始学习如何将数据写入Solana区块链。

🔐 密钥对

要将数据写入区块链,我们需要提交一笔交易,这就像是一条写入命令。如果不满足某些条件,该命令就会被拒绝。

要深入理解交易及其工作原理,你需要先了解密钥对。

密钥对包括一对密钥:

  • 一个公钥,公钥代表网络上的账户地址。
  • 一个私钥,每个公钥都与一个相应的私钥/秘密密钥配对。

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

// 创建一个新的密钥对
const ownerKeypair = Keypair.generate()

// 获取公钥(地址)
const publicKey = ownerKeypair.publicKey

// 获取私钥
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 变量来注入密钥。这里有一篇关于这方面的好文章。

// 以字节数组的形式私钥
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]
)

这里的内容涵盖了所有你需要了解的事项。

  • connection是我们通过JSON RPC与网络通信的方式;
  • transaction是我们刚刚使用转账指令创建的任务;
  • 最后一个参数是签名者的数组。这些密钥对就是“签署”事务的凭证,这样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({
// 这里我们只有一个键
keys: [
{
pubkey: programDataAccount,
isSigner: false,
isWritable: true
},
],

// 我们要互动的程序
programId

// 这里我们没有任何数据!
})

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

看,没那么难吧!我们搞定了:P

⛽ 交易费用

有一件事我们还没有讨论,那就是费用。Solana的交易费用非常低,以至于你几乎可以忽略它们!但可惜的是,作为开发者,我们还是必须关心这些费用的。Solana的费用机制与以太坊等EVM链相似。每当你提交一笔交易时,网络上总有人为其提供存储空间和处理能力。费用的存在就是为了激励人们提供这些资源。

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

当你在devnetLocalHost上进行开发时,你可以通过Solana的命令行界面(CLI)使用airdrop功能来获取devnet SOL。此外,你还可以通过SPL代币水龙头来获取SPL代币(稍后我们会了解这些是什么东西:P)。

- +
Skip to main content

✍将数据写入区块链

我们已经熟练掌握了区块链的阅读操作,现在开始学习如何将数据写入Solana区块链。

🔐 密钥对

要将数据写入区块链,我们需要提交一笔交易,这就像是一条写入命令。如果不满足某些条件,该命令就会被拒绝。

要深入理解交易及其工作原理,你需要先了解密钥对。

密钥对包括一对密钥:

  • 一个公钥,公钥代表网络上的账户地址。
  • 一个私钥,每个公钥都与一个相应的私钥/秘密密钥配对。

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

// 创建一个新的密钥对
const ownerKeypair = Keypair.generate()

// 获取公钥(地址)
const publicKey = ownerKeypair.publicKey

// 获取私钥
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 变量来注入密钥。这里有一篇关于这方面的好文章。

// 以字节数组的形式私钥
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]
)

这里的内容涵盖了所有你需要了解的事项。

  • connection是我们通过JSON RPC与网络通信的方式;
  • transaction是我们刚刚使用转账指令创建的任务;
  • 最后一个参数是签名者的数组。这些密钥对就是“签署”事务的凭证,这样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({
// 这里我们只有一个键
keys: [
{
pubkey: programDataAccount,
isSigner: false,
isWritable: true
},
],

// 我们要互动的程序
programId

// 这里我们没有任何数据!
})

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

看,没那么难吧!我们搞定了:P

⛽ 交易费用

有一件事我们还没有讨论,那就是费用。Solana的交易费用非常低,以至于你几乎可以忽略它们!但可惜的是,作为开发者,我们还是必须关心这些费用的。Solana的费用机制与以太坊等EVM链相似。每当你提交一笔交易时,网络上总有人为其提供存储空间和处理能力。费用的存在就是为了激励人们提供这些资源。

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

当你在devnetLocalHost上进行开发时,你可以通过Solana的命令行界面(CLI)使用airdrop功能来获取devnet SOL。此外,你还可以通过SPL代币水龙头来获取SPL代币(稍后我们会了解这些是什么东西:P)。

+ \ No newline at end of file diff --git a/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/index.html b/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/index.html index a614e7fb5..9d2047d82 100644 --- a/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/index.html +++ b/Solana-Co-Learn/module1/custom-instruction/build-a-movie-review-app/index.html @@ -5,14 +5,14 @@ 🎥 构建一个电影评论应用 | All in One Solana - +
Skip to main content

🎥 构建一个电影评论应用

现在我们已经完成了钱包连接的设置,是时候让我们的ping按钮发挥作用了!我们将整合所有元素,构建一个基于区块链的电影评论应用——它将允许任何人提交对他们最喜欢的电影的评论,有点像烂番茄网站那样。

Solana工作空间中设置初始代码

首先,你可以从GitHub克隆起始代码,并安装所需的依赖项:

git clone https://github.com/CreatorsDAO/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 函数。

通过这个项目,你将学习如何在Solana上构建真实世界的应用程序,把钱包集成、交易处理、和区块链数据管理结合在一起。

准备好了吗?让我们开始吧!

🗺 定义架构

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

安装 borsh

首先,你需要安装 borsh 库。在终端中运行以下命令:

npm install @project-serum/borsh --force

Movie.ts 中定义架构

接下来,前往 Movie.ts 文件,导入 borsh,然后在 Movie 类中添加架构。以下是你需要做的代码段:

// 引入borsh库
import * as borsh from '@project-serum/borsh'

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

// 构造函数和模拟将保持不变
constructor(title: string, rating: number, description: string) {}
static mocks: Movie[] = []

// 这里是我们的架构定义!
borshInstructionSchema = borsh.struct([
borsh.u8('variant'),
borsh.str('title'),
borsh.u8('rating'),
borsh.str('description'),
])
}

在电影评论程序中,我们期望指令数据包括:

  • variant:一个无符号的8位整数,表示要执行的指令(换句话说,应在程序上调用哪个函数)。
  • title:一个字符串,代表你正在评价的电影的标题。
  • rating:一个无符号的8位整数,表示你对正在评论的电影的评分(满分为5)。
  • description:一个字符串,表示你为电影留下的书面评论。

这个架构必须与程序所期望的完全匹配,包括结构中项目的顺序。当程序读取你的数据时,它将按照定义的顺序进行反序列化。如果你的顺序不同,它生成的数据将无效。由于我们使用的是已部署的程序,所以我已经为你提供了架构。通常,你会需要阅读文档或自己检查程序代码来了解这些细节。

🌭 创建序列化方法

我们已经知道数据的结构,现在需要编写一个方法将其序列化。在 Movie 类中的架构下方添加以下代码:

serialize(): Buffer {
const buffer = Buffer.alloc(1000) // 创建一个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('请连接你的钱包!')
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、可选的数据和它将从中读取或写入的账户列表。由于我们要将数据提交到网络上进行存储,我们将创建一个新的账户来存储它。

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

我们需要知道账户地址才能进行有效交易,但我们又需要处理交易才能创建账户。解决方案呢?理论上先有的蛋。如果交易创建者和程序都使用相同的过程来选择地址,我们就可以在交易处理之前确定地址。

这就是 web3.PublicKey.findProgramAddress 方法的功能。它接受种子和生成种子的程序两个变量。在我们的例子中,种子是发件人的地址和电影的标题。通常你需要通过阅读文档、查看程序代码或逆向工程来了解种子的要求。

完成 handleTransactionSubmit 功能的剩余部分就是创建指令并发送它。以下是完整代码:

const handleTransactionSubmit = async (movie: Movie) => {
if (!publicKey) {
alert('请连接你的钱包!')
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: [
{
// 你的帐户将支付费用,因此会写入网络
pubkey: publicKey,
isSigner: true,
isWritable: false,
},
{
// PDA将存储电影评论
pubkey: pda,
isSigner: false,
isWritable: true
},
{
// 系统程序将用于创建PDA
pubkey: web3.SystemProgram.programId,
isSigner: false,
isWritable: false
}
],
// 这是最重要的部分!
data: buffer,
programId: new web3.PublicKey(MOVIE_REVIEW_PROGRAM_ID)
})

transaction.add(instruction)

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

通过细致地阅读代码中的注释,你将理解为何我们在指令键数组中需要每一个地址。

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

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

给自己一个掌声,这可不是件容易的事情!到了这个阶段,可能有人已经放弃了这个项目。给他们一些鼓励,展示你所建立的成果!如果你已经坚持到了这一步,我相信你会一直坚持到最后 :)

本地部署 Movie Review 程序

这里Moview Review Program的程序: https://github.com/CreatorsDAO/movie-review-program

你需要在本地部署这个程序,然后才能在本地运行这个项目。

然后你还需要修改下前端代码的 MOVIE_REVIEW_PROGRAM_ID 常量,改成你本地部署的程序的地址。

这个commit : https://github.com/CreatorsDAO/solana-movie-frontend/commit/6451fcfb60ea5feba485a7d1d1cb882833329654#diff-70f76b2487583dcb8b512614274040921abaa29ab8b993b19a45140fdbe7b8c8R10 包含了你需要修改的两个地方,一个就是 program id ,还有一个是你需要将链接的 devnet 换成localhost网络。

🚢 挑战:Solana构建者的自我介绍

现在,是时候挑战你的思维能力了,让我们的大脑多折几道皱纹 🧠。 -我们的目标是继续创建一个应用程序,允许Solana Core中的构建者进行自我介绍。我们将会使用地址HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf上的Solana程序来实现这个目的。

caution

HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf 合约是devnent 上的一个测试合约。所以,运行你的 dapp 之前,保证你的 钱包和应用的网络设置均为 devnent。

最终,你的应用程序应该看起来与电影评论应用程序相似:

起始代码和设置

你可以通过以下命令设置项目:

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

提示与指导

程序预计将接收以下顺序的指令数据:

  1. variant 以无符号8位整数表示,用于指示要调用的指令(在本例中应为0)。
  2. name 以字符串形式表示名字。
  3. message 以字符串形式表示消息。

值得注意的是,程序将使用连接到钱包的公钥来生成每个学生的介绍账户。这意味着每个公钥只能初始化一个学生介绍账户,如果使用相同的公钥提交两次,则交易将失败。

自我挑战

与往常一样,首先请尝试独立完成此操作。如果你遇到困难,或者只是想将你的解决方案与我们的解决方案进行比较,请查看此存储库中的solution-serialize-instruction-data分支。

祝你好运,期待看到你的成果!

- +我们的目标是继续创建一个应用程序,允许Solana Core中的构建者进行自我介绍。我们将会使用地址HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf上的Solana程序来实现这个目的。

caution

HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf 合约是devnent 上的一个测试合约。所以,运行你的 dapp 之前,保证你的 钱包和应用的网络设置均为 devnent。

最终,你的应用程序应该看起来与电影评论应用程序相似:

起始代码和设置

你可以通过以下命令设置项目:

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

提示与指导

程序预计将接收以下顺序的指令数据:

  1. variant 以无符号8位整数表示,用于指示要调用的指令(在本例中应为0)。
  2. name 以字符串形式表示名字。
  3. message 以字符串形式表示消息。

值得注意的是,程序将使用连接到钱包的公钥来生成每个学生的介绍账户。这意味着每个公钥只能初始化一个学生介绍账户,如果使用相同的公钥提交两次,则交易将失败。

自我挑战

与往常一样,首先请尝试独立完成此操作。如果你遇到困难,或者只是想将你的解决方案与我们的解决方案进行比较,请查看此存储库中的solution-serialize-instruction-data分支。

祝你好运,期待看到你的成果!

+ \ No newline at end of file diff --git a/Solana-Co-Learn/module1/custom-instruction/custom-instructions/index.html b/Solana-Co-Learn/module1/custom-instruction/custom-instructions/index.html index 51bca1e6d..802288123 100644 --- a/Solana-Co-Learn/module1/custom-instruction/custom-instructions/index.html +++ b/Solana-Co-Learn/module1/custom-instruction/custom-instructions/index.html @@ -5,13 +5,13 @@ 🤔 自定义指令 | All in One Solana - +
-
Skip to main content

🤔 自定义指令

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

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

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

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

📧 指令数据

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

让我们退后一步,了解一下指令数据是如何放置的。

交易可以包含一个或多个指令,每个指令可以附带一些数据。

关于指令数据的关键在于其格式 - 它是8位数据。"位"是指它是机器码:108仅仅是指其大小,就像32位或64位一样。如果你的指令数据不符合这个格式,Solana运行时将无法识别它。

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

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

info

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

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

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

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

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

🔨 序列化和borsh

序列化就是将常规的代码或数据转换为字节数组(机器代码:10)的过程。

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

以装备一个链上游戏物品为例,我们需要以下三个数据:

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

将这些数据序列化包括以下四个步骤:

  1. 创建数据模式/映射,明确数据的预期结构。
  2. 分配一个比实际所需空间大得多的缓冲区。
  3. 将数据编码并添加到缓冲区中。
  4. 去掉缓冲区末端的额外空白。

作为网络开发人员,通常不需要处理这样的底层内容,下图可以让这个概念更具形象化:

下面的代码片段展示了如何使用Borsh库实现这一过程:

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

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

// 创建一个1000字节的缓冲区
const buffer = Buffer.alloc(1000)
equipPlayerSchema.encode({ variant: 2, playerId: 1435, itemId: 737498}, buffer)

// 截取缓冲区以达到所需的长度
const instructBuffer = buffer.slice(0, equipPlayerSchema.getSpan(buffer))

在这里,我们定义了一个包括三个无符号整数的Borsh结构,并将它们编码为一个字节缓冲区。图示解释了如何将这些数据分解为适当的长度,就像切香肠一样。

接下来的代码片段展示了如何构建和发送交易:

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

const transaction = new Transaction().add({
keys: [
{
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

如果你对机器码和内存分配不太了解,也不必担心。你不必深入学习,只需观看一两个相关视频,了解大致的概念即可。

现代开发人员很少直接处理字节缓冲区,因为这被认为是较低级别的工作。所以,如果你感觉这些内容陌生或新奇,也不必担心。通过实际应用,你将能更好地掌握这些概念,从而更接近真正的软件工程师的角色。😎

- +
Skip to main content

🤔 自定义指令

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

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

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

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

📧 指令数据

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

让我们退后一步,了解一下指令数据是如何放置的。

交易可以包含一个或多个指令,每个指令可以附带一些数据。

关于指令数据的关键在于其格式 - 它是8位数据。"位"是指它是机器码:108仅仅是指其大小,就像32位或64位一样。如果你的指令数据不符合这个格式,Solana运行时将无法识别它。

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

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

info

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

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

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

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

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

🔨 序列化和borsh

序列化就是将常规的代码或数据转换为字节数组(机器代码:10)的过程。

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

以装备一个链上游戏物品为例,我们需要以下三个数据:

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

将这些数据序列化包括以下四个步骤:

  1. 创建数据模式/映射,明确数据的预期结构。
  2. 分配一个比实际所需空间大得多的缓冲区。
  3. 将数据编码并添加到缓冲区中。
  4. 去掉缓冲区末端的额外空白。

作为网络开发人员,通常不需要处理这样的底层内容,下图可以让这个概念更具形象化:

下面的代码片段展示了如何使用Borsh库实现这一过程:

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

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

// 创建一个1000字节的缓冲区
const buffer = Buffer.alloc(1000)
equipPlayerSchema.encode({ variant: 2, playerId: 1435, itemId: 737498}, buffer)

// 截取缓冲区以达到所需的长度
const instructBuffer = buffer.slice(0, equipPlayerSchema.getSpan(buffer))

在这里,我们定义了一个包括三个无符号整数的Borsh结构,并将它们编码为一个字节缓冲区。图示解释了如何将这些数据分解为适当的长度,就像切香肠一样。

接下来的代码片段展示了如何构建和发送交易:

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

const transaction = new Transaction().add({
keys: [
{
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

如果你对机器码和内存分配不太了解,也不必担心。你不必深入学习,只需观看一两个相关视频,了解大致的概念即可。

现代开发人员很少直接处理字节缓冲区,因为这被认为是较低级别的工作。所以,如果你感觉这些内容陌生或新奇,也不必担心。通过实际应用,你将能更好地掌握这些概念,从而更接近真正的软件工程师的角色。😎

+ \ No newline at end of file diff --git a/Solana-Co-Learn/module1/custom-instruction/index.html b/Solana-Co-Learn/module1/custom-instruction/index.html index 098a8a8db..aa250d4d8 100644 --- a/Solana-Co-Learn/module1/custom-instruction/index.html +++ b/Solana-Co-Learn/module1/custom-instruction/index.html @@ -5,13 +5,13 @@ 自定义指令 | All in One Solana - +
-
Skip to main content
- +
Skip to main content
+ \ No newline at end of file diff --git a/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/index.html b/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/index.html index 8e4b1e3d5..07dbdcad2 100644 --- a/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/index.html +++ b/Solana-Co-Learn/module1/custom-instruction/run-it-back-deserialization/index.html @@ -5,13 +5,13 @@ 📡 Run is back - 反序列化 | All in One Solana - +
-
Skip to main content

📡 Run is back - 反序列化

现在我们已经完成了钱包连接的设置,是时候让我们的 ping 按钮真正起作用了!向网络账户写入数据只是任务的一半,另一半则是读取这些数据。在第一部分,我们借助Web3.js库中的内置函数来读取内容,这只适用于基础数据,如余额和交易详情。但正如我们在上一部分所见,所有精彩的东西都藏在 PDAs 里。

🧾 程序派生地址(Program Derived Addresses

账户是Solana的重要话题。如果你听过“账户”这个词,你可能听说过有人提到 PDAPDA 是Solana上用于存储数据的特殊类型账户。实际上,它们不被称为账户,而是称为地址,因为它们没有私钥,而只能由创建它们的程序控制。

caution

这里说了PDA是一种特殊类型的账户,但是它们不是真正的账户。它们只是一种特殊的地址,由程序控制,而不是私钥。这意味着它们不是真正的账户,因为它们没有私钥,因此无法对其进行签名。

普通的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
);

// 为每个用户存储单独计数器的示例
const [pda, bump] = await PublicKey.findProgramAddress(
[
publickey.toBuffer()
],
programId
);

// 创建链上笔记系统,每个用户都可以存储自己的笔记的示例
const [pda, bump] = await PublicKey.findProgramAddress(
[
publickey.toBuffer(),
Buffer.from("First Note")
],
programId
);

请注意,无论是你还是调用方都必须支付存储费用,并且每个账户有10兆字节的限制,所以要谨慎选择要放在链上的内容。

caution

每个数据账户的大小最大是10MB的大小。

🎢 反序列化

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

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

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

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

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

const 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/CreatorsDAO/solana-movie-frontend.git
cd solana-movie-frontend
git checkout solution-serialize-instruction-data
npm i

当你运行 npm run dev 时,你将看到一些模拟数据。与假冒的鞋子不同,假数据总是让人失望的。让我们在 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
}
}
}

就像序列化一样,我们定义了一个模式和一个方法。该架构包括:

  • initialized:一个布尔值,表示账户是否已初始化。
  • rating:无符号8位整数,代表评论者对电影的评分(满分5分)。
  • title:表示所评论电影的标题的字符串。
  • 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 端点完成。

caution

注意,这是一个非常消耗资源的端点。如果在大型程序上尝试,结果可能会非常庞大,甚至会引起问题。在现实世界中,你很少需要同时获取多个账户,所以现在不用担心。但你应该意识到,不应该对数据进行建模,使得 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 项。如果该账户有电影数据,那么这就会起作用!如果没有,电影将为空,我们可以返回累积的电影列表。

如果这看起来有些复杂,请逐行阅读代码,并确保你理解 reduce 方法是如何工作的。

确保你正在运行 npm run dev 并访问 localhost:3000,你应该会看到其他开发者添加的许多随机评论。😃

🚢 挑战

现在,我们已经能够序列化和反序列化数据了,不错吧?现在让我们回到序列化部分开始时的 "Student Intros" 应用程序。

目标:更新应用程序,以便能够获取并反序列化程序的帐户数据。支撑此功能的 Solana 程序地址是:HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf

你可以从上次挑战的地方继续,或者从此代码库开始。确保从 solution-serialize-instruction-data 分支开始。

提示:

  1. StudentIntro.ts 文件中创建帐户缓冲区布局。

    帐户数据应该包括:

    • initialized:一个布尔值,表示账户是否已初始化。
    • name:一个表示学生姓名的字符串。
    • message:一个表示学生分享的关于 Solana 旅程的消息的字符串。
  2. StudentIntro.ts 文件中创建一个静态方法,使用缓冲区布局将帐户数据缓冲区反序列化为 StudentIntro 对象。

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

解决方案代码:

像往常一样,首先尝试自己完成此挑战。但如果你陷入困境,或者只是想把你的解决方案与我们的解决方案进行对比,你可以在此代码库中查看 solution-deserialize-account-data 分支

祝你好运,开发者朋友!🚀

- +
Skip to main content

📡 Run is back - 反序列化

现在我们已经完成了钱包连接的设置,是时候让我们的 ping 按钮真正起作用了!向网络账户写入数据只是任务的一半,另一半则是读取这些数据。在第一部分,我们借助Web3.js库中的内置函数来读取内容,这只适用于基础数据,如余额和交易详情。但正如我们在上一部分所见,所有精彩的东西都藏在 PDAs 里。

🧾 程序派生地址(Program Derived Addresses

账户是Solana的重要话题。如果你听过“账户”这个词,你可能听说过有人提到 PDAPDA 是Solana上用于存储数据的特殊类型账户。实际上,它们不被称为账户,而是称为地址,因为它们没有私钥,而只能由创建它们的程序控制。

caution

这里说了PDA是一种特殊类型的账户,但是它们不是真正的账户。它们只是一种特殊的地址,由程序控制,而不是私钥。这意味着它们不是真正的账户,因为它们没有私钥,因此无法对其进行签名。

普通的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
);

// 为每个用户存储单独计数器的示例
const [pda, bump] = await PublicKey.findProgramAddress(
[
publickey.toBuffer()
],
programId
);

// 创建链上笔记系统,每个用户都可以存储自己的笔记的示例
const [pda, bump] = await PublicKey.findProgramAddress(
[
publickey.toBuffer(),
Buffer.from("First Note")
],
programId
);

请注意,无论是你还是调用方都必须支付存储费用,并且每个账户有10兆字节的限制,所以要谨慎选择要放在链上的内容。

caution

每个数据账户的大小最大是10MB的大小。

🎢 反序列化

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

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

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

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

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

const 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/CreatorsDAO/solana-movie-frontend.git
cd solana-movie-frontend
git checkout solution-serialize-instruction-data
npm i

当你运行 npm run dev 时,你将看到一些模拟数据。与假冒的鞋子不同,假数据总是让人失望的。让我们在 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
}
}
}

就像序列化一样,我们定义了一个模式和一个方法。该架构包括:

  • initialized:一个布尔值,表示账户是否已初始化。
  • rating:无符号8位整数,代表评论者对电影的评分(满分5分)。
  • title:表示所评论电影的标题的字符串。
  • 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 端点完成。

caution

注意,这是一个非常消耗资源的端点。如果在大型程序上尝试,结果可能会非常庞大,甚至会引起问题。在现实世界中,你很少需要同时获取多个账户,所以现在不用担心。但你应该意识到,不应该对数据进行建模,使得 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 项。如果该账户有电影数据,那么这就会起作用!如果没有,电影将为空,我们可以返回累积的电影列表。

如果这看起来有些复杂,请逐行阅读代码,并确保你理解 reduce 方法是如何工作的。

确保你正在运行 npm run dev 并访问 localhost:3000,你应该会看到其他开发者添加的许多随机评论。😃

🚢 挑战

现在,我们已经能够序列化和反序列化数据了,不错吧?现在让我们回到序列化部分开始时的 "Student Intros" 应用程序。

目标:更新应用程序,以便能够获取并反序列化程序的帐户数据。支撑此功能的 Solana 程序地址是:HdE95RSVsdb315jfJtaykXhXY478h53X6okDupVfY9yf

你可以从上次挑战的地方继续,或者从此代码库开始。确保从 solution-serialize-instruction-data 分支开始。

提示:

  1. StudentIntro.ts 文件中创建帐户缓冲区布局。

    帐户数据应该包括:

    • initialized:一个布尔值,表示账户是否已初始化。
    • name:一个表示学生姓名的字符串。
    • message:一个表示学生分享的关于 Solana 旅程的消息的字符串。
  2. StudentIntro.ts 文件中创建一个静态方法,使用缓冲区布局将帐户数据缓冲区反序列化为 StudentIntro 对象。

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

解决方案代码:

像往常一样,首先尝试自己完成此挑战。但如果你陷入困境,或者只是想把你的解决方案与我们的解决方案进行对比,你可以在此代码库中查看 solution-deserialize-account-data 分支

祝你好运,开发者朋友!🚀

+ \ No newline at end of file diff --git a/Solana-Co-Learn/module1/index.html b/Solana-Co-Learn/module1/index.html index e8dd9594c..57a7a079e 100644 --- a/Solana-Co-Learn/module1/index.html +++ b/Solana-Co-Learn/module1/index.html @@ -5,13 +5,13 @@ Solana 基础 (与Solana网络通过rpc交互) | All in One Solana - +
-
Skip to main content
- +
Skip to main content
+ \ No newline at end of file diff --git a/Solana-Co-Learn/module1/local_program_development/anchor_program_hello/index.html b/Solana-Co-Learn/module1/local_program_development/anchor_program_hello/index.html index e32b7f14b..a102cceb5 100644 --- a/Solana-Co-Learn/module1/local_program_development/anchor_program_hello/index.html +++ b/Solana-Co-Learn/module1/local_program_development/anchor_program_hello/index.html @@ -5,13 +5,13 @@ Anchor 合约框架实现 - hello, World 🌍 With PDA | All in One Solana - +
-
Skip to main content

Anchor 合约框架实现 - hello, World 🌍 With PDA

让我们通过构建和部署 Hello World! 程序来进行练习。

我们将在本地完成所有操作,包括部署到本地测试验证器。在开始之前,请确保你已经安装了RustSolana CLI。如果你还没有安装,请参考概述中的说明进行设置。

0. 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。当程序被调用时,该程序会将传入的数据保存到数据存储账户中去也就是下面的HelloWorld账户。

use anchor_lang::prelude::*;

declare_id!("22sSSi7GtQgwXFcjJmGNNKSCLEsiJxyYLFfP3CMWeMLj");

#[program]
pub mod hello_world {
use super::*;

pub fn initialize(ctx: Context<Initialize>, data: String) -> Result<()> {

msg!("{}", data);

*ctx.accounts.hello_world = HelloWorld {
authority: *ctx.accounts.authority.key,
data,
};

Ok(())
}

pub fn update(ctx: Context<UpdateHelloWorld>, data: String) -> Result<()> {
ctx.accounts.hello_world.data = data;
msg!("{}", ctx.accounts.hello_world.data);
Ok(())
}
}

#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(
init,
payer = authority,
space = 8 + HelloWorld::INIT_SPACE,
seeds = [b"hello-world"],
bump
)]
pub hello_world: Account<'info, HelloWorld>,
#[account(mut)]
pub authority: Signer<'info>,
pub system_program: Program<'info, System>,
}

#[derive(Accounts)]
pub struct UpdateHelloWorld<'info> {
#[account(
mut,
seeds = [b"hello-world"],
bump
)]
pub hello_world: Account<'info, HelloWorld>,
#[account(mut)]
pub authority: Signer<'info>,
}

#[account]
#[derive(InitSpace)]
pub struct HelloWorld {
pub authority: Pubkey,
#[max_len(100)]
pub data: String,
}

#[error_code]
pub enum ErrorCode {
#[msg("You are not authorized to perform this action.")]
Unauthorized,
#[msg("Cannot get the bump.")]
CannotGetBump,
}

下面这是一个本地的测试脚本文件,用来调用上面的合约程序。

import * as anchor from "@coral-xyz/anchor";
import { Program } from "@coral-xyz/anchor";
import { HelloWorld } from "../target/types/hello_world";

describe("hello-world", () => {
let provider = anchor.AnchorProvider.env();
// Configure the client to use the local cluster.
anchor.setProvider(provider);

const program = anchor.workspace.HelloWorld as Program<HelloWorld>;

const authority = provider.wallet.publicKey;

let [helloWorld] = anchor.web3.PublicKey.findProgramAddressSync(
[Buffer.from("hello-world")],
program.programId
);

it("Is initialized!", async () => {
// Add your test here.
const tx = await program.methods.initialize("Hello World!").accounts({
helloWorld,
authority,
systemProgram: anchor.web3.SystemProgram.programId,
}).rpc();

console.log("tx signature: ", tx);

// Fetch the state struct from the network.
const accountState = await program.account.helloWorld.fetch(helloWorld);
console.log("account state: ", accountState);

});

it("get hello world!", async () => {

// Add your test here.
const tx = await program.methods.update("Davirain").accounts({
helloWorld,
}).rpc();

console.log("tx signature: ", tx);


// Fetch the state struct from the network.
const accountState = await program.account.helloWorld.fetch(helloWorld);
console.log("account state: ", accountState);
});


it("read account name", async () => {

// Fetch the state struct from the network.
const accountState = await program.account.helloWorld.fetch(helloWorld);
console.log("account state: ", accountState);
});
});

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
caution

这里一定要注意⚠️,solana-test-validator 这个命令启动的是solana的本地测试验证器。

4. 构建和部署

我们现在准备好构建和部署我们的程序了。通过运行 anchor build 命令来构建程序。

anchor build

现在让我们部署我们的程序。

anchor deploy

Solana程序部署将输出你的程序的程序ID。你现在可以在Solana Explorer上查找已部署的程序(对于localhost,请选择“自定义RPC URL”作为集群)。

5. 查看程序日志

在我们调用程序之前,打开一个单独的终端并运行solana logs命令。这将允许我们在终端中查看程序日志。

solana logs <PROGRAM_ID>

或者也可以通过Solana Exporer,查看产生的日志📔。

在测试验证器仍在运行时,尝试使用此处的客户端脚本调用你的程序。

这将返回一个Solana Explorer的URL(Transaction https://explorer.solana.com/tx/${transactionSignature}?cluster=custom)。将URL复制到浏览器中,在Solana Explorer上查找该交易,并检查程序日志中是否打印了Hello, world!。或者,你可以在运行solana logs命令的终端中查看程序日志。

就是这样!你刚刚在本地开发环境中创建并部署了你的第一个程序。

- +
Skip to main content

Anchor 合约框架实现 - hello, World 🌍 With PDA

让我们通过构建和部署 Hello World! 程序来进行练习。

我们将在本地完成所有操作,包括部署到本地测试验证器。在开始之前,请确保你已经安装了RustSolana CLI。如果你还没有安装,请参考概述中的说明进行设置。

0. 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。当程序被调用时,该程序会将传入的数据保存到数据存储账户中去也就是下面的HelloWorld账户。

use anchor_lang::prelude::*;

declare_id!("22sSSi7GtQgwXFcjJmGNNKSCLEsiJxyYLFfP3CMWeMLj");

#[program]
pub mod hello_world {
use super::*;

pub fn initialize(ctx: Context<Initialize>, data: String) -> Result<()> {

msg!("{}", data);

*ctx.accounts.hello_world = HelloWorld {
authority: *ctx.accounts.authority.key,
data,
};

Ok(())
}

pub fn update(ctx: Context<UpdateHelloWorld>, data: String) -> Result<()> {
ctx.accounts.hello_world.data = data;
msg!("{}", ctx.accounts.hello_world.data);
Ok(())
}
}

#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(
init,
payer = authority,
space = 8 + HelloWorld::INIT_SPACE,
seeds = [b"hello-world"],
bump
)]
pub hello_world: Account<'info, HelloWorld>,
#[account(mut)]
pub authority: Signer<'info>,
pub system_program: Program<'info, System>,
}

#[derive(Accounts)]
pub struct UpdateHelloWorld<'info> {
#[account(
mut,
seeds = [b"hello-world"],
bump
)]
pub hello_world: Account<'info, HelloWorld>,
#[account(mut)]
pub authority: Signer<'info>,
}

#[account]
#[derive(InitSpace)]
pub struct HelloWorld {
pub authority: Pubkey,
#[max_len(100)]
pub data: String,
}

#[error_code]
pub enum ErrorCode {
#[msg("You are not authorized to perform this action.")]
Unauthorized,
#[msg("Cannot get the bump.")]
CannotGetBump,
}

下面这是一个本地的测试脚本文件,用来调用上面的合约程序。

import * as anchor from "@coral-xyz/anchor";
import { Program } from "@coral-xyz/anchor";
import { HelloWorld } from "../target/types/hello_world";

describe("hello-world", () => {
let provider = anchor.AnchorProvider.env();
// Configure the client to use the local cluster.
anchor.setProvider(provider);

const program = anchor.workspace.HelloWorld as Program<HelloWorld>;

const authority = provider.wallet.publicKey;

let [helloWorld] = anchor.web3.PublicKey.findProgramAddressSync(
[Buffer.from("hello-world")],
program.programId
);

it("Is initialized!", async () => {
// Add your test here.
const tx = await program.methods.initialize("Hello World!").accounts({
helloWorld,
authority,
systemProgram: anchor.web3.SystemProgram.programId,
}).rpc();

console.log("tx signature: ", tx);

// Fetch the state struct from the network.
const accountState = await program.account.helloWorld.fetch(helloWorld);
console.log("account state: ", accountState);

});

it("get hello world!", async () => {

// Add your test here.
const tx = await program.methods.update("Davirain").accounts({
helloWorld,
}).rpc();

console.log("tx signature: ", tx);


// Fetch the state struct from the network.
const accountState = await program.account.helloWorld.fetch(helloWorld);
console.log("account state: ", accountState);
});


it("read account name", async () => {

// Fetch the state struct from the network.
const accountState = await program.account.helloWorld.fetch(helloWorld);
console.log("account state: ", accountState);
});
});

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
caution

这里一定要注意⚠️,solana-test-validator 这个命令启动的是solana的本地测试验证器。

4. 构建和部署

我们现在准备好构建和部署我们的程序了。通过运行 anchor build 命令来构建程序。

anchor build

现在让我们部署我们的程序。

anchor deploy

Solana程序部署将输出你的程序的程序ID。你现在可以在Solana Explorer上查找已部署的程序(对于localhost,请选择“自定义RPC URL”作为集群)。

5. 查看程序日志

在我们调用程序之前,打开一个单独的终端并运行solana logs命令。这将允许我们在终端中查看程序日志。

solana logs <PROGRAM_ID>

或者也可以通过Solana Exporer,查看产生的日志📔。

在测试验证器仍在运行时,尝试使用此处的客户端脚本调用你的程序。

这将返回一个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/Solana-Co-Learn/module1/local_program_development/index.html b/Solana-Co-Learn/module1/local_program_development/index.html index ae385c699..7571692f1 100644 --- a/Solana-Co-Learn/module1/local_program_development/index.html +++ b/Solana-Co-Learn/module1/local_program_development/index.html @@ -5,15 +5,15 @@ 本地开发环境配置 | All in One Solana - +
Skip to main content

本地开发环境配置

概述

本地开发的基本流程如下

  1. 安装 RustSolana CLI
  2. 使用Solana CLI,你可以使用solana-test-validator命令运行本地测试验证器,初始化账户等基本操作
  3. 使用 cargo build-sbfsolana program deploy 命令在本地构建和部署程序
  4. 使用 solana logs 命令查看程序日志

本地环境配置

Solana Program 使用Rust 编写,调试运行。建议使用Unix 系列系统: Mac , Linux 等。 如果很不幸你使用的是Windows,建议使用 WSL 下载Ubuntu ,并在其中完成运行。

在Windows上设置(带有Linux)

下载Windows子系统Linux(WSL)

如果你使用的是Windows电脑,建议使用Windows子系统Linux(WSL)来构建你的Solana程序。

打开管理员权限的PowerShellWindows命令提示符,检查Windows版本

winver

如果你使用的是Windows 10版本2004及更高版本(Build 19041及更高版本)或Windows 11,请运行以下命令。

wsl --install

如果你正在使用较旧版本的Windows,请按照这里的说明进行操作。

你可以在这里阅读更多关于安装WSL的信息。

下载Ubuntu

接下来,在这里下载UbuntuUbuntu提供了一个终端,可以让你在Windows电脑上运行Linux。这就是你将运行Solana CLI命令的地方。

下载 Rust(适用于 WSL)

接下来,打开Ubuntu终端并使用以下命令下载适用于WSLRust。你可以在此处阅读有关下载Rust的更多信息。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

下载 Solana CLI

现在我们准备下载适用于LinuxSolana CLI。请在Ubuntu终端中运行以下命令。你可以在此处阅读有关下载Solana CLI的更多信息。

sh -c "$(curl -sSfL https://release.solana.com/v1.16.10/install)"

在 macOS 上进行设置

下载 Rust

首先,按照这里的说明下载Rust

下载Solana CLI

接下来,在终端中运行以下命令下载Solana CLI

sh -c "$(curl -sSfL https://release.solana.com/v1.16.10/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

caution

由于某些你知道的原因,devnet 或者 mainnet 可能访问不佳。建议开发过程中使用 localhost 网络。最后需要部署应用的使用,建议使用 quicknode 的rpc 节点。

同样地,你可以使用solana config set --keypair命令来更改密钥对路径。当运行命令时,Solana CLI将使用指定路径下的密钥对。

solana config set --keypair ~/<FILE_PATH>

测试验证器

你会发现在测试和调试时运行本地验证器比部署到开发网络更有帮助。

你可以使用solana-test-validator命令运行本地测试验证器。该命令会创建一个持续运行的进程,需要单独的命令行窗口。

Stream program logs

通常在打开一个新的控制台并在测试验证器旁边运行solana logs命令会很有帮助。这将创建另一个持续进行的进程,用于流式传输与你配置的集群相关的日志。

如果你的CLI配置指向本地主机,则日志将始终与你创建的测试验证器相关联,但你也可以从其他集群(如DevnetMainnet Beta)流式传输日志。当从其他集群流式传输日志时,你需要在命令中包含一个程序ID,以限制你所看到的日志仅针对你的特定程序。

密钥相关

你可以使用solana-keygen new --outfile命令生成一个新的密钥对,并指定文件路径以存储该密钥对。

solana-keygen new --outfile ~/<FILE_PATH>

有时候你可能需要检查你的配置指向哪个密钥对。要查看当前在solana config中设置的密钥对的公钥,请使用solana address命令。

solana address

要查看在Solana配置中设置的当前密钥对的SOL余额,请使用solana balance命令。

solana balance

要在Devnetlocalhost上进行SOL的空投,请使用solana airdrop命令。请注意,在Devnet上,每次空投限制为2个SOL。

solana airdrop 2

在你开发和测试本地环境中的程序时,很可能会遇到由以下原因引起的错误:

  • 使用错误的密钥对
  • 没有足够的SOL来部署你的程序或执行交易
  • 指向错误的集群

到目前为止,我们已经介绍了一些CLI命令,这些命令应该能帮助你快速解决那些问题。

hello world 程序

挑战

现在轮到你独立构建一些东西了。尝试创建一个新的程序,将你自己的消息打印到程序日志中。这次将你的程序部署到Devnet而不是本地主机。

记得使用solana config set --url命令将你的RPC URL更新为Devnet

只要你将连接和Solana ExplorerURL更新为指向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

官方参考文档

- +
  • Solang solidity合约实现 - hello, World
  • 挑战

    现在轮到你独立构建一些东西了。尝试创建一个新的程序,将你自己的消息打印到程序日志中。这次将你的程序部署到Devnet而不是本地主机。

    记得使用solana config set --url命令将你的RPC URL更新为Devnet

    只要你将连接和Solana ExplorerURL更新为指向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/Solana-Co-Learn/module1/local_program_development/native_program_hello/index.html b/Solana-Co-Learn/module1/local_program_development/native_program_hello/index.html index 7a37ec5d7..93aac8f2b 100644 --- a/Solana-Co-Learn/module1/local_program_development/native_program_hello/index.html +++ b/Solana-Co-Learn/module1/local_program_development/native_program_hello/index.html @@ -5,13 +5,13 @@ Native Solana合约实现 - hello, World | All in One Solana - +
    -
    Skip to main content

    Native Solana合约实现 - hello, World

    让我们通过构建和部署 Hello World! 程序来进行练习。

    我们将在本地完成所有操作,包括部署到本地测试验证器。在开始之前,请确保你已经安装了RustSolana CLI。如果你还没有安装,请参考概述中的说明进行设置。

    1. 创建一个新的Rust项目

    让我们从创建一个新的Rust项目开始。运行下面的cargo new --lib命令。随意用你自己的目录名替换它。

    cargo new --lib solana-hello-world-local

    记得更新 Cargo.toml 文件,将 solana-program 添加为依赖项,并检查 crate-type 是否已经存在。

    这里的solana-program 可以通过在命令行执行cargo add solana-program添加到依赖管理的配置文件中。

    [package]
    name = "solana-hello-world-local"
    version = "0.1.0"
    edition = "2021"

    [dependencies]
    solana-program = "1.16.10"

    [lib]
    crate-type = ["cdylib", "lib"]
    caution

    需要注意这里的solana-program的版本,不要直接copy这个Cargo.toml的配置,因为solana-program的版本也是在更新的,可能以后直接使用这里的会出问题。建议使用cargo add solana-program添加。

    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
    caution

    这里一定要注意⚠️,solana-test-validator 这个命令启动的是solana的本地测试验证器。

    4. 构建和部署

    我们现在准备好构建和部署我们的程序了。通过运行 cargo build-sbf 命令来构建程序。

    cargo build-sbf

    现在让我们部署我们的程序。部署从cargo build-sbf命令的输出target/deploy/*.so文件。

    ls --tree target/ --depth 2
     target
    ├──  .rustc_info.json
    ├──  CACHEDIR.TAG
    ├──  debug
    │ ├──  .cargo-lock
    │ ├──  .fingerprint
    │ ├──  build
    │ ├──  deps
    │ ├──  examples
    │ └──  incremental
    ├──  deploy
    │ ├──  solana_hello_world_local-keypair.json
    │ └──  solana_hello_world_local.so
    ├──  release
    │ ├──  .cargo-lock
    │ ├──  .fingerprint
    │ ├──  build
    │ ├──  deps
    │ ├──  examples
    │ └──  incremental
    └──  sbf-solana-solana
    ├──  CACHEDIR.TAG
    └──  release

    这里的Path 是上面的target/deploy/*.so文件的路径。运行solana program deploy命令来部署你的程序。

    solana program deploy <PATH>

    Solana程序部署将输出你的程序的程序ID。你现在可以在Solana Explorer上查找已部署的程序(对于Localhost,请选择“自定义RPC URL”作为集群)。

    5. 查看程序日志

    在我们调用程序之前,打开一个单独的终端并运行solana logs命令。这将允许我们在终端中查看程序日志。

    solana logs <PROGRAM_ID>

    在测试验证器仍在运行时,尝试使用此处的客户端脚本调用你的程序。

    index.ts中用刚刚部署的PROGRAM ID替换掉原来的PROGRAM ID,然后运行npm install,接着运行npm start。这将返回一个Solana ExplorerURL。将URL复制到浏览器中,在Solana Explorer上查找该交易,并检查程序日志中是否打印了Hello, world!。或者,你可以在运行solana logs命令的终端中查看程序日志。

    就是这样!你刚刚在本地开发环境中创建并部署了你的第一个程序。

    - +
    Skip to main content

    Native Solana合约实现 - hello, World

    让我们通过构建和部署 Hello World! 程序来进行练习。

    我们将在本地完成所有操作,包括部署到本地测试验证器。在开始之前,请确保你已经安装了RustSolana CLI。如果你还没有安装,请参考概述中的说明进行设置。

    1. 创建一个新的Rust项目

    让我们从创建一个新的Rust项目开始。运行下面的cargo new --lib命令。随意用你自己的目录名替换它。

    cargo new --lib solana-hello-world-local

    记得更新 Cargo.toml 文件,将 solana-program 添加为依赖项,并检查 crate-type 是否已经存在。

    这里的solana-program 可以通过在命令行执行cargo add solana-program添加到依赖管理的配置文件中。

    [package]
    name = "solana-hello-world-local"
    version = "0.1.0"
    edition = "2021"

    [dependencies]
    solana-program = "1.16.10"

    [lib]
    crate-type = ["cdylib", "lib"]
    caution

    需要注意这里的solana-program的版本,不要直接copy这个Cargo.toml的配置,因为solana-program的版本也是在更新的,可能以后直接使用这里的会出问题。建议使用cargo add solana-program添加。

    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
    caution

    这里一定要注意⚠️,solana-test-validator 这个命令启动的是solana的本地测试验证器。

    4. 构建和部署

    我们现在准备好构建和部署我们的程序了。通过运行 cargo build-sbf 命令来构建程序。

    cargo build-sbf

    现在让我们部署我们的程序。部署从cargo build-sbf命令的输出target/deploy/*.so文件。

    ls --tree target/ --depth 2
     target
    ├──  .rustc_info.json
    ├──  CACHEDIR.TAG
    ├──  debug
    │ ├──  .cargo-lock
    │ ├──  .fingerprint
    │ ├──  build
    │ ├──  deps
    │ ├──  examples
    │ └──  incremental
    ├──  deploy
    │ ├──  solana_hello_world_local-keypair.json
    │ └──  solana_hello_world_local.so
    ├──  release
    │ ├──  .cargo-lock
    │ ├──  .fingerprint
    │ ├──  build
    │ ├──  deps
    │ ├──  examples
    │ └──  incremental
    └──  sbf-solana-solana
    ├──  CACHEDIR.TAG
    └──  release

    这里的Path 是上面的target/deploy/*.so文件的路径。运行solana program deploy命令来部署你的程序。

    solana program deploy <PATH>

    Solana程序部署将输出你的程序的程序ID。你现在可以在Solana Explorer上查找已部署的程序(对于Localhost,请选择“自定义RPC URL”作为集群)。

    5. 查看程序日志

    在我们调用程序之前,打开一个单独的终端并运行solana logs命令。这将允许我们在终端中查看程序日志。

    solana logs <PROGRAM_ID>

    在测试验证器仍在运行时,尝试使用此处的客户端脚本调用你的程序。

    index.ts中用刚刚部署的PROGRAM ID替换掉原来的PROGRAM ID,然后运行npm install,接着运行npm start。这将返回一个Solana ExplorerURL。将URL复制到浏览器中,在Solana Explorer上查找该交易,并检查程序日志中是否打印了Hello, world!。或者,你可以在运行solana logs命令的终端中查看程序日志。

    就是这样!你刚刚在本地开发环境中创建并部署了你的第一个程序。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module1/local_program_development/solang_program_hello/index.html b/Solana-Co-Learn/module1/local_program_development/solang_program_hello/index.html index 50bb23c46..5dbf9b1b1 100644 --- a/Solana-Co-Learn/module1/local_program_development/solang_program_hello/index.html +++ b/Solana-Co-Learn/module1/local_program_development/solang_program_hello/index.html @@ -5,14 +5,14 @@ Solang solidity合约实现 - hello, World | All in One Solana - +
    Skip to main content

    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框架AnchorSolana生态系统中广泛使用的框架,可以简化构建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 CLIAnchor,你可以使用以下命令创建一个新项目:

    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 存储库。你将在 basicstokens 部分找到适用于常见Solana用例的Solang实现。

    如果你有问题,请随时在Solana Stack exchange上发布。如果你有关于Solang维护者的问题,可以直接在Hyperledger Foundationdiscord上联系他们。

    玩得开心,尽情建造吧!

    - +在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程序之间的一个重要区别在于它们如何存储“状态”变量/数据:

    在这个例子中,当合约部署时,它被部署到 @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 命令执行以下任务:

    接下来应该在控制台中显示以下输出:

    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 存储库。你将在 basicstokens 部分找到适用于常见Solana用例的Solang实现。

    如果你有问题,请随时在Solana Stack exchange上发布。如果你有关于Solang维护者的问题,可以直接在Hyperledger Foundationdiscord上联系他们。

    玩得开心,尽情建造吧!

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/index.html b/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/index.html index 70166ce6c..26625a1f6 100644 --- a/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/index.html +++ b/Solana-Co-Learn/module1/start-your-own-custom-project/build-an-nft-minter-front-end/index.html @@ -5,13 +5,13 @@ 💻 构建 NFT 铸造者前端 | All in One Solana - +
    -
    Skip to main content

    💻 构建 NFT 铸造者前端

    欢迎来到第一周的挑战环节。每周,你都会有一个特定的部分,用来将你所学的内容应用到自定义的NFT质押应用程序上,并且还有战利品箱子等你拿!

    这些部分的核心目的是鼓励你走出本地开发环境,构建真实的、可以供他人使用的项目。许多成功的构建者都是通过在公众面前展示和开发他们的作品而获得成功的。这是你一直在准备的时刻——让我们开始吧🤘。

    今天,我们要开始从前端制作那些炫酷的登录和铸造页面。

    在第一个屏幕上,唯一的功能是连接到用户的钱包。你可以通过屏幕顶部的按钮或中间的按钮来实现。

    第二个屏幕的功能将在下一个核心项目中实现,所以不必为“mint buildoor”按钮实现任何功能。

    🕸 项目设置

    我们将从零开始,没有模板!设置一个新的 Next.js 应用程序,并向其中添加 Chakra UI

    npx create-next-app <you-project-name> --typescript

    cd <you-project-name>

    npm i @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^10 @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,请确认安装。你可以为你的应用程序取任何你想要的名字,比如我就给我的应用程序命名为“buildoor”。

    下一步,你可能想添加一些视觉素材。你可以在这里找到资源包,也可以自己创建。包里有五个“头像”文件和一个背景的svg文件。请将它们放入项目的public文件夹中。

    现在,一切准备就绪,让我们开始构建吧!🚀

    ✨ 配置 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">
    { /* 导航栏 */ }

    <Spacer />
    <Center>
    { /* 如果已连接,则显示第二个视图,否则显示第一个视图 */ }
    </Center>
    <Spacer />

    <Center>
    <Box marginBottom={4} color="white">
    <a
    href="https://twitter.com/_buildspace"
    target="_blank"
    rel="noopener noreferrer"
    >
    @_buildspace 一同打造
    </a>
    </Box>
    </Center>
    </Stack>
    </Box>
    </div>
    )
    }

    export default Home

    这段代码设置了应用程序的主页面,并使用了Chakra UI的一些组件来简化布局和样式。现在,你的前端页面应该已经具备了基本的结构和风格,接下来你可以继续添加更多的功能和内容!🎨

    🎫 添加导航栏

    现在让我们构建导航栏(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

    这是必需的,因为 NextJS 是服务器端渲染的,在客户端加载之前无法访问依赖于浏览器 API(例如 window)的外部依赖项或组件。

    因此,通过 { ssr: false },我们禁用了导入的服务器渲染。关于动态导入的更多信息,你可以在这里阅读。

    现在返回到 index.tsx 文件,导入 NavBar 并将其放在堆栈的顶部(我已留下评论说明它应该放在哪里):

    // 现有的导入
    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 />

    // 其余的文件保持不变

    至此,除了“连接钱包(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"
    >
    打造你的 buildoor。赚取 $BLD。升级。
    </Heading>
    <Button
    bgColor="accent"
    color="white"
    maxW="380px"
    onClick={handleClick}
    >
    <HStack>
    <Text>成为 buildoor</Text>
    <ArrowForwardIcon />
    </HStack>
    </Button>
    </VStack>
    </Container>
    )
    }

    export default Disconnected

    这将是我们的登录页面 - 用户首次访问网站时会看到的视图。你需要将其导入到 index.tsx 中,并将其放置在渲染组件的中间位置(你可以再次查找相应的注释来找到正确的位置)。

    // 现有的导入
    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 />

    // 其余的文件保持不变

    现在,如果你访问 localhost:3000,你应该会看到一个带有“成为 buildoor”按钮的登录页面。如果你点击它,目前什么也不会发生。这显然不是我们想要的,所以接下来我们要处理这个问题!让我们继续!

    🔌 连接到用户的钱包

    这一部分中,我们将连接到用户的钱包,确保你的应用可以与用户的钱包互动。

    首先,我们需要安装一些必要的依赖包:

    npm install @solana/wallet-adapter-base \
    @solana/wallet-adapter-react \
    @solana/wallet-adapter-react-ui \
    @solana/wallet-adapter-wallets \
    @solana/web3.js

    这些库将帮助我们与用户的Solana钱包连接。

    如果你要为特定钱包构建,你可以在这里自定义设置。这里我们只是使用默认配置。

    components 文件夹中,创建一个名为 WalletContextProvider.tsx 的文件,我们将在其中放置所有这些配置:

    import { FC, ReactNode, useMemo } 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 { BackpackWalletAdapter } from "@solana/wallet-adapter-wallets"
    require("@solana/wallet-adapter-react-ui/styles.css")

    const WalletContextProvider: FC<{ children: ReactNode }> = ({ children }) => {
    const url = useMemo(() => clusterApiUrl("devnet"), [])
    const backpack = new BackpackWalletAdapter()

    return (
    <ConnectionProvider endpoint={url}>
    <WalletProvider wallets={[backpack]}>
    <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]
    )

    现在一切准备就绪,你应该可以连接到用户的钱包了!这一步骤使你的应用程序能够与Solana区块链进行交互,从而为用户提供更丰富的体验。

    🎇 创建连接视图

    现在我们已经可以连接钱包了,下一步就是更新视图来展示连接状态下的用户界面。首先,在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"
    >
    欢迎,Buildoor。
    </Heading>

    <Text color="bodyText" fontSize="xl" textAlign="center">
    每个buildoor都是随机生成的,可以抵押接收
    <Text as="b"> $BLD</Text>。使用你的 <Text as="b"> $BLD</Text>
    升级你的buildoor,并在社区内获得特权!
    </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>铸造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="Buildoors的NFT收藏" />
    <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时流程顺畅。这个界面不仅直观,还提供了丰富的用户体验。

    - +
    Skip to main content

    💻 构建 NFT 铸造者前端

    欢迎来到第一周的挑战环节。每周,你都会有一个特定的部分,用来将你所学的内容应用到自定义的NFT质押应用程序上,并且还有战利品箱子等你拿!

    这些部分的核心目的是鼓励你走出本地开发环境,构建真实的、可以供他人使用的项目。许多成功的构建者都是通过在公众面前展示和开发他们的作品而获得成功的。这是你一直在准备的时刻——让我们开始吧🤘。

    今天,我们要开始从前端制作那些炫酷的登录和铸造页面。

    在第一个屏幕上,唯一的功能是连接到用户的钱包。你可以通过屏幕顶部的按钮或中间的按钮来实现。

    第二个屏幕的功能将在下一个核心项目中实现,所以不必为“mint buildoor”按钮实现任何功能。

    🕸 项目设置

    我们将从零开始,没有模板!设置一个新的 Next.js 应用程序,并向其中添加 Chakra UI

    npx create-next-app <you-project-name> --typescript

    cd <you-project-name>

    npm i @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^10 @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,请确认安装。你可以为你的应用程序取任何你想要的名字,比如我就给我的应用程序命名为“buildoor”。

    下一步,你可能想添加一些视觉素材。你可以在这里找到资源包,也可以自己创建。包里有五个“头像”文件和一个背景的svg文件。请将它们放入项目的public文件夹中。

    现在,一切准备就绪,让我们开始构建吧!🚀

    ✨ 配置 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">
    { /* 导航栏 */ }

    <Spacer />
    <Center>
    { /* 如果已连接,则显示第二个视图,否则显示第一个视图 */ }
    </Center>
    <Spacer />

    <Center>
    <Box marginBottom={4} color="white">
    <a
    href="https://twitter.com/_buildspace"
    target="_blank"
    rel="noopener noreferrer"
    >
    @_buildspace 一同打造
    </a>
    </Box>
    </Center>
    </Stack>
    </Box>
    </div>
    )
    }

    export default Home

    这段代码设置了应用程序的主页面,并使用了Chakra UI的一些组件来简化布局和样式。现在,你的前端页面应该已经具备了基本的结构和风格,接下来你可以继续添加更多的功能和内容!🎨

    🎫 添加导航栏

    现在让我们构建导航栏(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

    这是必需的,因为 NextJS 是服务器端渲染的,在客户端加载之前无法访问依赖于浏览器 API(例如 window)的外部依赖项或组件。

    因此,通过 { ssr: false },我们禁用了导入的服务器渲染。关于动态导入的更多信息,你可以在这里阅读。

    现在返回到 index.tsx 文件,导入 NavBar 并将其放在堆栈的顶部(我已留下评论说明它应该放在哪里):

    // 现有的导入
    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 />

    // 其余的文件保持不变

    至此,除了“连接钱包(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"
    >
    打造你的 buildoor。赚取 $BLD。升级。
    </Heading>
    <Button
    bgColor="accent"
    color="white"
    maxW="380px"
    onClick={handleClick}
    >
    <HStack>
    <Text>成为 buildoor</Text>
    <ArrowForwardIcon />
    </HStack>
    </Button>
    </VStack>
    </Container>
    )
    }

    export default Disconnected

    这将是我们的登录页面 - 用户首次访问网站时会看到的视图。你需要将其导入到 index.tsx 中,并将其放置在渲染组件的中间位置(你可以再次查找相应的注释来找到正确的位置)。

    // 现有的导入
    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 />

    // 其余的文件保持不变

    现在,如果你访问 localhost:3000,你应该会看到一个带有“成为 buildoor”按钮的登录页面。如果你点击它,目前什么也不会发生。这显然不是我们想要的,所以接下来我们要处理这个问题!让我们继续!

    🔌 连接到用户的钱包

    这一部分中,我们将连接到用户的钱包,确保你的应用可以与用户的钱包互动。

    首先,我们需要安装一些必要的依赖包:

    npm install @solana/wallet-adapter-base \
    @solana/wallet-adapter-react \
    @solana/wallet-adapter-react-ui \
    @solana/wallet-adapter-wallets \
    @solana/web3.js

    这些库将帮助我们与用户的Solana钱包连接。

    如果你要为特定钱包构建,你可以在这里自定义设置。这里我们只是使用默认配置。

    components 文件夹中,创建一个名为 WalletContextProvider.tsx 的文件,我们将在其中放置所有这些配置:

    import { FC, ReactNode, useMemo } 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 { BackpackWalletAdapter } from "@solana/wallet-adapter-wallets"
    require("@solana/wallet-adapter-react-ui/styles.css")

    const WalletContextProvider: FC<{ children: ReactNode }> = ({ children }) => {
    const url = useMemo(() => clusterApiUrl("devnet"), [])
    const backpack = new BackpackWalletAdapter()

    return (
    <ConnectionProvider endpoint={url}>
    <WalletProvider wallets={[backpack]}>
    <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]
    )

    现在一切准备就绪,你应该可以连接到用户的钱包了!这一步骤使你的应用程序能够与Solana区块链进行交互,从而为用户提供更丰富的体验。

    🎇 创建连接视图

    现在我们已经可以连接钱包了,下一步就是更新视图来展示连接状态下的用户界面。首先,在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"
    >
    欢迎,Buildoor。
    </Heading>

    <Text color="bodyText" fontSize="xl" textAlign="center">
    每个buildoor都是随机生成的,可以抵押接收
    <Text as="b"> $BLD</Text>。使用你的 <Text as="b"> $BLD</Text>
    升级你的buildoor,并在社区内获得特权!
    </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>铸造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="Buildoors的NFT收藏" />
    <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/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/index.html b/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/index.html index 5d931b2ff..1b94699a7 100644 --- a/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/index.html +++ b/Solana-Co-Learn/module1/start-your-own-custom-project/deploy-to-vercel/index.html @@ -5,13 +5,13 @@ 🌐 部署到 Vercel | All in One Solana - +
    -
    Skip to main content

    🌐 部署到 Vercel

    这一步是你本周工作中至关重要的一环,即将你的项目从本地环境部署到线上环境。

    我们将会把前端部署到Vercel上。Vercel是一个托管平台,可以让你轻松地部署Web应用程序,而且最棒的是,它是免费的!

    首先,你需要将项目推送到Github。如果你不确定如何操作,只需要在Google中搜索相关教程,整个过程应该只需要大约5分钟。

    完成后,请前往Vercel并将其与你的Github帐户连接。它应该会自动检测到这是一个Next.js项目,并会引导你进行非常简单的部署过程。构建完成后,它会提供一个链接。

    恭喜你,现在你的项目已经成功部署到线上了!🎉 在Vercel托管的优势在于,它不仅提供了强大的基础设施,而且还能确保你的网站响应迅速、安全可靠。现在你可以分享你的链接,让全世界的人都可以访问你的应用了!

    - +
    Skip to main content

    🌐 部署到 Vercel

    这一步是你本周工作中至关重要的一环,即将你的项目从本地环境部署到线上环境。

    我们将会把前端部署到Vercel上。Vercel是一个托管平台,可以让你轻松地部署Web应用程序,而且最棒的是,它是免费的!

    首先,你需要将项目推送到Github。如果你不确定如何操作,只需要在Google中搜索相关教程,整个过程应该只需要大约5分钟。

    完成后,请前往Vercel并将其与你的Github帐户连接。它应该会自动检测到这是一个Next.js项目,并会引导你进行非常简单的部署过程。构建完成后,它会提供一个链接。

    恭喜你,现在你的项目已经成功部署到线上了!🎉 在Vercel托管的优势在于,它不仅提供了强大的基础设施,而且还能确保你的网站响应迅速、安全可靠。现在你可以分享你的链接,让全世界的人都可以访问你的应用了!

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module1/start-your-own-custom-project/index.html b/Solana-Co-Learn/module1/start-your-own-custom-project/index.html index 7ec0de72b..cb43274ba 100644 --- a/Solana-Co-Learn/module1/start-your-own-custom-project/index.html +++ b/Solana-Co-Learn/module1/start-your-own-custom-project/index.html @@ -5,13 +5,13 @@ 开始你自己的定制项目 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module1/wallet-usage/index.html b/Solana-Co-Learn/module1/wallet-usage/index.html index 205789d97..e6d45adc5 100644 --- a/Solana-Co-Learn/module1/wallet-usage/index.html +++ b/Solana-Co-Learn/module1/wallet-usage/index.html @@ -5,13 +5,13 @@ Solana钱包使用 - Backpack 🎒 | All in One Solana - +
    -
    Skip to main content

    Solana钱包使用 - Backpack 🎒

    Solana的钱包种类繁多,如众所周知的Phantom钱包。然而,在此我并不推荐使用Phantom,因为对于开发者来说,它并不够友好。

    在本地开发时,Phantom不支持本地RPC地址,只能使用Solana官方的测试网络。这样一来,开发者在本地开发时就会受限制。正因如此,我推荐使用Backpack钱包。

    下载Backpack钱包

    下载地址:https://www.backpack.app/。点击页面上的“Download”按钮,然后选择适合自己浏览器的插件。

    目前Backpack钱包只支持ChromeBraveArc浏览器。移动端版本还在开发中。

    创建账户

    下载安装完毕后,你将看到登录界面。点击Create Account创建账户。

    接下来是Claim账户名字的步骤,输入你想要的账户名字,然后点击Claim Name

    此后,系统将引导你选择创建新的钱包或导入私钥。在此我们选择创建新的钱包。

    接下来将展示助记词界面,你可以将助记词保存到本地,然后继续下一步。

    由于Backpack是一个多链钱包,在此我们选择Solana链,然后继续下一步。

    设置自定义的RPC Endpoint

    账户创建完毕后,我们来设置自定义的RPC Endpoint。点击右上角的设置按钮,然后选择Preference

    然后点击Preference选项。

    你将看到有两个网络选项,分别是Solana和以太坊。我们在这里选择Solana

    接下来就是设置自定义RPC的环节,我们在此选择了localnet

    Custom选项下,你可以自定义RPC地址。除了官方提供的testnetmainbeta地址,你还可以通过QuicknodeHelius申请自己的RPC地址。

    参考资料

    总而言之,Backpack钱包由于其对开发者友好的特性,以及灵活的自定义RPC设置功能,成为了一款值得推荐的钱包选项。它使得开发者能够更便捷、灵活地进行Solana开发和测试工作。

    - +
    Skip to main content

    Solana钱包使用 - Backpack 🎒

    Solana的钱包种类繁多,如众所周知的Phantom钱包。然而,在此我并不推荐使用Phantom,因为对于开发者来说,它并不够友好。

    在本地开发时,Phantom不支持本地RPC地址,只能使用Solana官方的测试网络。这样一来,开发者在本地开发时就会受限制。正因如此,我推荐使用Backpack钱包。

    下载Backpack钱包

    下载地址:https://www.backpack.app/。点击页面上的“Download”按钮,然后选择适合自己浏览器的插件。

    目前Backpack钱包只支持ChromeBraveArc浏览器。移动端版本还在开发中。

    创建账户

    下载安装完毕后,你将看到登录界面。点击Create Account创建账户。

    接下来是Claim账户名字的步骤,输入你想要的账户名字,然后点击Claim Name

    此后,系统将引导你选择创建新的钱包或导入私钥。在此我们选择创建新的钱包。

    接下来将展示助记词界面,你可以将助记词保存到本地,然后继续下一步。

    由于Backpack是一个多链钱包,在此我们选择Solana链,然后继续下一步。

    设置自定义的RPC Endpoint

    账户创建完毕后,我们来设置自定义的RPC Endpoint。点击右上角的设置按钮,然后选择Preference

    然后点击Preference选项。

    你将看到有两个网络选项,分别是Solana和以太坊。我们在这里选择Solana

    接下来就是设置自定义RPC的环节,我们在此选择了localnet

    Custom选项下,你可以自定义RPC地址。除了官方提供的testnetmainbeta地址,你还可以通过QuicknodeHelius申请自己的RPC地址。

    参考资料

    总而言之,Backpack钱包由于其对开发者友好的特性,以及灵活的自定义RPC设置功能,成为了一款值得推荐的钱包选项。它使得开发者能够更便捷、灵活地进行Solana开发和测试工作。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/index.html b/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/index.html index 4b71be8c9..698b604a4 100644 --- a/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/index.html +++ b/Solana-Co-Learn/module1/wallets-and-frontends/connecting-to-wallet/index.html @@ -5,13 +5,13 @@ 🔌 连接到钱包 | All in One Solana - +
    -
    Skip to main content

    🔌 连接到钱包

    现在我们已经知道如何使用代码与网络交互,通过直接使用私钥来初始化账户。显然,在正常的去中心化应用(dapp)中,这样做是不可行的(永远不要将你的私钥暴露给任何人或任何dapp)。

    接下来,我们将介绍如何通过SDK和钱包进行交互。

    “钱包”这个词可能听起来有些奇怪,因为它们不仅仅用来存储东西。钱包的关键功能是使用其中的密钥进行安全的交易签名。钱包有很多形式,最常见的是浏览器扩展,它们为你(作为开发者)提供API,以向用户建议交易。钱包让你能够安全地进行操作。

    推荐使用 BackPack

    🛠 Solana 钱包适配器

    在开发过程中,我们使用 Solana Wallet-Adapter 来适配各种钱包,并实现通用的Solana API。支持的钱包列表可以在这里找到。

    你需要使用的适配器库包括 wallet-adapter-basewallet-adapter-react,这两者都是必选的。然后,你可以根据需求选择支持的钱包或使用 wallet-adapter-wallets

    下面是一个使用BackPack🎒登录的示例代码:

    npm install @solana/wallet-adapter-base \
    @solana/wallet-adapter-react \
    @solana/wallet-adapter-backpack \
    @solana/wallet-adapter-react-ui
    • wallet-adapter-react-ui 为我们处理了整个UI,包括连接、选择钱包、断开连接等,一切都已经安排妥当!
    • 可选择使用 @solana/wallet-adapter-backpack 钱包。

    👜 创建一个钱包连接按钮

    下面的教程将指导你创建一个钱包连接按钮,并将其集成到你的Solana项目中。

    1. 初始化项目模板

    首先,你需要从指定的仓库克隆项目模板并进行必要的初始化操作:

    git clone https://github.com/CreatorsDAO/solana-ping-frontend
    cd solana-ping-frontend
    git checkout starter
    npm i
    npm run dev

    该模板继承了我们上次构建的内容——我们为ping客户端提供了一个前端界面,以便将数据写入区块链。

    这是一个初步的系统UI。接下来,让我们将其连接到wallet-adapter-react库。

    2. 修改 _app.tsx,使其具备以下外观

    在此步骤中,你需要修改_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,
    BackpackWalletAdapter
    } 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(),
    new BackpackWalletAdapter()
    ],
    [network]
    );

    return (
    <ConnectionProvider endpoint={endpoint}>
    <WalletProvider wallets={wallets} autoConnect>
    <WalletModalProvider>
    <Component {...pageProps} />
    </WalletModalProvider>
    </WalletProvider>
    </ConnectionProvider>
    );
    };

    export default App;

    通过上述步骤,你将成功创建一个钱包连接按钮,并能与Solana网络进行交互。现在,用户可以方便地使用这个按钮连接到他们的钱包,并享受无缝的区块链体验。

    框架介绍

    以下是关于如何连接和使用钱包的详细步骤和解释。

    1. 这是一个基于React的应用框架。通过useMemo,它会根据网络连接状态确定与Solana网络交互的rpc endpoint
    2. 使用@solana/wallet-adapter-baseWalletAdapterNetwork来展示可用的网络。
    3. WalletModalProvider会向用户提示选择钱包。
    4. ConnectionProvider接受一个RPC端点,并允许我们直接与Solana区块链上的节点通信。我们将在整个应用程序中使用它来发送交易。
    5. WalletProvider为我们提供了连接各种钱包的统一接口。
    6. wallet-adapter-wallets提供了钱包适配器。我们将使用从中导入的内容来创建我们将提供给WalletProvider的钱包列表。在本例中,选择了PhantomGlow, BackPack🎒。
    7. 最后,我们有clusterApiURL,这只是一个根据我们提供的网络为我们生成RPC端点的函数。
    8. 总结一下:这个文件是我们网页应用程序的核心。其实它是一个由Vercel构建的React应用程序,使用_app.tx来构建应用的基本骨架。

    🧞 使用连接钱包

    我们将通过React hook的方式使用钱包,比如在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为我们处理了许多工作,处理了所有连接的细节。如果你现在强制刷新应用程序,你应该能在右上角看到一个紫色的按钮!

    - +
    Skip to main content

    🔌 连接到钱包

    现在我们已经知道如何使用代码与网络交互,通过直接使用私钥来初始化账户。显然,在正常的去中心化应用(dapp)中,这样做是不可行的(永远不要将你的私钥暴露给任何人或任何dapp)。

    接下来,我们将介绍如何通过SDK和钱包进行交互。

    “钱包”这个词可能听起来有些奇怪,因为它们不仅仅用来存储东西。钱包的关键功能是使用其中的密钥进行安全的交易签名。钱包有很多形式,最常见的是浏览器扩展,它们为你(作为开发者)提供API,以向用户建议交易。钱包让你能够安全地进行操作。

    推荐使用 BackPack

    🛠 Solana 钱包适配器

    在开发过程中,我们使用 Solana Wallet-Adapter 来适配各种钱包,并实现通用的Solana API。支持的钱包列表可以在这里找到。

    你需要使用的适配器库包括 wallet-adapter-basewallet-adapter-react,这两者都是必选的。然后,你可以根据需求选择支持的钱包或使用 wallet-adapter-wallets

    下面是一个使用BackPack🎒登录的示例代码:

    npm install @solana/wallet-adapter-base \
    @solana/wallet-adapter-react \
    @solana/wallet-adapter-backpack \
    @solana/wallet-adapter-react-ui
    • wallet-adapter-react-ui 为我们处理了整个UI,包括连接、选择钱包、断开连接等,一切都已经安排妥当!
    • 可选择使用 @solana/wallet-adapter-backpack 钱包。

    👜 创建一个钱包连接按钮

    下面的教程将指导你创建一个钱包连接按钮,并将其集成到你的Solana项目中。

    1. 初始化项目模板

    首先,你需要从指定的仓库克隆项目模板并进行必要的初始化操作:

    git clone https://github.com/CreatorsDAO/solana-ping-frontend
    cd solana-ping-frontend
    git checkout starter
    npm i
    npm run dev

    该模板继承了我们上次构建的内容——我们为ping客户端提供了一个前端界面,以便将数据写入区块链。

    这是一个初步的系统UI。接下来,让我们将其连接到wallet-adapter-react库。

    2. 修改 _app.tsx,使其具备以下外观

    在此步骤中,你需要修改_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,
    BackpackWalletAdapter
    } 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(),
    new BackpackWalletAdapter()
    ],
    [network]
    );

    return (
    <ConnectionProvider endpoint={endpoint}>
    <WalletProvider wallets={wallets} autoConnect>
    <WalletModalProvider>
    <Component {...pageProps} />
    </WalletModalProvider>
    </WalletProvider>
    </ConnectionProvider>
    );
    };

    export default App;

    通过上述步骤,你将成功创建一个钱包连接按钮,并能与Solana网络进行交互。现在,用户可以方便地使用这个按钮连接到他们的钱包,并享受无缝的区块链体验。

    框架介绍

    以下是关于如何连接和使用钱包的详细步骤和解释。

    1. 这是一个基于React的应用框架。通过useMemo,它会根据网络连接状态确定与Solana网络交互的rpc endpoint
    2. 使用@solana/wallet-adapter-baseWalletAdapterNetwork来展示可用的网络。
    3. WalletModalProvider会向用户提示选择钱包。
    4. ConnectionProvider接受一个RPC端点,并允许我们直接与Solana区块链上的节点通信。我们将在整个应用程序中使用它来发送交易。
    5. WalletProvider为我们提供了连接各种钱包的统一接口。
    6. wallet-adapter-wallets提供了钱包适配器。我们将使用从中导入的内容来创建我们将提供给WalletProvider的钱包列表。在本例中,选择了PhantomGlow, BackPack🎒。
    7. 最后,我们有clusterApiURL,这只是一个根据我们提供的网络为我们生成RPC端点的函数。
    8. 总结一下:这个文件是我们网页应用程序的核心。其实它是一个由Vercel构建的React应用程序,使用_app.tx来构建应用的基本骨架。

    🧞 使用连接钱包

    我们将通过React hook的方式使用钱包,比如在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/Solana-Co-Learn/module1/wallets-and-frontends/index.html b/Solana-Co-Learn/module1/wallets-and-frontends/index.html index 6843ca3ad..dad7bc757 100644 --- a/Solana-Co-Learn/module1/wallets-and-frontends/index.html +++ b/Solana-Co-Learn/module1/wallets-and-frontends/index.html @@ -5,13 +5,13 @@ 钱包和前端 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/index.html b/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/index.html index f6ae7e359..b005561e0 100644 --- a/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/index.html +++ b/Solana-Co-Learn/module1/wallets-and-frontends/interact-with-a-program/index.html @@ -5,13 +5,13 @@ 🦺 与程序进行交互 | All in One Solana - +
    -
    Skip to main content

    🦺 与程序进行交互

    在成功设置了钱包连接后,我们可以让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("请先连接你的钱包!")
    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(`浏览器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

    接下来就是测试时间了。

    可以查看这里的Solana钱包使用 - Backpack 🎒钱包使用教程切换到开发测试网。

    连接你的钱包并点击那个ping按钮,你将会看到交互反馈。

    点击确认后,控制台将打印出交易链接。向下滚动,你会发现数字已经增加了🚀。

    现在你可以让用户与应用程序互动了!你之前所创建价值1万美元的产品?现在它已经升级成了一个价值百万美元的产品。想象一下所有的程序,比如MetaplexSolana程序库中的任何程序,你现在可以将它们与用户界面连接起来,让人们使用。

    🚢 挑战 - SOL 发送者

    是时候挑战自己了。

    在此挑战中,你将使用此起始代码创建一个应用程序,允许用户连接其Backpack🎒钱包并将SOL发送到另一个账户。确保克隆后使用git checkout starter切换到起始分支。

    你需要通过以下两个关键步骤来完成这个挑战:

    • 使用适当的上下文提供程序包装启动应用程序。
    • 在表单组件中,设置交易并将其发送到用户的钱包以供批准。

    完成后,应用程序应该看起来像这样:

    别忘了验证地址!

    完成后,你可以将你的解决方案与解决方案代码进行比较。

    - +
    Skip to main content

    🦺 与程序进行交互

    在成功设置了钱包连接后,我们可以让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("请先连接你的钱包!")
    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(`浏览器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

    接下来就是测试时间了。

    可以查看这里的Solana钱包使用 - Backpack 🎒钱包使用教程切换到开发测试网。

    连接你的钱包并点击那个ping按钮,你将会看到交互反馈。

    点击确认后,控制台将打印出交易链接。向下滚动,你会发现数字已经增加了🚀。

    现在你可以让用户与应用程序互动了!你之前所创建价值1万美元的产品?现在它已经升级成了一个价值百万美元的产品。想象一下所有的程序,比如MetaplexSolana程序库中的任何程序,你现在可以将它们与用户界面连接起来,让人们使用。

    🚢 挑战 - SOL 发送者

    是时候挑战自己了。

    在此挑战中,你将使用此起始代码创建一个应用程序,允许用户连接其Backpack🎒钱包并将SOL发送到另一个账户。确保克隆后使用git checkout starter切换到起始分支。

    你需要通过以下两个关键步骤来完成这个挑战:

    • 使用适当的上下文提供程序包装启动应用程序。
    • 在表单组件中,设置交易并将其发送到用户的钱包以供批准。

    完成后,应用程序应该看起来像这样:

    别忘了验证地址!

    完成后,你可以将你的解决方案与解决方案代码进行比较。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/index.html b/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/index.html index 2a70317fa..ce69ca1c2 100644 --- a/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/index.html +++ b/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-candy-machine/index.html @@ -5,13 +5,13 @@ 🖼 从糖果机展示NFTs | All in One Solana - +
    -
    Skip to main content

    🖼 从糖果机展示NFTs

    现在我们已经铸造了一个NFT,接下来我们将学习如何铸造一系列的NFT。为此,我们将利用Candy Machine来实现——这是Solana的一个程序,使创作者能够将他们的资产上链。虽然这并非创建系列的唯一方式,但在Solana上它却成了标准,因为它具备了许多有用的功能,例如机器人保护和安全随机化。你是否感受到过看到闪亮的新iPhone时的那股兴奋感?稀有的NFT有点儿类似于此。对于优秀的艺术家而言,仅仅是观看这些NFT也极富乐趣。毕竟,艺术的本质就是用来欣赏的!接下来,我们将探讨如果我们只有Candy Machine的地址,应该如何展示NFTs

    你能猜到这里有何不同之处吗?没错,我们仅在SDK上采用了一种不同的方法!

    由于这里并没有钱包,我们不需要使用 walletAdapterIdentity,只需使用metaplex对象即可。

    我们在此有几个选择 - findByAddress 就是我们所需的。

    与我们为单个NFT所获取的相似,我们将会得到整个糖果机实例的元数据。items 字段是糖果机内所有NFT的数组。每个项目都不会直接包含我们想要的内容,而是会引向一个我们可以从中提取资产的URI。

    鉴于收藏品可能会相当庞大,我们不会一次性获取所有的NFT。相反,我们将基于分页系统,只获取我们想要展示的NFT

    那么,让我们一起来绘制一些像素吧!

    🥁 请准备一个糖果机

    你可以从上一节的进度继续,或者使用我们上次使用的相同模板(从起始分支开始即可)。

    赶紧跳入 FetchCandyMachine.tsx 文件吧。你会发现一些设置已经为你准备好了。我们将使用 getPage 函数从糖果机上获取某“页面”上的物品。在此之前,我们需要获取糖果机的元数据账户。

    在空的 fetchCandyMachine 函数上方设置 metaplex 对象的连接。

    export const FetchCandyMachine: FC = () => {
    // 占位符 CMv2 地址
    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 = () => {
    ...

    // 通过地址获取糖果机
    const fetchCandyMachine = async () => {

    // 设置页面为1 - 我们想要在获取新糖果机时始终位于第一页
    setPage(1)

    // 获取糖果机数据
    try {
    const candyMachine = await metaplex
    .candyMachinesV2()
    .findByAddress({ address: new PublicKey(candyMachineAddress) })

    setCandyMachineData(candyMachine)
    } catch (e) {
    alert("请输入有效的CMv2地址。")
    }
    }
    ...
    }

    注意:Metaplex CLI的最新版本在函数调用的末尾不需要 run()

    现在来到重要的部分 - 浏览我们将获取的CM数据。以下是 getPage 函数的样子:

    export const FetchCandyMachine: FC = () => {
    ...

    // 分页
    const getPage = async (page, perPage) => {
    const pageItems = candyMachineData.items.slice(
    (page - 1) * perPage,
    page * perPage
    )

    // 获取页面中NFT的元数据
    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)
    }

    // 设置状态
    setPageItems(nftData)
    }
    ...
    }

    我们在这里做的是将 items 数组切割成大小为10的部分。然后我们获取页面上每个NFT的元数据,并将其存储在 nftData 中。最后,我们将 pageItems 状态变量设置为刚刚获取的 nftData

    这意味着我们的应用程序在任何时候只会渲染当前页面的NFT。相当棒!

    让我们填写 prevnext 函数:

    // 上一页
    const prev = async () => {
    if (page - 1 < 1) {
    setPage(1)
    } else {
    setPage(page - 1)
    }
    }

    // 下一页
    const next = async () => {
    setPage(page + 1)
    }

    当用户点击“上一页”和“下一页”按钮时,这些功能将运行。这些按钮只会在 pageItems 不为空时显示(即当我们获取了CM的NFT时)。

    现在我们需要一些 useEffects 来开始。整个过程一开始可能有点复杂,所以让我们一步一步解释。

      1. 在页面加载时运行 fetchCandyMachine 函数(如果 candyMachineAddress 不为空)。
      1. 每当使用 fetchCandyMachine 获取糖果机时,将 page 设置为1,这样你就可以从第一页开始。
      1. 每当 candyMachineDatapage 发生变化时(即输入新的CM地址或点击下一个/上一个按钮),重新加载页面。

    以下是代码示例:

    export const FetchCandyMachine: FC = () => {
    ...

    // 页面加载时获取占位符糖果机
    useEffect(() => {
    fetchCandyMachine()
    }, [])

    // 当页面或糖果机发生变化时获取NFT的元数据
    useEffect(() => {
    if (!candyMachineData) {
    return
    }
    getPage(page, 9)
    }, [candyMachineData, page])

    }

    快到 localhost:3000 上试试吧!你应该能够看到你的糖果机上NFT的第一页。

    - +
    Skip to main content

    🖼 从糖果机展示NFTs

    现在我们已经铸造了一个NFT,接下来我们将学习如何铸造一系列的NFT。为此,我们将利用Candy Machine来实现——这是Solana的一个程序,使创作者能够将他们的资产上链。虽然这并非创建系列的唯一方式,但在Solana上它却成了标准,因为它具备了许多有用的功能,例如机器人保护和安全随机化。你是否感受到过看到闪亮的新iPhone时的那股兴奋感?稀有的NFT有点儿类似于此。对于优秀的艺术家而言,仅仅是观看这些NFT也极富乐趣。毕竟,艺术的本质就是用来欣赏的!接下来,我们将探讨如果我们只有Candy Machine的地址,应该如何展示NFTs

    你能猜到这里有何不同之处吗?没错,我们仅在SDK上采用了一种不同的方法!

    由于这里并没有钱包,我们不需要使用 walletAdapterIdentity,只需使用metaplex对象即可。

    我们在此有几个选择 - findByAddress 就是我们所需的。

    与我们为单个NFT所获取的相似,我们将会得到整个糖果机实例的元数据。items 字段是糖果机内所有NFT的数组。每个项目都不会直接包含我们想要的内容,而是会引向一个我们可以从中提取资产的URI。

    鉴于收藏品可能会相当庞大,我们不会一次性获取所有的NFT。相反,我们将基于分页系统,只获取我们想要展示的NFT

    那么,让我们一起来绘制一些像素吧!

    🥁 请准备一个糖果机

    你可以从上一节的进度继续,或者使用我们上次使用的相同模板(从起始分支开始即可)。

    赶紧跳入 FetchCandyMachine.tsx 文件吧。你会发现一些设置已经为你准备好了。我们将使用 getPage 函数从糖果机上获取某“页面”上的物品。在此之前,我们需要获取糖果机的元数据账户。

    在空的 fetchCandyMachine 函数上方设置 metaplex 对象的连接。

    export const FetchCandyMachine: FC = () => {
    // 占位符 CMv2 地址
    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 = () => {
    ...

    // 通过地址获取糖果机
    const fetchCandyMachine = async () => {

    // 设置页面为1 - 我们想要在获取新糖果机时始终位于第一页
    setPage(1)

    // 获取糖果机数据
    try {
    const candyMachine = await metaplex
    .candyMachinesV2()
    .findByAddress({ address: new PublicKey(candyMachineAddress) })

    setCandyMachineData(candyMachine)
    } catch (e) {
    alert("请输入有效的CMv2地址。")
    }
    }
    ...
    }

    注意:Metaplex CLI的最新版本在函数调用的末尾不需要 run()

    现在来到重要的部分 - 浏览我们将获取的CM数据。以下是 getPage 函数的样子:

    export const FetchCandyMachine: FC = () => {
    ...

    // 分页
    const getPage = async (page, perPage) => {
    const pageItems = candyMachineData.items.slice(
    (page - 1) * perPage,
    page * perPage
    )

    // 获取页面中NFT的元数据
    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)
    }

    // 设置状态
    setPageItems(nftData)
    }
    ...
    }

    我们在这里做的是将 items 数组切割成大小为10的部分。然后我们获取页面上每个NFT的元数据,并将其存储在 nftData 中。最后,我们将 pageItems 状态变量设置为刚刚获取的 nftData

    这意味着我们的应用程序在任何时候只会渲染当前页面的NFT。相当棒!

    让我们填写 prevnext 函数:

    // 上一页
    const prev = async () => {
    if (page - 1 < 1) {
    setPage(1)
    } else {
    setPage(page - 1)
    }
    }

    // 下一页
    const next = async () => {
    setPage(page + 1)
    }

    当用户点击“上一页”和“下一页”按钮时,这些功能将运行。这些按钮只会在 pageItems 不为空时显示(即当我们获取了CM的NFT时)。

    现在我们需要一些 useEffects 来开始。整个过程一开始可能有点复杂,所以让我们一步一步解释。

      1. 在页面加载时运行 fetchCandyMachine 函数(如果 candyMachineAddress 不为空)。
      1. 每当使用 fetchCandyMachine 获取糖果机时,将 page 设置为1,这样你就可以从第一页开始。
      1. 每当 candyMachineDatapage 发生变化时(即输入新的CM地址或点击下一个/上一个按钮),重新加载页面。

    以下是代码示例:

    export const FetchCandyMachine: FC = () => {
    ...

    // 页面加载时获取占位符糖果机
    useEffect(() => {
    fetchCandyMachine()
    }, [])

    // 当页面或糖果机发生变化时获取NFT的元数据
    useEffect(() => {
    if (!candyMachineData) {
    return
    }
    getPage(page, 9)
    }, [candyMachineData, page])

    }

    快到 localhost:3000 上试试吧!你应该能够看到你的糖果机上NFT的第一页。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/index.html b/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/index.html index 73141750b..428e43659 100644 --- a/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/index.html +++ b/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts-from-a-wallet/index.html @@ -5,13 +5,13 @@ 📱 在钱包中展示NFTs | All in One Solana - +
    -
    Skip to main content

    📱 在钱包中展示NFTs

    现在我们已经铸造了一个NFT,接下来我们要探索如何铸造一系列的NFT。我们将使用Candy Machine来完成这项任务,这是一款Solana程序,能让创作者方便地将他们的资产上链。虽然这不是创建系列的唯一方式,但在Solana上它已经成为标准,因为它具有诸如防机器人保护和安全随机化等有用的功能。你懂的,模板时间到了。然而,随着我们构建的项目越来越复杂,我们的模板也会变得更先进。这次我们将基于Solana dApp脚手架构建一个模板。与之前的模板一样,它是一个由create-next-app创建的Next.js应用程序。不过这次,它具有更多功能。不用担心!我们依然会使用相同的工具。

    git clone https://github.com/CreatorsDAO/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
    }

    // 为连接的钱包获取NFTs
    const nfts = await metaplex
    .nfts()
    .findAllByOwner({ owner: wallet.publicKey })

    // 为每个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)
    }

    // 设置状态
    setNftData(nftData)
    }

    由于我们希望在钱包更改时更新展示的NFTs,因此我们将在useEffect函数下方添加一个钩子来调用fetchNfts函数。

    export const FetchNft: FC = () => {
    ...

    const fetchNfts = async () => {
    ...
    }

    // 当连接的钱包改变时获取nfts
    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了!🎉 这就是我的钱包的样子 😆

    回顾过去的日子,那时我不得不手动完成所有这些工作,并且我一直受到RPC的速率限制,所以请花一些时间感谢Metaplex的开发人员为我们带来了这个精彩的SDK

    nftData上玩一下。将其记录到控制台,并尝试显示其他值,如符号或描述!也许你还可以添加一个过滤器,让用户只能显示特定收藏的NFT

    - +
    Skip to main content

    📱 在钱包中展示NFTs

    现在我们已经铸造了一个NFT,接下来我们要探索如何铸造一系列的NFT。我们将使用Candy Machine来完成这项任务,这是一款Solana程序,能让创作者方便地将他们的资产上链。虽然这不是创建系列的唯一方式,但在Solana上它已经成为标准,因为它具有诸如防机器人保护和安全随机化等有用的功能。你懂的,模板时间到了。然而,随着我们构建的项目越来越复杂,我们的模板也会变得更先进。这次我们将基于Solana dApp脚手架构建一个模板。与之前的模板一样,它是一个由create-next-app创建的Next.js应用程序。不过这次,它具有更多功能。不用担心!我们依然会使用相同的工具。

    git clone https://github.com/CreatorsDAO/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
    }

    // 为连接的钱包获取NFTs
    const nfts = await metaplex
    .nfts()
    .findAllByOwner({ owner: wallet.publicKey })

    // 为每个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)
    }

    // 设置状态
    setNftData(nftData)
    }

    由于我们希望在钱包更改时更新展示的NFTs,因此我们将在useEffect函数下方添加一个钩子来调用fetchNfts函数。

    export const FetchNft: FC = () => {
    ...

    const fetchNfts = async () => {
    ...
    }

    // 当连接的钱包改变时获取nfts
    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了!🎉 这就是我的钱包的样子 😆

    回顾过去的日子,那时我不得不手动完成所有这些工作,并且我一直受到RPC的速率限制,所以请花一些时间感谢Metaplex的开发人员为我们带来了这个精彩的SDK

    nftData上玩一下。将其记录到控制台,并尝试显示其他值,如符号或描述!也许你还可以添加一个过滤器,让用户只能显示特定收藏的NFT

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/index.html b/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/index.html index 3eac1d32a..b2297653c 100644 --- a/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/index.html +++ b/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/displaying-nfts/index.html @@ -5,13 +5,13 @@ 💃 展示NFTs | All in One Solana - +
    -
    Skip to main content

    💃 展示NFTs

    既然我们已经铸造了一个NFT,现在我们将进一步探讨如何铸造一整套NFT。我们将借助Candy Machine来实现这个任务——这是一个Solana程序,可以让创作者轻松地将他们的资产上链。当然,这并不是在Solana上创建系列的唯一方法,但它确实成为了标准,因为它具备了许多实用功能,例如防机器人保护和安全随机化。毕竟,如果你不能向人们展示你的NFT,那它还有什么价值呢!在这一节,我们将引导你展示你的作品——首先在钱包中展示,然后在Candy Machine中展示。

    你可能会好奇为什么要这样做。想象一下,你的朋友在你的网站上从你的收藏中铸造了一个很酷的Pepe NFT。他们已经铸造了许多与Pepe有关的项目,因此他们的钱包中有几十个NFT。他们怎么知道哪一个是从你的收藏中铸造的呢?你得向他们展示!

    你可能还记得,从第一周开始,我们想要的一切都存储在账户中。这意味着你可以仅通过使用钱包地址来获取他们的NFT,尽管这需要付出更多努力。

    相反,我们将利用Metaplex SDK,它让一切都变得就像调用API一样简单。以下是它的样子:

    你需要进行通常的Metaplex设置,但是我们将使用 walletAdapterIdentity 而不是 keypairIdentity 来进行连接,因为我们并不需要他们的密钥对。一旦完成,我们只需使用Metaplex对象调用 findAllByOwner 方法。

    下图显示了单个NFTNFT数据在控制台上的打印结果,我们主要关注的是 uri 字段:

    顺便提一下,还有许多其他方法可以获取NFT

    现在,让我们开始编写代码吧!

    - +
    Skip to main content

    💃 展示NFTs

    既然我们已经铸造了一个NFT,现在我们将进一步探讨如何铸造一整套NFT。我们将借助Candy Machine来实现这个任务——这是一个Solana程序,可以让创作者轻松地将他们的资产上链。当然,这并不是在Solana上创建系列的唯一方法,但它确实成为了标准,因为它具备了许多实用功能,例如防机器人保护和安全随机化。毕竟,如果你不能向人们展示你的NFT,那它还有什么价值呢!在这一节,我们将引导你展示你的作品——首先在钱包中展示,然后在Candy Machine中展示。

    你可能会好奇为什么要这样做。想象一下,你的朋友在你的网站上从你的收藏中铸造了一个很酷的Pepe NFT。他们已经铸造了许多与Pepe有关的项目,因此他们的钱包中有几十个NFT。他们怎么知道哪一个是从你的收藏中铸造的呢?你得向他们展示!

    你可能还记得,从第一周开始,我们想要的一切都存储在账户中。这意味着你可以仅通过使用钱包地址来获取他们的NFT,尽管这需要付出更多努力。

    相反,我们将利用Metaplex SDK,它让一切都变得就像调用API一样简单。以下是它的样子:

    你需要进行通常的Metaplex设置,但是我们将使用 walletAdapterIdentity 而不是 keypairIdentity 来进行连接,因为我们并不需要他们的密钥对。一旦完成,我们只需使用Metaplex对象调用 findAllByOwner 方法。

    下图显示了单个NFTNFT数据在控制台上的打印结果,我们主要关注的是 uri 字段:

    顺便提一下,还有许多其他方法可以获取NFT

    现在,让我们开始编写代码吧!

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/index.html b/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/index.html index bb5cc604a..90c36bbbe 100644 --- a/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/index.html +++ b/Solana-Co-Learn/module2/displayings-nfts-in-a-ui/index.html @@ -5,13 +5,13 @@ 在用户界面中展示NFTS | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/index.html b/Solana-Co-Learn/module2/index.html index 17b13b8c8..a3b71b6e0 100644 --- a/Solana-Co-Learn/module2/index.html +++ b/Solana-Co-Learn/module2/index.html @@ -5,13 +5,13 @@ Solana 进阶 (SPL token与NFT) | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/index.html b/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/index.html index 5a4b42376..52b53cd01 100644 --- a/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/index.html +++ b/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-candy-machine/index.html @@ -5,13 +5,13 @@ 🍬 创建糖果机 | All in One Solana - +
    -
    Skip to main content

    🍬 创建糖果机

    现在我们已经铸造了一个NFT,接下来我们要学习如何铸造一系列NFT。我们将使用Candy Machine来完成这个任务。Candy Machine是一个Solana程序,它可以让创作者将他们的艺术品和资产上链。虽然还有其他方式可以创建NFT系列,但Candy MachineSolana上已成为一项标准,因为它具备许多实用功能,如防机器人保护和安全随机化。准备好添加一些内容到我们上一课创建但未使用的文件夹中了吗?

    首先,让我们在你的 candy-machine 文件夹中创建一个新的资产文件夹,并将所有NFT图像和元数据放入其中。你可以在这里找到有关如何准备NFT资产的详细信息。

    使用Sugar CLI

    现在你已经成功创建了所有NFT资产,我们可以开始使用Sugar 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系列,并通过Candy Machine上链了。你可以继续探索其他Candy Machine的功能,并尝试在Solana上更广泛地展示和销售你的NFT

    - +
    Skip to main content

    🍬 创建糖果机

    现在我们已经铸造了一个NFT,接下来我们要学习如何铸造一系列NFT。我们将使用Candy Machine来完成这个任务。Candy Machine是一个Solana程序,它可以让创作者将他们的艺术品和资产上链。虽然还有其他方式可以创建NFT系列,但Candy MachineSolana上已成为一项标准,因为它具备许多实用功能,如防机器人保护和安全随机化。准备好添加一些内容到我们上一课创建但未使用的文件夹中了吗?

    首先,让我们在你的 candy-machine 文件夹中创建一个新的资产文件夹,并将所有NFT图像和元数据放入其中。你可以在这里找到有关如何准备NFT资产的详细信息。

    使用Sugar CLI

    现在你已经成功创建了所有NFT资产,我们可以开始使用Sugar 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系列,并通过Candy Machine上链了。你可以继续探索其他Candy Machine的功能,并尝试在Solana上更广泛地展示和销售你的NFT

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/index.html b/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/index.html index 7b57d3aa4..2df417fb0 100644 --- a/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/index.html +++ b/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-reward-tokens/index.html @@ -5,13 +5,13 @@ 🎨 创建奖励代币 | All in One Solana - +
    -
    Skip to main content

    🎨 创建奖励代币

    既然我们已经铸造了一个NFT,那么接下来我们要探讨如何铸造一系列的NFT。为了达成这个目标,我们将采用Candy Machine——一款在Solana上广泛使用的程序,允许创作者将其资产上链。Candy MachineSolana上受到欢迎的原因在于,它具备了如机器人防护和安全随机化等实用功能。现在我们可以回归到我们自定义的NFT质押应用上来,借助我们在代币程序和Candy Machine上的经验来构建这个应用。

    请按照以下步骤操作:

    1. 在根目录中创建名为tokens的新文件夹。

    2. tokens文件夹内,我们要创建2个子文件夹,分别命名为bldcandy-machine,它们的结构应如下图所示:

    我们这样做的目的是整理建立Builder时所需的奖励代币和与我们的NFT有关的内容。

    1. 接下来,我们要创建资源文件夹,用于存放代币的图像。请进入你的bld文件夹,并创建名为assets的新文件夹。同时,在你的bld文件夹内,创建名为index.ts的新文件。目录结构应如下所示:
    ├── styles
    ├── tokens
    │ ├── bld
    | ├── assets
    | ├── index.ts

    注意:确保你的index.ts文件位于bld文件夹中,而不是在assets文件夹中。

    1. 你可能会发现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]
    )

    这段代码将创建一个代币,并与其关联所有必需的输入。它还会读取图像文件,上传文件,并执行其他必要操作,从而为你的代币创建完整的元数据。

    通过上述步骤,你将能够在Solana上成功创建并管理你的代币。

    🥳 代码解析

    好的,我们逐一分析一下上述代码的各个部分。

    首先,我们通过调用 createMint 函数来创建并初始化一个新的代币铸造。你可以通过这个链接了解更多有关该函数的信息。

    // 这段代码将根据所有必要的输入创建一个代币
    const tokenMint = await token.createMint(
    connection, // 连接信息
    payer, // 付款方
    payer.publicKey, // 你的钱包公钥
    payer.publicKey, // 冻结权限
    2 // 小数位数
    );

    接下来,我们创建一个Metaplex对象,以便我们可以创建Metaplex元数据,并将其上传到BundlrStorage中。

    // 创建一个Metaplex对象,这样我们就可以创建Metaplex元数据了
    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文件夹中的图像文件,并将元数据上传到存储空间中。

    // 读取图像文件
    const imageBuffer = fs.readFileSync(TOKEN_IMAGE_PATH);
    const file = toMetaplexFile(imageBuffer, TOKEN_IMAGE_NAME);
    const imageUri = await metaplex.storage().upload(file);
    // 上传其余的离线元数据
    const { uri } = await metaplex
    .nfts()
    .uploadMetadata({
    name: TOKEN_NAME,
    description: TOKEN_DESCRIPTION,
    image: imageUri,
    });

    一旦我们成功将图像上传到Metaplex,我们就可以通过调用以下部分来查找元数据存储的地址。

    // 查找元数据存储的地址
    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]
    )

    这部分代码将创建一个代币,并将其所需的所有输入与其关联起来。它还会读取图像文件,上传文件,并完成为你的代币创建完整元数据所需的其他操作。

    通过这样的操作,你将能够在Solana上成功创建并管理你的代币。

    🫙 元数据的存储

    现在,我们已经创建了带有特定元数据的代币铸造(薄荷)。下一步我们要将这些元数据信息存储到我们的文件夹中。让我们看看如何做到这一点:

    就在你定义了 transactionSignature 的代码下方,添加以下代码。

    fs.writeFileSync(
    "tokens/bld/cache.json",
    JSON.stringify({
    mint: tokenMint.toBase58(),
    imageUri: imageUri,
    metadataUri: uri,
    tokenMetadata: metadataPda.toBase58(),
    metadataTransaction: transactionSignature,
    })
    );

    太棒了!这样就完成了 createBldToken 函数的编写。现在,我们可以在下面的主函数中调用它。你的 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。你现在应该能够看到显示你选择图像的代币,就像下图所示。

    以上就是如何在Solana网络上创建和铸造你自己的代币的全部步骤。现在你已经成功地执行了这一过程,可以在Solana网络上与你的代币互动了。

    - +
    Skip to main content

    🎨 创建奖励代币

    既然我们已经铸造了一个NFT,那么接下来我们要探讨如何铸造一系列的NFT。为了达成这个目标,我们将采用Candy Machine——一款在Solana上广泛使用的程序,允许创作者将其资产上链。Candy MachineSolana上受到欢迎的原因在于,它具备了如机器人防护和安全随机化等实用功能。现在我们可以回归到我们自定义的NFT质押应用上来,借助我们在代币程序和Candy Machine上的经验来构建这个应用。

    请按照以下步骤操作:

    1. 在根目录中创建名为tokens的新文件夹。

    2. tokens文件夹内,我们要创建2个子文件夹,分别命名为bldcandy-machine,它们的结构应如下图所示:

    我们这样做的目的是整理建立Builder时所需的奖励代币和与我们的NFT有关的内容。

    1. 接下来,我们要创建资源文件夹,用于存放代币的图像。请进入你的bld文件夹,并创建名为assets的新文件夹。同时,在你的bld文件夹内,创建名为index.ts的新文件。目录结构应如下所示:
    ├── styles
    ├── tokens
    │ ├── bld
    | ├── assets
    | ├── index.ts

    注意:确保你的index.ts文件位于bld文件夹中,而不是在assets文件夹中。

    1. 你可能会发现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]
    )

    这段代码将创建一个代币,并与其关联所有必需的输入。它还会读取图像文件,上传文件,并执行其他必要操作,从而为你的代币创建完整的元数据。

    通过上述步骤,你将能够在Solana上成功创建并管理你的代币。

    🥳 代码解析

    好的,我们逐一分析一下上述代码的各个部分。

    首先,我们通过调用 createMint 函数来创建并初始化一个新的代币铸造。你可以通过这个链接了解更多有关该函数的信息。

    // 这段代码将根据所有必要的输入创建一个代币
    const tokenMint = await token.createMint(
    connection, // 连接信息
    payer, // 付款方
    payer.publicKey, // 你的钱包公钥
    payer.publicKey, // 冻结权限
    2 // 小数位数
    );

    接下来,我们创建一个Metaplex对象,以便我们可以创建Metaplex元数据,并将其上传到BundlrStorage中。

    // 创建一个Metaplex对象,这样我们就可以创建Metaplex元数据了
    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文件夹中的图像文件,并将元数据上传到存储空间中。

    // 读取图像文件
    const imageBuffer = fs.readFileSync(TOKEN_IMAGE_PATH);
    const file = toMetaplexFile(imageBuffer, TOKEN_IMAGE_NAME);
    const imageUri = await metaplex.storage().upload(file);
    // 上传其余的离线元数据
    const { uri } = await metaplex
    .nfts()
    .uploadMetadata({
    name: TOKEN_NAME,
    description: TOKEN_DESCRIPTION,
    image: imageUri,
    });

    一旦我们成功将图像上传到Metaplex,我们就可以通过调用以下部分来查找元数据存储的地址。

    // 查找元数据存储的地址
    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]
    )

    这部分代码将创建一个代币,并将其所需的所有输入与其关联起来。它还会读取图像文件,上传文件,并完成为你的代币创建完整元数据所需的其他操作。

    通过这样的操作,你将能够在Solana上成功创建并管理你的代币。

    🫙 元数据的存储

    现在,我们已经创建了带有特定元数据的代币铸造(薄荷)。下一步我们要将这些元数据信息存储到我们的文件夹中。让我们看看如何做到这一点:

    就在你定义了 transactionSignature 的代码下方,添加以下代码。

    fs.writeFileSync(
    "tokens/bld/cache.json",
    JSON.stringify({
    mint: tokenMint.toBase58(),
    imageUri: imageUri,
    metadataUri: uri,
    tokenMetadata: metadataPda.toBase58(),
    metadataTransaction: transactionSignature,
    })
    );

    太棒了!这样就完成了 createBldToken 函数的编写。现在,我们可以在下面的主函数中调用它。你的 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。你现在应该能够看到显示你选择图像的代币,就像下图所示。

    以上就是如何在Solana网络上创建和铸造你自己的代币的全部步骤。现在你已经成功地执行了这一过程,可以在Solana网络上与你的代币互动了。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/index.html b/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/index.html index 02075fb22..bf054ea03 100644 --- a/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/index.html +++ b/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/create-the-minting-ui/index.html @@ -5,13 +5,13 @@ 🎨 创建铸币用户界面 | All in One Solana - +
    -
    Skip to main content

    🎨 创建铸币用户界面

    现在我们成功创建了代币和非同质化代币(NFT),让我们继续着手构建我们的铸币用户界面。这样一来,我们就能直观地与智能合约互动,并允许他人在我们的浏览器上铸造我们的NFT。是不是非常酷?你可能已经注意到,你的网站上现有一个名为 minting 的按钮,但它目前尚未实现任何功能。让我们从定义一个函数开始,然后添加逻辑来允许我们铸造NFT。如果你没有起始代码,可以在这里克隆。

    首先,我们将以下代码添加到你的 newMint.tsx 文件中。注意:不要盲目地复制粘贴代码。我只提供了必要的部分,你需要明白这些代码应放在何处。提示:应该放在 Container 元素下方。

    // 你的其余代码
    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>
    {/* 你的其余代码 */}
    <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;
    }

    一旦完成,你应该看到以下代码结构。

    // 你的其余代码
    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])
    };

    注意到我们是如何在上述函数中调用 setMetadata(metadata) 的吗?这是为了让我们能够将元数据对象设置为状态,以便我们可以用它来渲染图像。现在让我们在 Image 元素中使用此对象。

    <Image src={metadata?.image ?? ""} alt="" />

    我们快完成了。如果你现在尝试铸造一个新的NFT,你可能会注意到网站会抛出一个错误,说它无法读取未定义的属性。我们可以通过在底部添加以下几行代码来修复这个问题。

    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的信息。

    - +
    Skip to main content

    🎨 创建铸币用户界面

    现在我们成功创建了代币和非同质化代币(NFT),让我们继续着手构建我们的铸币用户界面。这样一来,我们就能直观地与智能合约互动,并允许他人在我们的浏览器上铸造我们的NFT。是不是非常酷?你可能已经注意到,你的网站上现有一个名为 minting 的按钮,但它目前尚未实现任何功能。让我们从定义一个函数开始,然后添加逻辑来允许我们铸造NFT。如果你没有起始代码,可以在这里克隆。

    首先,我们将以下代码添加到你的 newMint.tsx 文件中。注意:不要盲目地复制粘贴代码。我只提供了必要的部分,你需要明白这些代码应放在何处。提示:应该放在 Container 元素下方。

    // 你的其余代码
    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>
    {/* 你的其余代码 */}
    <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;
    }

    一旦完成,你应该看到以下代码结构。

    // 你的其余代码
    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])
    };

    注意到我们是如何在上述函数中调用 setMetadata(metadata) 的吗?这是为了让我们能够将元数据对象设置为状态,以便我们可以用它来渲染图像。现在让我们在 Image 元素中使用此对象。

    <Image src={metadata?.image ?? ""} alt="" />

    我们快完成了。如果你现在尝试铸造一个新的NFT,你可能会注意到网站会抛出一个错误,说它无法读取未定义的属性。我们可以通过在底部添加以下几行代码来修复这个问题。

    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/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/index.html b/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/index.html index 5f0d7cdce..6f8415b79 100644 --- a/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/index.html +++ b/Solana-Co-Learn/module2/make-magic-internet-money-and-sell-jepgs/index.html @@ -5,13 +5,13 @@ 创造神奇的互联网货币并出售JPEG图片 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/index.html b/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/index.html index 52c401156..69cab6829 100644 --- a/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/index.html +++ b/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/candy-machine-and-the-sugar-cli/index.html @@ -5,13 +5,13 @@ 🍭 糖果机和Sugar CLI | All in One Solana - +
    -
    Skip to main content

    🍭 糖果机和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

    这些命令与我们在本地客户端脚本中执行的操作相同,只不过现在是在终端中完成。这样,你就为在Solana上创建一系列NFT做好了准备。

    🍬 创建你的珍藏品

    这可能是整个构建过程中最具挑战的部分:确定你想要制作的NFT收藏品的内容。你至少需要准备5张图片,每张图片对应收藏中的一个NFT。我挑选了一些经典的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会显示非常有用的错误信息,所以如果遇到困难,只需仔细阅读,通常就能找到解决方案。

    如果一切顺利,最终你会看到一个绿色的“命令成功”消息。在消息上方,你会看到一个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 MachineSugar CLI的潜力。未来我们还会深入探讨更多内容——本节的目的是让你具备足够的基础知识,以便能够自主深入研究。随着我们对NFT项目的不断完善,我们将继续探索。

    🚢 挑战

    让我们再享受一会儿糖果机的乐趣吧!🍭

    通过更新 config.json 文件并运行 sugar update 命令,你可以挖掘创造力并尝试不同的糖果机配置。

    例如:

    • 修改 goLiveDate
    • 启用 gatekeeper(验证码功能)
    • 启用 whitelistMintSettings
      • 需要创建令牌
    • 使用 splToken 来代替本地的sol进行付款
      • 需要创建令牌

    想了解更多提示和文档,请访问:

    https://docs.metaplex.com/developer-tools/sugar/learning/settings

    - +
    Skip to main content

    🍭 糖果机和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

    这些命令与我们在本地客户端脚本中执行的操作相同,只不过现在是在终端中完成。这样,你就为在Solana上创建一系列NFT做好了准备。

    🍬 创建你的珍藏品

    这可能是整个构建过程中最具挑战的部分:确定你想要制作的NFT收藏品的内容。你至少需要准备5张图片,每张图片对应收藏中的一个NFT。我挑选了一些经典的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会显示非常有用的错误信息,所以如果遇到困难,只需仔细阅读,通常就能找到解决方案。

    如果一切顺利,最终你会看到一个绿色的“命令成功”消息。在消息上方,你会看到一个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 MachineSugar 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/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/index.html b/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/index.html index 1ed83f341..b8508cbc1 100644 --- a/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/index.html +++ b/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/index.html @@ -5,13 +5,13 @@ NFTs & Minting with Metaplex | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/index.html b/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/index.html index bba7e3736..f158d031f 100644 --- a/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/index.html +++ b/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nft-your-face/index.html @@ -5,13 +5,13 @@ 🤨 NFT你的脸 | All in One Solana - +
    -
    Skip to main content

    🤨 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() {
    ...

    // 将文件读取为缓冲区
    const buffer = fs.readFileSync("src/" + imageFile)

    // 将缓冲区转换为Metaplex文件
    const file = toMetaplexFile(buffer, imageFile)

    // 上传图像并获取图像URI
    const imageUri = await metaplex.storage().upload(file)
    console.log("图像URI:", imageUri)
    }

    最后,我们可以使用我们得到的图像URI上传元数据:

    async function main() {
    ...

    // 上传元数据并获取元数据URI(链下元数据)
    const { uri } = await metaplex
    .nfts()
    .uploadMetadata({
    name: tokenName,
    description: description,
    image: imageUri,
    })

    console.log("元数据URI:", uri)
    }

    在这里,创建一个专门的铸造NFT功能是个不错的主意,将其放在主函数之外:

    // 创建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(
    `代币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
    ) {
    // 通过薄荷地址获取 "NftWithToken" 类型
    const nft = await metaplex.nfts().findByMint({ mintAddress })

    // 省略任何保持不变的字段
    await metaplex
    .nfts()
    .update({
    nftOrSft: nft,
    name: tokenName,
    symbol: symbol,
    uri: uri,
    sellerFeeBasisPoints: sellerFeeBasisPoints,
    })

    console.log(
    `代币Mint地址:https://explorer.solana.com/address/${nft.address.toString()}?cluster=devnet`
    )
    }

    现在,在主函数中,你可以注释掉 createNFT 的调用,并使用新的 updateNFT 辅助函数:

    async function main() {

    ...

    // 你可以暂时注释掉 createNft 的调用
    // await createNft(metaplex, uri)

    // 你可以从Solana Explorer的URL中获取薄荷地址
    const mintAddress = new PublicKey("EPd324PkQx53Cx2g2B9ZfxVmu6m6gyneMaoWTy2hk2bW")
    await updateNft(metaplex, uri, mintAddress)
    }

    你可以从在铸造NFT时记录的URL中获取薄荷地址。它出现在多个位置 - URL本身、"地址"属性和元数据选项卡中。

    如此一来,你就可以轻松地更新你的NFT的图像和其他相关信息了。

    这一系列操作既简单又直观,现在你已经掌握了在Solana上创建和更新NFT的完整流程!

    - +
    Skip to main content

    🤨 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() {
    ...

    // 将文件读取为缓冲区
    const buffer = fs.readFileSync("src/" + imageFile)

    // 将缓冲区转换为Metaplex文件
    const file = toMetaplexFile(buffer, imageFile)

    // 上传图像并获取图像URI
    const imageUri = await metaplex.storage().upload(file)
    console.log("图像URI:", imageUri)
    }

    最后,我们可以使用我们得到的图像URI上传元数据:

    async function main() {
    ...

    // 上传元数据并获取元数据URI(链下元数据)
    const { uri } = await metaplex
    .nfts()
    .uploadMetadata({
    name: tokenName,
    description: description,
    image: imageUri,
    })

    console.log("元数据URI:", uri)
    }

    在这里,创建一个专门的铸造NFT功能是个不错的主意,将其放在主函数之外:

    // 创建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(
    `代币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
    ) {
    // 通过薄荷地址获取 "NftWithToken" 类型
    const nft = await metaplex.nfts().findByMint({ mintAddress })

    // 省略任何保持不变的字段
    await metaplex
    .nfts()
    .update({
    nftOrSft: nft,
    name: tokenName,
    symbol: symbol,
    uri: uri,
    sellerFeeBasisPoints: sellerFeeBasisPoints,
    })

    console.log(
    `代币Mint地址:https://explorer.solana.com/address/${nft.address.toString()}?cluster=devnet`
    )
    }

    现在,在主函数中,你可以注释掉 createNFT 的调用,并使用新的 updateNFT 辅助函数:

    async function main() {

    ...

    // 你可以暂时注释掉 createNft 的调用
    // await createNft(metaplex, uri)

    // 你可以从Solana Explorer的URL中获取薄荷地址
    const mintAddress = new PublicKey("EPd324PkQx53Cx2g2B9ZfxVmu6m6gyneMaoWTy2hk2bW")
    await updateNft(metaplex, uri, mintAddress)
    }

    你可以从在铸造NFT时记录的URL中获取薄荷地址。它出现在多个位置 - URL本身、"地址"属性和元数据选项卡中。

    如此一来,你就可以轻松地更新你的NFT的图像和其他相关信息了。

    这一系列操作既简单又直观,现在你已经掌握了在Solana上创建和更新NFT的完整流程!

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/index.html b/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/index.html index 14bcba958..d173b86a1 100644 --- a/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/index.html +++ b/Solana-Co-Learn/module2/nfts-and-minting-with-metaplex/nfts-one-solana/index.html @@ -5,13 +5,13 @@ 🎨 Solana上的NFT | All in One Solana - +
    -
    Skip to main content

    🎨 Solana上的NFT

    我们来了,不过花了不了多长时间。猴子画像、猩猩、岩石,以及其他一些看起来丑陋却能卖到10万美元的动物主题头像。这就是NFT

    与以太坊不同,Solana上铸造NFT非常便宜,这使得它们更加有趣。即使在熊市的时候,在以太坊上铸造一个NFT可能只需要5美元,这感觉有些乏味。为什么我要花5美元来永久保留我的梗图呢?

    🫣 NFT就是代币

    Solana上NFT价格便宜的一个重要原因是它们并不是一些特殊的代码,它们只是普通的代币,附加了一些额外的数据。

    第一个主要的区别在于铸造账户。对于NFT来说,铸造账户:

    • 供应量为1,意味着只有一枚代币在流通。
    • 没有小数点,意味着你不能拥有0.5个代币这样的东西。
    • 没有铸造权限,意味着没有人可以铸造更多的代币。

    正如你可能猜到的,额外的数据存储在程序派生的账户中。让我们一起来认识一下这些新账户吧 :D

    🐙 主版本(Master Edition)账户

    Token Metadata程序为NFT提供了另一个特殊的账户类型,称为Master Edition账户。它不会废除铸币权,而是将铸币和冻结权限转移到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,所有这些都变得简单容易。它让你能够轻松创建和更新NFT,只需提供最基本的信息,它就会自动填充其余的默认值。

    和令牌元数据一样,我们将使用相同的流程来:

    • 上传一张图片;
    • 上传元数据;
    • 然后使用元数据URI创建一个NFT

    你能想象代码会是什么样子吗?在我们开始之前,试着在脑海中描绘它,然后我们一起来编写实现吧 :)

    - +
    Skip to main content

    🎨 Solana上的NFT

    我们来了,不过花了不了多长时间。猴子画像、猩猩、岩石,以及其他一些看起来丑陋却能卖到10万美元的动物主题头像。这就是NFT

    与以太坊不同,Solana上铸造NFT非常便宜,这使得它们更加有趣。即使在熊市的时候,在以太坊上铸造一个NFT可能只需要5美元,这感觉有些乏味。为什么我要花5美元来永久保留我的梗图呢?

    🫣 NFT就是代币

    Solana上NFT价格便宜的一个重要原因是它们并不是一些特殊的代码,它们只是普通的代币,附加了一些额外的数据。

    第一个主要的区别在于铸造账户。对于NFT来说,铸造账户:

    • 供应量为1,意味着只有一枚代币在流通。
    • 没有小数点,意味着你不能拥有0.5个代币这样的东西。
    • 没有铸造权限,意味着没有人可以铸造更多的代币。

    正如你可能猜到的,额外的数据存储在程序派生的账户中。让我们一起来认识一下这些新账户吧 :D

    🐙 主版本(Master Edition)账户

    Token Metadata程序为NFT提供了另一个特殊的账户类型,称为Master Edition账户。它不会废除铸币权,而是将铸币和冻结权限转移到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,所有这些都变得简单容易。它让你能够轻松创建和更新NFT,只需提供最基本的信息,它就会自动填充其余的默认值。

    和令牌元数据一样,我们将使用相同的流程来:

    • 上传一张图片;
    • 上传元数据;
    • 然后使用元数据URI创建一个NFT

    你能想象代码会是什么样子吗?在我们开始之前,试着在脑海中描绘它,然后我们一起来编写实现吧 :)

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/index.html b/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/index.html index a301efb68..6fed2527b 100644 --- a/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/index.html +++ b/Solana-Co-Learn/module2/spl-token/give-your-token-an-identity/index.html @@ -5,15 +5,15 @@ 🧬 为你的代币赋予身份 | All in One Solana - +
    Skip to main content

    🧬 为你的代币赋予身份

    现在是时候让代币与它们的创造者(也就是你)相遇了。我们将在之前构建的基础上继续前进。如果需要,你可以从这个链接获取起始代码(确保你处于 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文件。
    2. 使用 metaplex.storage().upload 方法上传图片。
    3. 使用 metaplex.uploadMetadata() 方法上传链下元数据。
    4. 使用 findMetadataPda() 方法推导出元数据账户的程序派生地址(PDA)。
    5. 构建类型为 DataV2 的链上数据格式。
    6. 使用 createCreateMetadataAccountV2Instruction 方法创建元数据账户的构建指令(不是拼写错误哦)。
    7. 发送带有指令的交易,以创建令牌元数据账户。

    这里涉及许多步骤,但都是基础操作。花一点时间仔细阅读,你就能完全理解正在发生的事情!

    我们将创建一个单一的函数来完成所有这些操作:

    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
    )
    }

    更新Mnint地址和代币详情,然后运行 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

    🚢 挑战

    年轻的区块链探索者,现在是时候重新运用所学的课程概念从头开始构建了。

    你的挑战是尝试构建一个包含以下指令的单个交易:

    • 创建一个新的代币铸造;
    • 为代币铸造创建一个元数据账户;
    • 创建一个代币账户;
      • 如果可能,请尝试有条件地添加此指令;
      • 请参考 getOrCreateAssociatedTokenAccount 的实现方案;
      • 提示:链接
    • 铸造代币。

    这基本上就是你在生产环境中要完成的任务 - 将所有操作一次性地整合到一起。

    注意 这个挑战比平常更自由。挑战自己,尝试并真正努力理解每个拼图的组成部分。

    要按照我们设想的方式进行操作,你需要逐步构建每个指令,然后将它们全部添加到一个事务中。在你自己尝试解决这个问题后,你可以在此存储库的挑战分支中查看一个可能的实现。

    额外的提示:链接 - 直接查看源代码,不要依赖辅助函数。让这个挑战成为你Solana技能的飞跃!加油!

    Reference

    - +
  • Token Program
  • 与代币交互
  • + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/spl-token/index.html b/Solana-Co-Learn/module2/spl-token/index.html index 0dc077b70..63e3fad21 100644 --- a/Solana-Co-Learn/module2/spl-token/index.html +++ b/Solana-Co-Learn/module2/spl-token/index.html @@ -5,13 +5,13 @@ SPL代币 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/index.html b/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/index.html index 02cd8bd16..94ec13ae4 100644 --- a/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/index.html +++ b/Solana-Co-Learn/module2/spl-token/mint-token-on-solana/index.html @@ -5,13 +5,13 @@ 🏧 在Solana上铸造代币 | All in One Solana - +
    -
    Skip to main content

    🏧 在Solana上铸造代币

    话不多说,让我们来创造一些神奇的互联网货币吧。在我们的最终项目中,我们将创建一个代币,你将随着抵押你的社区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 Mint的账户
    2. 为特定钱包创建关联的token账户
    3. Mint代币发送到该钱包

    下面是src/index.ts文件中的第一步,可以在导入之后、main()函数之前加入如下代码:

    // 在文件顶部添加spl-token导入
    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(`代币铸造账户地址为 ${tokenMint}`)
    console.log(
    `Token Mint: https://explorer.solana.com/address/${tokenMint}?cluster=devnet`
    );

    return tokenMint;
    }

    这段代码应该看起来很熟悉。如果不是,请回头再阅读一遍上一节的内容 😠。

    接下来,我们需要创建关联的令牌账户,在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可能不同 - 你可以为他人的账户支付费用。这可能相当昂贵,因为你将为他们的账户支付“租金”,所以在进行此操作之前,请确保计算好费用。

    最后,铸币功能的实现:

    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(
    `铸币交易链接:https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
    )
    }

    接下来的部分描述了如何在主函数中调用这些函数,包括创建代币Mint账户、运行程序、查看结果以及在Solana区块链上转移和销毁代币的示例代码。

    让我们在主函数中集成这些功能,以下是我编写的代码:

    async function main() {
    const connection = new web3.Connection(web3.clusterApiUrl("devnet"));
    const user = await initializeKeypair(connection);

    console.log("公钥:", user.publicKey.toBase58());

    const mint = await createNewMint(
    connection,
    user, // 我们支付费用
    user.publicKey, // 我们是铸币权限者
    user.publicKey, // 以及冻结权限者 >:)
    2 // 只有两个小数位!
    );

    const tokenAccount = await createTokenAccount(
    connection,
    user,
    mint,
    user.publicKey // 将我们的地址与代币账户关联
    );

    // 向我们的地址铸造100个代币
    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`
    )
    }

    虽然这些函数看起来很长,但其实只是因为我给每个参数都单独占了一行,实际上它们只有三行代码,哈哈。

    调用它们也同样简单:

    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)
    }

    现在你可以自由玩弄转账功能,向你的钱包地址发送一些代币,看看效果如何。这是我看到的界面:

    嗯...显示为未知?让我们一起来修复这个问题吧!

    - +
    Skip to main content

    🏧 在Solana上铸造代币

    话不多说,让我们来创造一些神奇的互联网货币吧。在我们的最终项目中,我们将创建一个代币,你将随着抵押你的社区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 Mint的账户
    2. 为特定钱包创建关联的token账户
    3. Mint代币发送到该钱包

    下面是src/index.ts文件中的第一步,可以在导入之后、main()函数之前加入如下代码:

    // 在文件顶部添加spl-token导入
    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(`代币铸造账户地址为 ${tokenMint}`)
    console.log(
    `Token Mint: https://explorer.solana.com/address/${tokenMint}?cluster=devnet`
    );

    return tokenMint;
    }

    这段代码应该看起来很熟悉。如果不是,请回头再阅读一遍上一节的内容 😠。

    接下来,我们需要创建关联的令牌账户,在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可能不同 - 你可以为他人的账户支付费用。这可能相当昂贵,因为你将为他们的账户支付“租金”,所以在进行此操作之前,请确保计算好费用。

    最后,铸币功能的实现:

    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(
    `铸币交易链接:https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
    )
    }

    接下来的部分描述了如何在主函数中调用这些函数,包括创建代币Mint账户、运行程序、查看结果以及在Solana区块链上转移和销毁代币的示例代码。

    让我们在主函数中集成这些功能,以下是我编写的代码:

    async function main() {
    const connection = new web3.Connection(web3.clusterApiUrl("devnet"));
    const user = await initializeKeypair(connection);

    console.log("公钥:", user.publicKey.toBase58());

    const mint = await createNewMint(
    connection,
    user, // 我们支付费用
    user.publicKey, // 我们是铸币权限者
    user.publicKey, // 以及冻结权限者 >:)
    2 // 只有两个小数位!
    );

    const tokenAccount = await createTokenAccount(
    connection,
    user,
    mint,
    user.publicKey // 将我们的地址与代币账户关联
    );

    // 向我们的地址铸造100个代币
    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`
    )
    }

    虽然这些函数看起来很长,但其实只是因为我给每个参数都单独占了一行,实际上它们只有三行代码,哈哈。

    调用它们也同样简单:

    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/Solana-Co-Learn/module2/spl-token/the-token-program/index.html b/Solana-Co-Learn/module2/spl-token/the-token-program/index.html index cdbd1461f..9741d7834 100644 --- a/Solana-Co-Learn/module2/spl-token/the-token-program/index.html +++ b/Solana-Co-Learn/module2/spl-token/the-token-program/index.html @@ -5,13 +5,13 @@ 💵 Token Program | All in One Solana - +
    -
    Skip to main content

    💵 Token Program

    作为区块链最基本的承诺,这些代币也许是你安装钱包的主要原因,它们是区块链上资产最纯粹的表现形式,从合成股票到数百种狗币。

    本课将主要讲解在Solana上代币是如何工作的。如果你对其他区块链有所了解,可能会发现这里存在一些差异,所以尽量不要与你当前对代币的理解联系起来。

    探讨Solana中代币的工作原理也是一个深入了解不同程序如何使用账户的绝佳机会。你越深入了解Solana,就越能意识到账户的重要性。虽然它们在文件系统中的抽象和灵活性与文件类似,但这也意味着任何特定程序上的账户可能变得相当复杂!初开始可能会感到混乱,但随着时间的推移,它会变得更加清晰。

    Solana上的代币是通过Solana Token Program来创建和管理的,它是Solana Program Library(SPL)的一部分程序。常规代币和非同质化代币(NFTs)都属于Solana程序库中的代币类型。今天我们不会涉及NFTs,但不要担心,我们会很快介绍。

    🗃 账户关系

    首先,我们要了解一下整体情况。Token Program需要三个必要的账户:

    • Wallet Account - 就是你的钱包!
    • Mint Account - 存储关于代币铸造的元数据
    • Token Account - 与钱包关联,存储有关特定钱包的信息,例如它持有多少代币。

    现在让我们深入了解每个账户,看看它们的内部情况。

    🌌 铸币账户(Mint Account)

    铸币账户存储关于代币本身的元数据,不是关于你对代币的所有权,而是涉及代币的更广泛内容。它具有以下属性:

    • mint authority - 只有一个账户可以从铸币账户签名并铸造代币。创建铸币账户时,必须指定铸币权限,可以是你的个人钱包或其他程序。
    • supply - 存在的总代币数量。“supply”基本上是在说:“码农大神,你好!这是发行的总代币数量。”
    • decimals - 这是我们允许代币被分割的小数位数,即代币的精度。这可能会有些棘手,因为实际上链上没有小数。整个供应量表示为整数,所以你必须进行数学计算以在小数之间进行转换。例如,如果你将小数位数设置为两位,而你的供应量是一百,那么实际上你只有一个代币。供应量中只有一个代币,但你允许它被分割成较小的面额。
    • Is Initialized - 基本上指的是该账户是否已准备就绪。这与账户本身有关,而不是代币程序
    • Freeze authority - 冻结权限与mint authority类似,表示一个人或程序具有冻结(或铸造)代币的权限。

    将铸币权限设置为你的钱包是一种相当标准的做法。你可以铸造任何你想要的代币,然后撤销铸币权限,基本上意味着未来不会再有更多的供应量。或者,如果你有某种动态发行代币的方式,常见的做法是将其放入权限中,作为一个程序来管理代币的铸造。

    冻结权限的工作方式相同。

    👛 代币账户(Token Account)

    你可能已经注意到了生态系统中流通的众多不同代币。你的钱包里现在可能充满了各种各样的代币。但是,网络是如何识别你持有某些代币的呢?答案就在于存储这些数据的账户!最好的方式就是通过关联代币账户来实现。下面这张图可以帮助你理解:

    这就是数据关系和账户属性的示例图。

    Token账户必须与用户或钱包关联。一种简便的方式是创建一个PDA(程序衍生地址),其地址将铸币账户和钱包连接在一起。令牌账户PDA的种子由铸币账户的地址和钱包地址组成(其中令牌程序ID是默认存在的)。

    虽然包括了很多不同的信息,但现在你只需要理解的是,你的钱包并不直接持有具体的代币。它与一个存储了代币数量的关联账户有关。此外,还有一个铸币账户,存储了有关所有代币和铸币的更广泛信息。

    请花些时间仔细研究这个图表,对不明白的部分进行搜索(例如关联的令牌程序究竟是什么?)。处理了所有复杂的部分后,这一切将变得非常简单!

    🤑 代币铸造过程

    别再盯着图表看了,让我们来深入一些代码,了解这一切是如何实现的。

    要创建一个新的SPL-Token,首先必须创建一个Token Mint(一个存储该特定代币相关数据的账户)。

    你可以将这个过程想象为制作比萨饼。你需要食谱(关于代币的数据)、食材(铸币账户和钱包地址),还有一个人将它们组合在一起(派生一个新的PDA)。就像制作比萨一样,只要你有正确的食材并按照食谱操作,最终你就能得到一枚美味的新代币!

    由于Token ProgramSPL的一部分,你可以使用 @solana/spl-token TypeScript SDK相当轻松地进行创建交易。

    下面是一个createMint的示例:

    const tokenMint = await createMint(
    connection,
    payer,
    mintAuthority,
    freezeAuthority,
    decimals,
    )

    你需要以下参数:

    • connection - 与集群的JSON-RPC连接
    • payer - 付款方交易的公钥
    • mintAuthority - 被授权铸造新代币的账户
    • freezeAuthority - 被授权冻结代币的账户。如果你不想冻结代币,请将其设置为null
    • decimals - 指定代币所需的小数精度

    完成这个步骤后,你可以继续以下步骤:

    • 创建关联的Token账户
    • 将代币铸造到某个账户中
    • 如果你想通过转账功能空投到多个账户

    你在 @solana/spl-token SDK中需要的一切都已准备好。如果你对某个具体部分感兴趣,可以查看文档

    在大多数情况下,@solana/spl-token SDK就足够了,你无需自己创建原始交易。

    此外,一个有趣的附注——如果出于某种原因,你想要在创建铸币指令的同时创建另一个指令,你可以自己创建这些指令,并将它们组合成一个事务,以确保所有操作都是原子性的。也许你正在构建一个高度保密的代币程序,你希望在铸币后立即锁定所有代币,使没有人能够转移它们。

    不用说,围绕这些代币发生了许多有趣的事情。你可以在此处了解每个功能背后的工作原理,甚至还可以查看一些关于销毁代币等的说明。:)

    参考资料

    - +
    Skip to main content

    💵 Token Program

    作为区块链最基本的承诺,这些代币也许是你安装钱包的主要原因,它们是区块链上资产最纯粹的表现形式,从合成股票到数百种狗币。

    本课将主要讲解在Solana上代币是如何工作的。如果你对其他区块链有所了解,可能会发现这里存在一些差异,所以尽量不要与你当前对代币的理解联系起来。

    探讨Solana中代币的工作原理也是一个深入了解不同程序如何使用账户的绝佳机会。你越深入了解Solana,就越能意识到账户的重要性。虽然它们在文件系统中的抽象和灵活性与文件类似,但这也意味着任何特定程序上的账户可能变得相当复杂!初开始可能会感到混乱,但随着时间的推移,它会变得更加清晰。

    Solana上的代币是通过Solana Token Program来创建和管理的,它是Solana Program Library(SPL)的一部分程序。常规代币和非同质化代币(NFTs)都属于Solana程序库中的代币类型。今天我们不会涉及NFTs,但不要担心,我们会很快介绍。

    🗃 账户关系

    首先,我们要了解一下整体情况。Token Program需要三个必要的账户:

    • Wallet Account - 就是你的钱包!
    • Mint Account - 存储关于代币铸造的元数据
    • Token Account - 与钱包关联,存储有关特定钱包的信息,例如它持有多少代币。

    现在让我们深入了解每个账户,看看它们的内部情况。

    🌌 铸币账户(Mint Account)

    铸币账户存储关于代币本身的元数据,不是关于你对代币的所有权,而是涉及代币的更广泛内容。它具有以下属性:

    • mint authority - 只有一个账户可以从铸币账户签名并铸造代币。创建铸币账户时,必须指定铸币权限,可以是你的个人钱包或其他程序。
    • supply - 存在的总代币数量。“supply”基本上是在说:“码农大神,你好!这是发行的总代币数量。”
    • decimals - 这是我们允许代币被分割的小数位数,即代币的精度。这可能会有些棘手,因为实际上链上没有小数。整个供应量表示为整数,所以你必须进行数学计算以在小数之间进行转换。例如,如果你将小数位数设置为两位,而你的供应量是一百,那么实际上你只有一个代币。供应量中只有一个代币,但你允许它被分割成较小的面额。
    • Is Initialized - 基本上指的是该账户是否已准备就绪。这与账户本身有关,而不是代币程序
    • Freeze authority - 冻结权限与mint authority类似,表示一个人或程序具有冻结(或铸造)代币的权限。

    将铸币权限设置为你的钱包是一种相当标准的做法。你可以铸造任何你想要的代币,然后撤销铸币权限,基本上意味着未来不会再有更多的供应量。或者,如果你有某种动态发行代币的方式,常见的做法是将其放入权限中,作为一个程序来管理代币的铸造。

    冻结权限的工作方式相同。

    👛 代币账户(Token Account)

    你可能已经注意到了生态系统中流通的众多不同代币。你的钱包里现在可能充满了各种各样的代币。但是,网络是如何识别你持有某些代币的呢?答案就在于存储这些数据的账户!最好的方式就是通过关联代币账户来实现。下面这张图可以帮助你理解:

    这就是数据关系和账户属性的示例图。

    Token账户必须与用户或钱包关联。一种简便的方式是创建一个PDA(程序衍生地址),其地址将铸币账户和钱包连接在一起。令牌账户PDA的种子由铸币账户的地址和钱包地址组成(其中令牌程序ID是默认存在的)。

    虽然包括了很多不同的信息,但现在你只需要理解的是,你的钱包并不直接持有具体的代币。它与一个存储了代币数量的关联账户有关。此外,还有一个铸币账户,存储了有关所有代币和铸币的更广泛信息。

    请花些时间仔细研究这个图表,对不明白的部分进行搜索(例如关联的令牌程序究竟是什么?)。处理了所有复杂的部分后,这一切将变得非常简单!

    🤑 代币铸造过程

    别再盯着图表看了,让我们来深入一些代码,了解这一切是如何实现的。

    要创建一个新的SPL-Token,首先必须创建一个Token Mint(一个存储该特定代币相关数据的账户)。

    你可以将这个过程想象为制作比萨饼。你需要食谱(关于代币的数据)、食材(铸币账户和钱包地址),还有一个人将它们组合在一起(派生一个新的PDA)。就像制作比萨一样,只要你有正确的食材并按照食谱操作,最终你就能得到一枚美味的新代币!

    由于Token ProgramSPL的一部分,你可以使用 @solana/spl-token TypeScript SDK相当轻松地进行创建交易。

    下面是一个createMint的示例:

    const tokenMint = await createMint(
    connection,
    payer,
    mintAuthority,
    freezeAuthority,
    decimals,
    )

    你需要以下参数:

    • connection - 与集群的JSON-RPC连接
    • payer - 付款方交易的公钥
    • mintAuthority - 被授权铸造新代币的账户
    • freezeAuthority - 被授权冻结代币的账户。如果你不想冻结代币,请将其设置为null
    • decimals - 指定代币所需的小数精度

    完成这个步骤后,你可以继续以下步骤:

    • 创建关联的Token账户
    • 将代币铸造到某个账户中
    • 如果你想通过转账功能空投到多个账户

    你在 @solana/spl-token SDK中需要的一切都已准备好。如果你对某个具体部分感兴趣,可以查看文档

    在大多数情况下,@solana/spl-token SDK就足够了,你无需自己创建原始交易。

    此外,一个有趣的附注——如果出于某种原因,你想要在创建铸币指令的同时创建另一个指令,你可以自己创建这些指令,并将它们组合成一个事务,以确保所有操作都是原子性的。也许你正在构建一个高度保密的代币程序,你希望在铸币后立即锁定所有代币,使没有人能够转移它们。

    不用说,围绕这些代币发生了许多有趣的事情。你可以在此处了解每个功能背后的工作原理,甚至还可以查看一些关于销毁代币等的说明。:)

    参考资料

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module2/spl-token/token-metadata/index.html b/Solana-Co-Learn/module2/spl-token/token-metadata/index.html index e77e7d45d..7b16809c9 100644 --- a/Solana-Co-Learn/module2/spl-token/token-metadata/index.html +++ b/Solana-Co-Learn/module2/spl-token/token-metadata/index.html @@ -5,13 +5,13 @@ 🧮 令牌元数据 | All in One Solana - +
    -
    Skip to main content

    🧮 令牌元数据

    Token元数据指的是代币的基本信息,例如名称、符号和标志。注意你钱包中的各种代币都拥有这些特性,除了你自己创建的代币。

    这就是所有的元数据!这适用于所有代币,不仅仅是可替代代币。在Solana上,NFT与任何其他代币无异,只不过通过属性(例如小数位)来定义它们作为NFT

    所有这些都是通过Token Metadata Program实现的 - 这是处理Solana区块链上的TokenNFT时最重要的程序之一。它的主要任务是将额外数据附加到Solana上的可替代或不可替代Token。它使用从Mint账户地址派生的程序派生地址(PDAs)来实现这个目标。

    🎭 令牌元数据账户

    一旦我们制造了一个闪亮的新代币,我们需要使其更具吸引力。我们将使用Token Metadata Program来完成这个任务,以下是生成的账户样式:

    这被称为元数据账户。它能存储有关特定代币铸造账户的各种信息。你会注意到一个 URI(统一资源标识符)属性 - 它指向链下的一个JSON文件,主要用于非同质化代币(NFT)。由于链下部分不受链上费用限制,你可以存储高质量图形和其他大型数据对象。

    元数据账户有许多属性,你不需要了解其中大部分。我们将在需要时深入探讨相关部分。现在,我们只关心链下部分,这是我们制作Pizzacoin所需的第一步。

    🖼 代币标准

    链下部分遵循Metaplex代币标准,基本上是一种格式,你需要按照这个格式来实现不同类型的代币元数据。我们在元数据账户链上部分的 Token Standard 字段中通知网络上的所有应用程序我们的代币类型。我们的选择有:

    • NonFungible:带有主版本的非同质化代币(NFTs)。
    • FungibleAsset:具有元数据和属性的代币,有时也被称为半可替代代币(例如游戏物品)。
    • Fungible:具有简单元数据的代币(如USDC或SOL这样的常规代币)。
    • NonFungibleEdition:一个具有Edition账户的非同质化代币(从主版中打印出来的,例如100个中的1个)。

    Metaplex Token标准在整个行业中得到了广泛接受。各种应用程序、交易所和钱包都希望令牌符合此标准。Token标准由Token元数据程序自动设置,不能手动更新。以下是它如何决定应用正确的标准:

    • 如果令牌拥有主版本账户,则为 NonFungible
    • 如果令牌具有Edition账户,则为 NonFungibleEdition
    • 如果代币没有(主)版账户(确保其供应量大于1)并且使用零位小数,那么它是 FungibleAsset
    • 如果代币没有(主)版账户(确保其供应量大于1)并且使用至少一位小数,那么它是 Fungible

    你现在可以忽略“Master Edition”是什么意思,Pizzacoin是完全可替代的,因此我们将专注于可替代代币。

    🧰 Metaplex SDK

    欢迎接触Solana上其中一款极为实用的SDK——Metaplex SDK。如果你之前在Solana上铸造过NFT,那么你很可能在毫不知情的情况下已经使用过Metaplex SDK了。我们将利用 @metaplex-foundation/js@metaplex-foundation/mpl-token-metadata 库来创建和我们的代币铸造项目相关联的元数据账户。现在是时候赋予Pizzacoin独一无二的身份了。

    我们首先将着手于链下部分,准备好后,再继续创建代币元数据账户。

    一般的操作流程如下:

    1. 安装Metaplex SDK——你可能会使用现有的密钥对。
    2. 上传一个图像作为代币标志——我们会使用本地文件,但SDK也支持直接从浏览器上传。
    3. 上传链下元数据(包括你上传的图像的URI),这样你就可以开始进行链上操作了。
    4. 生成元数据账户的程序派生地址(PDA,俗称“蛋”)。
    5. 创建链上的Token元数据账户,包括各种指令、交易等。

    感觉有些不确定吗?别担心,我们接下来会通过一些代码来帮助你消除疑虑 🤺。

    - +
    Skip to main content

    🧮 令牌元数据

    Token元数据指的是代币的基本信息,例如名称、符号和标志。注意你钱包中的各种代币都拥有这些特性,除了你自己创建的代币。

    这就是所有的元数据!这适用于所有代币,不仅仅是可替代代币。在Solana上,NFT与任何其他代币无异,只不过通过属性(例如小数位)来定义它们作为NFT

    所有这些都是通过Token Metadata Program实现的 - 这是处理Solana区块链上的TokenNFT时最重要的程序之一。它的主要任务是将额外数据附加到Solana上的可替代或不可替代Token。它使用从Mint账户地址派生的程序派生地址(PDAs)来实现这个目标。

    🎭 令牌元数据账户

    一旦我们制造了一个闪亮的新代币,我们需要使其更具吸引力。我们将使用Token Metadata Program来完成这个任务,以下是生成的账户样式:

    这被称为元数据账户。它能存储有关特定代币铸造账户的各种信息。你会注意到一个 URI(统一资源标识符)属性 - 它指向链下的一个JSON文件,主要用于非同质化代币(NFT)。由于链下部分不受链上费用限制,你可以存储高质量图形和其他大型数据对象。

    元数据账户有许多属性,你不需要了解其中大部分。我们将在需要时深入探讨相关部分。现在,我们只关心链下部分,这是我们制作Pizzacoin所需的第一步。

    🖼 代币标准

    链下部分遵循Metaplex代币标准,基本上是一种格式,你需要按照这个格式来实现不同类型的代币元数据。我们在元数据账户链上部分的 Token Standard 字段中通知网络上的所有应用程序我们的代币类型。我们的选择有:

    • NonFungible:带有主版本的非同质化代币(NFTs)。
    • FungibleAsset:具有元数据和属性的代币,有时也被称为半可替代代币(例如游戏物品)。
    • Fungible:具有简单元数据的代币(如USDC或SOL这样的常规代币)。
    • NonFungibleEdition:一个具有Edition账户的非同质化代币(从主版中打印出来的,例如100个中的1个)。

    Metaplex Token标准在整个行业中得到了广泛接受。各种应用程序、交易所和钱包都希望令牌符合此标准。Token标准由Token元数据程序自动设置,不能手动更新。以下是它如何决定应用正确的标准:

    • 如果令牌拥有主版本账户,则为 NonFungible
    • 如果令牌具有Edition账户,则为 NonFungibleEdition
    • 如果代币没有(主)版账户(确保其供应量大于1)并且使用零位小数,那么它是 FungibleAsset
    • 如果代币没有(主)版账户(确保其供应量大于1)并且使用至少一位小数,那么它是 Fungible

    你现在可以忽略“Master Edition”是什么意思,Pizzacoin是完全可替代的,因此我们将专注于可替代代币。

    🧰 Metaplex SDK

    欢迎接触Solana上其中一款极为实用的SDK——Metaplex SDK。如果你之前在Solana上铸造过NFT,那么你很可能在毫不知情的情况下已经使用过Metaplex SDK了。我们将利用 @metaplex-foundation/js@metaplex-foundation/mpl-token-metadata 库来创建和我们的代币铸造项目相关联的元数据账户。现在是时候赋予Pizzacoin独一无二的身份了。

    我们首先将着手于链下部分,准备好后,再继续创建代币元数据账户。

    一般的操作流程如下:

    1. 安装Metaplex SDK——你可能会使用现有的密钥对。
    2. 上传一个图像作为代币标志——我们会使用本地文件,但SDK也支持直接从浏览器上传。
    3. 上传链下元数据(包括你上传的图像的URI),这样你就可以开始进行链上操作了。
    4. 生成元数据账户的程序派生地址(PDA,俗称“蛋”)。
    5. 创建链上的Token元数据账户,包括各种指令、交易等。

    感觉有些不确定吗?别担心,我们接下来会通过一些代码来帮助你消除疑虑 🤺。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module3/index.html b/Solana-Co-Learn/module3/index.html index 9938f0c64..946425cd3 100644 --- a/Solana-Co-Learn/module3/index.html +++ b/Solana-Co-Learn/module3/index.html @@ -5,13 +5,13 @@ Solana Native 开发 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module3/introduction-to-rust/hello-world/index.html b/Solana-Co-Learn/module3/introduction-to-rust/hello-world/index.html index 5fa4de7b8..8deaee657 100644 --- a/Solana-Co-Learn/module3/introduction-to-rust/hello-world/index.html +++ b/Solana-Co-Learn/module3/introduction-to-rust/hello-world/index.html @@ -5,13 +5,13 @@ 📝 你好,世界 | All in One Solana - +
    -
    Skip to main content

    📝 你好,世界

    我们将在游乐场上制作一个简单的Hello World程序,这个程序只会在交易日志中记录一条消息,相当有趣。

    📦 Rust模块系统

    Solana上编写程序,我们会像对待客户一样用到一系列的库,免去了大量手动编写样板代码的麻烦。Rust采用一种被称为“模块系统”的方式来组织代码,它和Node.js中的模块或C++中的命名空间有许多相似之处。

    下面是一个直观的可视化展示:

    这个系统的三个部分包括:

    • package - 这是一个包含一组crate和用于指定元数据及包之间依赖关系的清单文件的包。你可以将其理解为Node.js中的 package.json
    • crate(木箱) - 一个crate可以是一个库或一个可执行程序。crate的源代码通常会被细分为多个模块。这就像一个Node.js模块。
    • module - 模块用于将代码分割成逻辑单元,为组织、作用域和路径的隐私提供了独立的命名空间。它们基本上是单独的文件和文件夹。

    🛣 路径和范围

    Crate模块可以在项目中被重复使用,就像你可以在React中重用组件和在Node中重用模块一样。比较棘手的是我们需要知道它们的路径才能引用它们。

    crate结构想象成一棵树,其中crate是树的基础,模块是树枝,每个模块可能有子模块或额外的分支。

    我们所需的其中一个事物是AccountInfo子模块中的account_info结构体,以下是它的样子:

    struct是一种自定义数据类型。把它想象成一种自定义的原始数据类型,就像字符串或整数一样,但与只存储一个值的原始类型不同,struct可以包含多个值。

    Rust中, :: 用作路径分隔符,就像 ./ 一样。因此,要引用 AccountInfo 结构体,我们可以这样写:

    use solana_program::account_info::AccountInfo;

    这里的层次结构是:

    • 基础cratesolana_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账户数据的通用描述符,它定义了账户应具备的所有属性。

    如果你以前从未使用过像TypeScriptJava这样的静态类型语言,你可能会想知道为什么我们要导入像 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中的函数

    Rust中的 fnTypescript中的function非常相似 —— 它们只需要参数、类型和返回类型。在 entrypoint! 宏下面添加以下内容:

    pub fn process_instruction(
    // 参数及其类型
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8]
    // 返回类型(即函数返回的数据类型)
    ) -> ProgramResult{
    // 暂时留空函数体
    }

    我们的 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。嗯,这里发生了什么呢🤔?

    这是因为SolanaProgramResult 类型是用Rust的 Result 类型实现的:

    pub type ProgramResult = Result<(), ProgramError>;

    Result 是一个标准库类型,代表两个离散的结果:

    • 成功( Ok
    • 失败 ( Err )
    pub enum Result<T, E> {
    Ok(T),
    Err(E),
    }

    把它理解成HTTP错误代码也许会更直观——200代表 Ok404代表 Err。因此,当我们返回 ProgramResult 时,实际上是在表示我们的函数可以返回 ()(一个空值)以示成功,或者通过自定义的 ProgramError 枚举来告知出现了何种问题。非常实用!

    我们所需要做的就是:

    pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8]
    ) -> ProgramResult{
    // 成功时返回 Ok()
    Ok(())
    }

    🚀 部署你的首个程序

    我们的程序现在已经接近完成了!唯一缺失的部分就是实际上输出“Hello World”,我们可以通过使用 msg! 宏来实现这一目的。由于我们暂时不会对指令数据进行任何操作,为了避免出现“未使用的变量”警告,只需在变量名前加上下划线即可。

    以下是 process_instruction 函数的完整样式:

    pub fn process_instruction(
    _program_id: &Pubkey,
    _accounts: &[AccountInfo],
    _instruction_data: &[u8]
    ) -> ProgramResult{
    msg!("Hello World!");
    Ok(())
    }

    如果你点击构建,控制台上应该会出现绿色的“构建成功”消息。恭喜你!你已经成功编写了你的第一个Solana程序🎉。

    在这个在线环境中部署程序非常便捷。只需切换到左上角的“构建和部署”选项卡,在“资源管理器”图标下方,点击“部署”按钮即可。

    - +
    Skip to main content

    📝 你好,世界

    我们将在游乐场上制作一个简单的Hello World程序,这个程序只会在交易日志中记录一条消息,相当有趣。

    📦 Rust模块系统

    Solana上编写程序,我们会像对待客户一样用到一系列的库,免去了大量手动编写样板代码的麻烦。Rust采用一种被称为“模块系统”的方式来组织代码,它和Node.js中的模块或C++中的命名空间有许多相似之处。

    下面是一个直观的可视化展示:

    这个系统的三个部分包括:

    • package - 这是一个包含一组crate和用于指定元数据及包之间依赖关系的清单文件的包。你可以将其理解为Node.js中的 package.json
    • crate(木箱) - 一个crate可以是一个库或一个可执行程序。crate的源代码通常会被细分为多个模块。这就像一个Node.js模块。
    • module - 模块用于将代码分割成逻辑单元,为组织、作用域和路径的隐私提供了独立的命名空间。它们基本上是单独的文件和文件夹。

    🛣 路径和范围

    Crate模块可以在项目中被重复使用,就像你可以在React中重用组件和在Node中重用模块一样。比较棘手的是我们需要知道它们的路径才能引用它们。

    crate结构想象成一棵树,其中crate是树的基础,模块是树枝,每个模块可能有子模块或额外的分支。

    我们所需的其中一个事物是AccountInfo子模块中的account_info结构体,以下是它的样子:

    struct是一种自定义数据类型。把它想象成一种自定义的原始数据类型,就像字符串或整数一样,但与只存储一个值的原始类型不同,struct可以包含多个值。

    Rust中, :: 用作路径分隔符,就像 ./ 一样。因此,要引用 AccountInfo 结构体,我们可以这样写:

    use solana_program::account_info::AccountInfo;

    这里的层次结构是:

    • 基础cratesolana_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账户数据的通用描述符,它定义了账户应具备的所有属性。

    如果你以前从未使用过像TypeScriptJava这样的静态类型语言,你可能会想知道为什么我们要导入像 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中的函数

    Rust中的 fnTypescript中的function非常相似 —— 它们只需要参数、类型和返回类型。在 entrypoint! 宏下面添加以下内容:

    pub fn process_instruction(
    // 参数及其类型
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8]
    // 返回类型(即函数返回的数据类型)
    ) -> ProgramResult{
    // 暂时留空函数体
    }

    我们的 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。嗯,这里发生了什么呢🤔?

    这是因为SolanaProgramResult 类型是用Rust的 Result 类型实现的:

    pub type ProgramResult = Result<(), ProgramError>;

    Result 是一个标准库类型,代表两个离散的结果:

    • 成功( Ok
    • 失败 ( Err )
    pub enum Result<T, E> {
    Ok(T),
    Err(E),
    }

    把它理解成HTTP错误代码也许会更直观——200代表 Ok404代表 Err。因此,当我们返回 ProgramResult 时,实际上是在表示我们的函数可以返回 ()(一个空值)以示成功,或者通过自定义的 ProgramError 枚举来告知出现了何种问题。非常实用!

    我们所需要做的就是:

    pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8]
    ) -> ProgramResult{
    // 成功时返回 Ok()
    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/Solana-Co-Learn/module3/introduction-to-rust/index.html b/Solana-Co-Learn/module3/introduction-to-rust/index.html index 2d55d0487..c0a3c885d 100644 --- a/Solana-Co-Learn/module3/introduction-to-rust/index.html +++ b/Solana-Co-Learn/module3/introduction-to-rust/index.html @@ -5,13 +5,13 @@ Rust简介 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/index.html b/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/index.html index 360d3b432..0674d6901 100644 --- a/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/index.html +++ b/Solana-Co-Learn/module3/introduction-to-rust/interact-wit-your-deployed-program/index.html @@ -5,13 +5,13 @@ 👋 与你部署的程序互动 | All in One Solana - +
    -
    Skip to main content

    👋 与你部署的程序互动

    我们将在Solana的游乐场上创建一个简单的Hello World程序。它只会在交易日志中记录一条消息。现在我们的程序已经部署完成了,是时候与之互动了。别忘了,在之前的阶段,你已经多次实现过这个过程!你可以像之前一样通过create-solana-client设置本地客户端,或者直接使用Solana的游乐场。

    我倾向于选择游乐场,因为那里更加方便快捷 :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: [], // 这里暂时不使用任何账户
    programId,
    // 这里不需要添加数据!
    });

    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(
    `交易链接: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
    );
    }

    main();

    你会发现这部分代码非常熟悉。在Solana的游乐场中,获取密钥对和连接到开发网络的方式有所不同,这是这个脚本的两个变化要点。全局对象 pg 包含了这两个要素。

    运行这个脚本后,你应该能在控制台上看到已记录的交易。打开链接并向下滚动,你就会看到你的消息!

    🚢 接下来的挑战

    现在轮到你自己来构建一些东西了。由于我们从非常基础的程序开始,你所创建的程序应该与我们刚才创建的程序非常相似。尽量自己编写代码,而不是从这里复制粘贴。

    Solana Playground中创建一个新程序,使用msg!宏将自定义消息打印到程序日志中。按照我们演示的方式构建和部署你的程序。编写一个客户端脚本来调用你新部署的程序,然后使用Solana Explorer来检查程序日志中是否打印了你的消息。

    除了创建一个基础程序外,也可以花些时间去探索Rust。你可以查阅Rust书籍,并使用Rust Playground来更好地理解这门语言的工作原理。这样,当我们深入探讨更具挑战性的Solana程序主题时,你就能领先一步。

    或许,你可以尝试让程序使用一组词汇的组合来随机生成登出时的消息,而不是固定的消息?这将是一个有趣的挑战!

    - +
    Skip to main content

    👋 与你部署的程序互动

    我们将在Solana的游乐场上创建一个简单的Hello World程序。它只会在交易日志中记录一条消息。现在我们的程序已经部署完成了,是时候与之互动了。别忘了,在之前的阶段,你已经多次实现过这个过程!你可以像之前一样通过create-solana-client设置本地客户端,或者直接使用Solana的游乐场。

    我倾向于选择游乐场,因为那里更加方便快捷 :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: [], // 这里暂时不使用任何账户
    programId,
    // 这里不需要添加数据!
    });

    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(
    `交易链接: https://explorer.solana.com/tx/${transactionSignature}?cluster=devnet`
    );
    }

    main();

    你会发现这部分代码非常熟悉。在Solana的游乐场中,获取密钥对和连接到开发网络的方式有所不同,这是这个脚本的两个变化要点。全局对象 pg 包含了这两个要素。

    运行这个脚本后,你应该能在控制台上看到已记录的交易。打开链接并向下滚动,你就会看到你的消息!

    🚢 接下来的挑战

    现在轮到你自己来构建一些东西了。由于我们从非常基础的程序开始,你所创建的程序应该与我们刚才创建的程序非常相似。尽量自己编写代码,而不是从这里复制粘贴。

    Solana Playground中创建一个新程序,使用msg!宏将自定义消息打印到程序日志中。按照我们演示的方式构建和部署你的程序。编写一个客户端脚本来调用你新部署的程序,然后使用Solana Explorer来检查程序日志中是否打印了你的消息。

    除了创建一个基础程序外,也可以花些时间去探索Rust。你可以查阅Rust书籍,并使用Rust Playground来更好地理解这门语言的工作原理。这样,当我们深入探讨更具挑战性的Solana程序主题时,你就能领先一步。

    或许,你可以尝试让程序使用一组词汇的组合来随机生成登出时的消息,而不是固定的消息?这将是一个有趣的挑战!

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/index.html b/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/index.html index fbb8de412..8978db5f7 100644 --- a/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/index.html +++ b/Solana-Co-Learn/module3/introduction-to-rust/the-magic-internet-computer/index.html @@ -5,13 +5,13 @@ ✨ 魔法互联网计算机 | All in One Solana - +
    -
    Skip to main content

    ✨ 魔法互联网计算机

    我们将在游乐场中编写一个简单的Hello World程序。它仅会在交易日志中记录一条消息。至今为止,我们已经完成了许多酷炫的项目,包括建立各种类型的客户端,创建NFT收藏品,铸造SPL代币,甚至构建用户界面让其他人与之互动。然而,我们迄今为止所做的一切都是基于现有的程序。

    你现在已经做好成为一名全栈Solana开发者,并学习如何编写自己程序的准备了。

    Solana的强大之处在于能够运行任何可执行代码。Solana程序,或者说其他区块链环境中的“智能合约”,实际上是Solana生态系统的核心组成部分。这意味着Solana本质上是一个通用计算机,任何互联网用户都可以访问和运行。你可能会好奇为何这样做很重要,但确实并不感觉如此。

    区块链网络是互联网的下一次演进,这就是为什么整个行业将其称为“Web 3.0”的原因。能够安全且无需许可地运行可重复的代码,这为我们打开了一个全新的可能性世界。

    尽管如此,它并没有像“静态类型”语言那样具有魔力,因为魔力仍由像你我这样的人构建。随着开发人员和创作者构建并部署新程序,程序的数量每天都在增长。

    🤔 Rust 是什么鬼东西?

    Solana的程序是用Rust编写的,这是一种与C类似的低级编程语言,速度非常快。在我们着手标准的“Hello World”程序之前,让我稍微解释一下为什么Rust被视为相当困难。

    简单来说:Rust感觉艰难,因为它规则众多。就像那些学习曲线陡峭的视频游戏——DOTA、英雄联盟、星际争霸(甚至国际象棋或CSGO)。这些游戏有数百个独特的角色/物品/能力,每个都有自己的规则和互动方式。要想在这些游戏中获胜,你必须掌握所有的规则,并了解它们是如何相互作用的。

    Rust也是如此。它是一种强有力的语言,迫使你以不同的方式思考代码。它不是一种可以随意拿来写程序的语言,而是一种你必须深入学习和理解的语言。

    但这并不是要吓到你——学习Rust并不像学习DOTA那么难💀。我只是想告诉你我们已经弄明白了。学习Rust可以非常有趣,只是可能需要比你以往习惯的更多努力 :)

    就像玩电子游戏一样,我们会一步步来,从简单的开始,逐渐解决困难问题,不断提升自己的水平⚔️。

    我们将从构建Hello World程序所需的基本概念开始:


    🛹 Solana Playground

    info

    这里的内容可以看也行也可以不看,因为前面我们已经学会了如何在本地启动Solana节点,搭建一个本地开发环境了。

    我们将在Solana Playground上开始编写程序。这是一个基于浏览器的集成开发环境,它会处理所有设置要求,让我们可以专注于Rust

    启动它并使用原生框架创建一个新项目,我们将保持原汁原味🌼。Anchor是一个用于在Solana上构建Rust的框架,有点像React对于Web的作用。我们稍后会学习如何使用它,现在先使用原生框架。

    你会看到一个包含高级Hello World程序的lib.rs文件。忽略它,我们要做的要更简单。

    在这里,你最不想做的事情就是设置游乐场钱包。你会在左下角看到一个“未连接”按钮。

    点击它,系统会为你生成一个Solana钱包,并用devnet SOL为其充值。如果需要,你可以保存密钥对,这在测试特定密钥对部署的程序时可能很有用。对于我来说,我只会构建一个简单的程序,所以并不需要它 :)

    现在我们知道了在哪里编写代码,是时候开始学习Rust了!

    - +
    Skip to main content

    ✨ 魔法互联网计算机

    我们将在游乐场中编写一个简单的Hello World程序。它仅会在交易日志中记录一条消息。至今为止,我们已经完成了许多酷炫的项目,包括建立各种类型的客户端,创建NFT收藏品,铸造SPL代币,甚至构建用户界面让其他人与之互动。然而,我们迄今为止所做的一切都是基于现有的程序。

    你现在已经做好成为一名全栈Solana开发者,并学习如何编写自己程序的准备了。

    Solana的强大之处在于能够运行任何可执行代码。Solana程序,或者说其他区块链环境中的“智能合约”,实际上是Solana生态系统的核心组成部分。这意味着Solana本质上是一个通用计算机,任何互联网用户都可以访问和运行。你可能会好奇为何这样做很重要,但确实并不感觉如此。

    区块链网络是互联网的下一次演进,这就是为什么整个行业将其称为“Web 3.0”的原因。能够安全且无需许可地运行可重复的代码,这为我们打开了一个全新的可能性世界。

    尽管如此,它并没有像“静态类型”语言那样具有魔力,因为魔力仍由像你我这样的人构建。随着开发人员和创作者构建并部署新程序,程序的数量每天都在增长。

    🤔 Rust 是什么鬼东西?

    Solana的程序是用Rust编写的,这是一种与C类似的低级编程语言,速度非常快。在我们着手标准的“Hello World”程序之前,让我稍微解释一下为什么Rust被视为相当困难。

    简单来说:Rust感觉艰难,因为它规则众多。就像那些学习曲线陡峭的视频游戏——DOTA、英雄联盟、星际争霸(甚至国际象棋或CSGO)。这些游戏有数百个独特的角色/物品/能力,每个都有自己的规则和互动方式。要想在这些游戏中获胜,你必须掌握所有的规则,并了解它们是如何相互作用的。

    Rust也是如此。它是一种强有力的语言,迫使你以不同的方式思考代码。它不是一种可以随意拿来写程序的语言,而是一种你必须深入学习和理解的语言。

    但这并不是要吓到你——学习Rust并不像学习DOTA那么难💀。我只是想告诉你我们已经弄明白了。学习Rust可以非常有趣,只是可能需要比你以往习惯的更多努力 :)

    就像玩电子游戏一样,我们会一步步来,从简单的开始,逐渐解决困难问题,不断提升自己的水平⚔️。

    我们将从构建Hello World程序所需的基本概念开始:


    🛹 Solana Playground

    info

    这里的内容可以看也行也可以不看,因为前面我们已经学会了如何在本地启动Solana节点,搭建一个本地开发环境了。

    我们将在Solana Playground上开始编写程序。这是一个基于浏览器的集成开发环境,它会处理所有设置要求,让我们可以专注于Rust

    启动它并使用原生框架创建一个新项目,我们将保持原汁原味🌼。Anchor是一个用于在Solana上构建Rust的框架,有点像React对于Web的作用。我们稍后会学习如何使用它,现在先使用原生框架。

    你会看到一个包含高级Hello World程序的lib.rs文件。忽略它,我们要做的要更简单。

    在这里,你最不想做的事情就是设置游乐场钱包。你会在左下角看到一个“未连接”按钮。

    点击它,系统会为你生成一个Solana钱包,并用devnet SOL为其充值。如果需要,你可以保存密钥对,这在测试特定密钥对部署的程序时可能很有用。对于我来说,我只会构建一个简单的程序,所以并不需要它 :)

    现在我们知道了在哪里编写代码,是时候开始学习Rust了!

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/index.html b/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/index.html index 384f49e64..aec398708 100644 --- a/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/index.html +++ b/Solana-Co-Learn/module3/native-solana-development/build-a-movie-review-program/index.html @@ -5,15 +5,15 @@ 🎥 构建一个电影评论程序 | All in One Solana - +
    Skip to main content

    🎥 构建一个电影评论程序

    还记得我们在第一节中互动开发的电影评论节目吗?现在我们要继续深入开发它。当然,你可以随意评论任何内容,不仅限于电影,毕竟我并不是你的长辈,你自由发挥就好。

    让我们回到操场(是上一节课的操场,不是中学时的那个),开始一个全新的项目。我们将从基础的结构编写开始,具体如 lib.rs 文件:

    如果是在本地开发的话,我们需要执行cargo init <your-program-name> --lib。 下面这个是以cargo init hello --lib生成的Cargo.toml文件。

    [package]
    name = "hello"
    version = "0.1.0"
    edition = "2021"

    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

    [dependencies]

    并且还需要添加solana-program, borsh,通过在命令行执行cargo add solana-programcargo add borsh安装。

    执行后的Cargo.toml内容是:

    [package]
    name = "hello"
    version = "0.1.0"
    edition = "2021"

    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

    [dependencies]
    borsh = "0.10.3"
    solana-program = "1.16.10"

    还有需要配置下Cargo.toml,在文件内添加如下内容:

    [package]
    name = "hello"
    version = "0.1.0"
    edition = "2021"

    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

    [dependencies]
    borsh = "0.10.3"
    solana-program = "1.16.10"

    # 这是你需要添加的内容
    [lib]
    crate-type = ["cdylib", "lib"]

    然后是将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 是一个值的缺失。为什么呢?因为有时候你没有一个值,这是可以接受的。从文档中了解更多:

    info

    将缺失的可能性编码到类型系统中是一项重要的概念,因为它会迫使编译器强制程序员处理这种缺失的情况。

    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!("正在添加电影评论...");
    msg!("标题: {}", title);
    msg!("评分: {}", rating);
    msg!("描述: {}", 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/CreatorsDAO/solana-movie-client
    cd solana-movie-client
    npm install

    打开 src/index.js 并将第94行的程序ID更新为从playground复制的ID。如果你对程序做了任何更改,这里还需要更新客户端。

    在终端输入 npm run start ,你应该会得到一个资源管理器链接。点击该链接,然后向下滚动到程序指令日志,你应该能看到你的电影评论!

    轻松有趣,我们可以做到,继续前进!

    🚢 挑战

    对于本课程的挑战,尝试复制一个学生介绍程序。

    该程序接收用户的姓名和短信作为指令数据,并创建一个账户以将数据存储在区块链上。

    利用你在本课程中学到的知识,构建一个学生介绍程序,使得当程序被调用时,能够将用户提供的姓名和信息打印到程序日志中。

    解决方案代码 -你可以通过构建这个前端并在Solana Explorer上检查程序日志来测试你的程序。记得用你部署的程序ID替换前端代码中的ID

    如果可以的话,尽量自己独立完成这个任务!但如果遇到困难,可以参考解决方案代码

    我对你有信心。

    - +你可以通过构建这个前端并在Solana Explorer上检查程序日志来测试你的程序。记得用你部署的程序ID替换前端代码中的ID

    如果可以的话,尽量自己独立完成这个任务!但如果遇到困难,可以参考解决方案代码

    我对你有信心。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module3/native-solana-development/index.html b/Solana-Co-Learn/module3/native-solana-development/index.html index d9d4db56d..4f2aa353a 100644 --- a/Solana-Co-Learn/module3/native-solana-development/index.html +++ b/Solana-Co-Learn/module3/native-solana-development/index.html @@ -5,13 +5,13 @@ 原生SOLANA开发 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module3/native-solana-development/state-management/index.html b/Solana-Co-Learn/module3/native-solana-development/state-management/index.html index b8d90da52..10edfef9b 100644 --- a/Solana-Co-Learn/module3/native-solana-development/state-management/index.html +++ b/Solana-Co-Learn/module3/native-solana-development/state-management/index.html @@ -5,14 +5,14 @@ 🤠 状态管理 | All in One Solana - +
    Skip to main content

    🤠 状态管理

    你还记得我们在第一节中互动的电影评论程序吗?现在我们要在这里构建它。你想评论的不一定只是电影,我可不会限制你。状态是指存储在链上的程序数据。

    我们已经有了一个可靠的程序,它接收指令数据并做好了处理准备。要执行这些指令,我们需要学习更多关于 Rust 的知识。

    📝 将程序状态作为 Rust 数据类型

    Solana 之所以保持其速度和效率,部分原因是程序是无状态的。这意味着你无法更改程序上的数据——所有数据都存储在外部账户中,通常是由程序拥有的账户。这些账户中的大部分是 PDAProgram Derived Accounts)——现在我们将研究它们的数据存储元素,并稍后深入了解其余部分。

    正如我们将指令数据转换为 Rust 类型一样,我们也将把程序状态转换为 Rust 类型,以便更容易处理。

    回想一下 Solana 账户中的 data 字段——它存储了一个原始字节数组。我们可以通过序列化和反序列化来表示它在 Rust 类型中的形式。

    我们将再次使用 borsh macro

    use borsh::{BorshDeserialize, BorshSerialize};

    #[derive(BorshSerialize, BorshDeserialize, Debug)]
    struct NoteState {
    title: String,
    body: String,
    id: u64,
    }

    数据在传输和存储时以原始字节的形式存在,但当我们想要处理数据时,会将其转换为 Rust 类型。听起来很有道理,不是吗?

    🏠 空间与租金

    没错,Solana 也有房东:那就是将区块链状态存储在自己机器上的验证者。

    租金以 Lamports 为单位支付,其中 LamportSOL 的最小单位(0.000000001 SOL = 1 Lamport),根据账户占用的空间大小计算。下面是一个显示常见类型所占用的字节空间的表格:

    付房租有两种方式:

    • 按每个时期支付租金。这就像每月支付房租一样——只要你继续支付,你就能继续居住。如果账户没有足够的 SOL,它将被清零,数据将丢失。
    • 保持等于 2 年租金的最低余额。这样账户就免除了租金。这里的逻辑是硬件成本每 2 年下降 50%,所以如果你有足够的 SOL 支付 2 年的租金,你就再也不用担心了!

    现在要求免租金,所以只有选项 #2。这种方法的最大优点是,当你不再需要存储数据时,可以销毁账户并取回你的 SOL!区块链上的免费存储(减去交易费用)🥳。

    那么,为什么要在区块链上支付租金呢?嗯,这是一种防止人们大量创建但从未使用的账户的方式。这会浪费空间和验证者的资源。这个机制也是 Solana 上存储如此便宜的原因之一——与以太坊不同,我的那些愚蠢的 Hello World NFT 收藏会被所有验证者永久存储。

    你可以在这里阅读更多有关的内容,我觉得这真的很酷!

    📊 租金计算

    计算租金其实非常简单——有一个非常有用的功能可以帮助你。难的部分是弄清楚你需要多少空间。

    以下是我们超级笔记程序的代码示例:

    // 计算存储结构体 NoteState 所需的账户大小
    // 4字节用于存储后续动态数据(字符串)的大小
    // 8字节用于存储64位整数ID
    let account_len: usize = (4 + title.len()) + (4 + body.len()) + 8;

    // 计算所需租金
    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 来实现。

    pub fn invoke(
    instruction: &Instruction,
    account_infos: &[AccountInfo],
    ) -> ProgramResult
    pub fn invoke_signed(
    instruction: &Instruction,
    account_infos: &[AccountInfo],
    signers_seeds: &[&[u8]],
    ) -> ProgramResult

    当你不需要签署交易时,使用 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的交易来创建笔记。
    2. 我们的程序接收指令,提取数据并将其格式化为Rust类型。
    3. 我们使用Rust类型计算账户需要多少空间以及我们需要支付多少租金。
    4. 我们从程序ID和一组种子中推导出账户的地址。
    5. 我们使用CPI创建一个空白数据的账户。
    6. 我们将账户数据反序列化为Rust类型。
    7. 我们使用指令中的数据来更新Rust类型的账户数据。
    8. 我们将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 两个trait :)

    接下来,我们需要更新 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 函数(需要引入use solana_program::account_info::next_account_info;)来实现这一点 - 它是一个接受迭代器并安全返回列表中下一个项的函数。我们可以像下面这样使用它:

    // 获取账户迭代器
    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)?;

    挺酷的,对吧?如果列表为空,我们将收到 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. 初始化器的公钥
    2. 电影的标题

    🧮 计算空间和租金

    我们之前已经讨论过这个了 :)

    // 计算所需的账户大小
    let account_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());

    // 计算所需的租金
    let rent = Rent::get()?;
    let rent_lamports = rent.minimum_balance(account_len);

    你的 add_movie_review 函数现在应该看起来相当长了。我们还剩下两个小部分——创建账户和更新数据。继续前进吧!

    📝 创建账户

    是时候进行一些跨程序调用了!

    // 创建账户
    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: {}", pda);

    invoke_signed 是创建账户的交易。我们传入了 create_account 指令,我们所使用的账户,以及用于派生PDA地址的种子。

    我们需要做的最后一件事是更新账户数据:

    msg!("解包状态账户");
    let mut account_data = try_from_slice_unchecked::<MovieAccountState>(&pda_account.data.borrow()).unwrap();
    msg!("借用账户数据");

    account_data.title = title;
    account_data.rating = rating;
    account_data.description = description;
    account_data.is_initialized = true;

    msg!("序列化账户");
    account_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;
    msg!("状态账户序列化");

    我们使用 try_from_slice_unchecked 将原始字节转换为Rust类型。然后我们更新数据,并将其序列化回原始字节。

    我们已经准备好升级并部署了!(可能需要几分钟时间)

    🎉 试一试

    你知道该如何操作了。复制地址,设置一个脚本来调用程序(你可以使用上次的脚本,无需更改),运行它,然后在Solana Explorer上查看这个新账户。

    如果你需要一个新的设置,可以执行以下操作:

    git clone https://github.com/CreatorsDAO/solana-movie-client
    cd solana-movie-client
    npm install

    更新 index.ts 文件中的 programId 为你程序的地址,然后运行 npm run start

    在终端中点击浏览器链接,并向下滚动到程序日志部分,你会看到类似的内容:

    我们可以看到,我们的程序通过CPI与系统程序进行交互,创建了一个账户(PDA),并将我们的评论添加到其中!如果我可以自夸一下的话,这绝对是一篇很棒的评论。 😉

    🚢 挑战

    现在轮到你独立创建一些东西了。

    回想一下,学生介绍程序需要用户提供姓名和简短留言作为输入instruction_data,并创建一个账户来将数据存储在区块链上。

    借助你在本课程中学到的知识,尝试重新创建完整的学生介绍程序。

    info

    提示: -除了接收一个名称和一个简短的消息作为指令数据外,程序还应该:

    1. 为每个学生创建一个独立的账户
    2. 在每个账户中存储 is_initialized 为布尔值,name 为字符串,msg 为字符串

    解决方案代码:

    你可以使用这个链接的前端来测试你的程序。记得用你部署的程序ID替换前端代码中的那个。

    如果可能的话,请尽量独立完成这个任务!但如果遇到困难,你可以参考解决方案代码

    - +除了接收一个名称和一个简短的消息作为指令数据外,程序还应该:

    1. 为每个学生创建一个独立的账户
    2. 在每个账户中存储 is_initialized 为布尔值,name 为字符串,msg 为字符串

    解决方案代码:

    你可以使用这个链接的前端来测试你的程序。记得用你部署的程序ID替换前端代码中的那个。

    如果可能的话,请尽量独立完成这个任务!但如果遇到困难,你可以参考解决方案代码

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/index.html b/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/index.html index 4d2252441..f2e3d577e 100644 --- a/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/index.html +++ b/Solana-Co-Learn/module3/native-solana-development/the-rust-layer-cake/index.html @@ -5,14 +5,14 @@ 🎂 Rust的分层蛋糕 | All in One Solana - +
    Skip to main content

    🎂 Rust的分层蛋糕

    我们将在游乐场上制作一个简单的Hello World程序,仅仅会在交易日志中记录一条消息。招呼已经打过了。现在是时候学习如何处理指令数据,就像在客户端开发中一样。

    在开始构建之前,我想先给你介绍一些即将使用的概念。还记得我提到的规则、能力和互动吗?我会带你了解一下编写本地Solana程序所需的能力和规则。这里的“本地”非常重要 - 我们将在后续部分借助Anchor来处理我们现在所学的许多内容。

    我们学习原生开发的原因是因为了解底层工作原理是非常重要的。一旦你理解了事物是如何在最基本的层面上运作的,就能够借助像Anchor这样的工具来构建更强大的程序。你可以把这个过程想象成与不同类型的敌人进行首领战 , 你需要先学会如何逐一对抗每个个体怪物(以及了解你自己的能力)。

    当我刚开始学习的时候,我发现很难理解自己缺少了什么。所以我将其分解成了“层次”。每一个你学习的主题都建立在一层知识的基础之上。如果遇到不明白的地方,回到之前的层次,确保你真正理解了它们。

    Rust的分层蛋糕

    这是一个由Rust制作的蛋糕。

    caution

    注意:图层代表重量!

    👶 变量声明和可变性

    变量。你了解它们。你使用过它们。你甚至可能拼写错误过它们。在Rust中关于变量唯一的新概念就是可变性。所有变量默认都是不可变的 , 一旦声明了变量,就不能改变其值。你只需通过添加mut关键字告诉编译器你想要一个可变的变量。就是这么简单。如果我们不指定类型,编译器会根据提供的数据进行推断,并强制我们保持该类型。

    // compiler will throw error
    let age = 33;
    age = 34;

    // this is allowed
    let mut mutable_age = 33;
    mutable_age = 34;

    🍱 结构体

    结构体是自定义的数据结构,一种将数据组织在一起的方式。它们是你定义的自定义数据类型,类似于JavaScript中的对象。Rust并不是完全面向对象的 - 结构体本身除了保存有组织的数据外,无法执行任何操作。但你可以向结构体添加方法,使其表现得更像对象。

    Struct User {
    active: bool,
    email: String,
    age: u64
    }

    let mut user1 = User {
    active: true,
    email: String::from("test@test.com"),
    age: 33
    };

    user1.age = 34;

    📜 枚举、变体和匹配

    枚举很简单 - 它们就像代码中的下拉列表。它们限制你从几个可能的变体中选择一个。

    enum LightStatus {
    On,
    Off
    }
    enum LightStatus {
    On {
    color: String
    },
    Off
    }

    let light_status = LightStatus::On {
    color: String::from("red")
    };

    Rust中枚举的酷炫之处在于你可以(可选地)向其中添加数据,使其几乎像一个迷你的if语句。在这个例子中,你正在选择交通信号灯的状态。如果它是开启的,你需要指定颜色 - 是红色、黄色还是绿色?

    enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
    }

    fn value_in_cents(coin: Coin) -> u8 {
    match coin {
    Coin::Penny => 1,
    Coin::Nickel => 5,
    Coin::Dime => 10,
    Coin::Quarter => 25,
    }
    }

    当与匹配语句结合使用时,枚举非常有用。它们是一种检查变量值并根据该值执行代码的方式,与JavaScript中的switch语句类似。

    📦 实现

    结构体本身很有用,但如果你能为它们添加函数,效果将如何呢?下面我们来介绍实现(Implementations),它让你可以给结构体添加方法,使其更接近面向对象的设计。

    #[derive(Debug)]
    struct Rectangle {
    width: u32,
    height: u32,
    }

    impl Rectangle {
    fn area(&self) -> u32 {
    self.width * self.height
    }
    }

    fn main() {
    let rect1 = Rectangle {
    width: 30,
    height: 50,
    };

    println!(
    "The area of the rectangle is {} square pixels.",
    rect1.area()
    );
    }

    如果你对“向结构体添加方法”感到困惑,可以理解为赋予结构体特殊能力。例如,你可能有一个简单的user结构体,拥有速度、健康和伤害属性。通过使用 impl 关键字添加一个 wordPerMinute 方法,你就可以计算用户的打字速度⌨️。

    🎁 特征(Traits

    现在,我们来谈谈这个“蛋糕”的顶层部分 - TraitsTraits和实现类似,也是为类型增添功能。你可以把它看作类型能具备的一种能力。

    回到我们的 user 结构体例子,如果我添加了一个名为 ThreeArmstrait,用户将能够以更快的速度输入文字,因为他们将拥有额外的手臂!Traits这个概念可能有点抽象,所以我们来看一个具体的例子:

    pub triat BorshDeserialize : Sized {
    fn deserialize(buf: &mut &[u8]) -> Result<Self, Error>;
    fn try_from_slice(buf: &[u8]) -> Result<Self, Error> { ... }
    }

    如你所知,我们的指令数据以字节数组(由10组成)的形式提供,我们需要在程序中对其进行反序列化(转换成Rust类型)。我们将使用名为 BorshDeserializeTraits来完成这一任务:它包括一个 deserialize 方法,可以将数据转换为所需类型。这意味着,如果我们将 BorshDeserialize Traits 添加到指令结构体中,我们就可以使用 deserialize 方法将指令数据实例转换为Rust类型。

    如果你对这部分内容感到困惑,不妨再读一遍,我自己也花了一些时间才弄清楚。

    实际操作示例如下:

    #[derive(BorshDeserialize)]
    struct InstructionData {
    input: String,
    }
    caution

    注意:可能有一个你已经忽略的层面——宏。它们用来生成代码。

    在我们的场景中,特质和宏通常一起使用。例如,BorshDeserialize Traits有两个必须实现的函数:deserializetry_from_slice。我们可以使用 #[derive(BorshDeserialize)] 属性,让编译器在给定类型上(即指令数据结构)为我们实现这两个函数。 -整个流程是这样的:

    • 通过宏将Trait添加到结构体中
    • 编译器会查找Trait的定义
    • 编译器会为该Trait实现底层函数
    • 你的结构体现在具备了Trait的功能

    实际上,宏在编译时生成了用于反序列化字符串的函数。通过使用这个Trait,我们可以告诉Rust:“嘿,我想能反序列化字符串,请为我生成相应的代码。”

    对于我们的情况,唯一的要求是Borsh必须支持所有的结构数据类型(在我们的场景中是字符串)。如果你有一个Borsh不支持的自定义数据类型,就需要在宏中自己实现这些功能。

    如果你还未完全理解,不用担心!我自己也是在看到整个流程后才理解的,所以现在让我们一起实践一下!

    🎂 把所有元素整合在一起

    我们刚刚讨论了一系列相互关联的抽象主题。如果只描述每一层,可能难以想象整个“蛋糕”的样子,所以我们现在就将它们整合起来。

    假设我们正在构建一个链上的笔记程序,我们将保持它的简单性:你只能创建、更新和删除笔记。我们需要一条指令来完成这些操作,所以让我们创建一个枚举类型来代表它:

    enum NoteInstruction {
    CreateNote {
    id: u64,
    title: String,
    body: String
    },
    UpdateNote {
    id: u64,
    title: String,
    body: String
    },
    DeleteNote {
    id: u64
    }
    }

    每个指令变体的字节数组都有自己的数据类型,我们在这里有它们!

    既然我们知道指令数据的样子,我们需要将其从字节转换为这些类型。第一步是反序列化,我们将使用一个专门为有效负载创建的新结构体上的 BorshDeserialize Traits 来完成。

    #[derive(BorshDeserialize)]
    struct NoteInstructionPayload {
    id: u64,
    title: String,
    body: String
    }

    我们在这里处理了titlebody,这就是字节数组中的内容。Borsh的工作仅仅是添加反序列化的支持,它实际上并没有进行反序列化,而是仅提供了我们可以调用的反序列化函数。

    下一步,我们要实际使用这些函数来反序列化数据。我们将在一个实现中定义这个行为,这是一个手动的过程(至少暂时是这样)!

    impl NoteInstruction {
    // 将传入的缓冲区解包到相关的指令
    // 输入的预期格式是一个用Borsh序列化的向量
    pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
    // 采用第一个字节作为变体来确定要执行哪个指令
    let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;
    // 使用临时有效载荷结构体进行反序列化
    let payload = NoteInstructionPayload::try_from_slice(rest).unwrap();
    // 通过变体匹配,确定函数所期望的数据结构,然后返回TestStruct或错误
    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上调用它。这就是反序列化的过程!

    接下来的步骤包括:

    • 将指令数据定义为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会为你处理大部分反序列化工作)。

    entrypoint!(process_instruction);

    pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8]
    ) -> ProgramResult {

    // 解压指令数据
    let instruction = NoteInstruction::unpack(instruction_data)?;

    // 匹配指令并执行相应的逻辑
    match instruction {
    NoteInstruction::CreateNote { title, body, id } => {
    msg!("Instruction: CreateNote");
    create_note(accounts, title, body, id, program_id)
    }
    NoteInstruction::UpdateNote { title, body, id } => {
    msg!("Instruction: UpdateNote");
    update_note(accounts, title, body, id)
    }
    NoteInstruction::DeleteNote { id } => {
    msg!("Instruction: DeleteNote");
    delete_note(accounts, id)
    }
    }
    }

    首先,我们要做的是定义程序的入口函数。process_instruction 函数的定义与我们之前的 “Hello World” 程序一样。接着,我们将在 NoteInstruction 的实现中使用 unpack 函数来提取指令数据。然后,我们可以依靠 NoteInstruction 枚举来确定指令的具体类型。

    在本阶段,我们还没有涉及具体的逻辑处理,真正的构建将在后续阶段展开。

    📂 文件结构说明

    编写自定义程序时,将代码划分为不同的文件结构会非常有助于管理。这样做不仅方便代码重用,还能让你更快速地找到所需的内容。

    除了 lib.rs 文件外,我们还会把程序的各个部分放入不同的文件。最明显的一个例子就是 instruction.rs 文件。在这里,我们将定义指令数据类型并实现对指令数据的解包功能。

    你做得真棒👏👏👏

    我想借此机会对你的努力付出表示赞赏。你正在学习一些强大且实用的技能,这些技能不仅在 Solana 领域有用,Rust 的应用也非常广泛。尽管学习 Solana 可能会有一些困难,但请记住,这样的困难也有人曾经经历并战胜。例如,FormFunction 的创始人在大约一年前的推文中提到了他是如何找到困难的:

    FormFunction 已经筹集了超过 470 万美元,是我心目中 Solana 上最优秀的 1/1 NFT 平台。Matt 凭借坚持不懈的努力建立了一些令人难以置信的东西。试想一下,如果你掌握了这些技能,一年后你会站在哪里呢?

    - +整个流程是这样的:

    实际上,宏在编译时生成了用于反序列化字符串的函数。通过使用这个Trait,我们可以告诉Rust:“嘿,我想能反序列化字符串,请为我生成相应的代码。”

    对于我们的情况,唯一的要求是Borsh必须支持所有的结构数据类型(在我们的场景中是字符串)。如果你有一个Borsh不支持的自定义数据类型,就需要在宏中自己实现这些功能。

    如果你还未完全理解,不用担心!我自己也是在看到整个流程后才理解的,所以现在让我们一起实践一下!

    🎂 把所有元素整合在一起

    我们刚刚讨论了一系列相互关联的抽象主题。如果只描述每一层,可能难以想象整个“蛋糕”的样子,所以我们现在就将它们整合起来。

    假设我们正在构建一个链上的笔记程序,我们将保持它的简单性:你只能创建、更新和删除笔记。我们需要一条指令来完成这些操作,所以让我们创建一个枚举类型来代表它:

    enum NoteInstruction {
    CreateNote {
    id: u64,
    title: String,
    body: String
    },
    UpdateNote {
    id: u64,
    title: String,
    body: String
    },
    DeleteNote {
    id: u64
    }
    }

    每个指令变体的字节数组都有自己的数据类型,我们在这里有它们!

    既然我们知道指令数据的样子,我们需要将其从字节转换为这些类型。第一步是反序列化,我们将使用一个专门为有效负载创建的新结构体上的 BorshDeserialize Traits 来完成。

    #[derive(BorshDeserialize)]
    struct NoteInstructionPayload {
    id: u64,
    title: String,
    body: String
    }

    我们在这里处理了titlebody,这就是字节数组中的内容。Borsh的工作仅仅是添加反序列化的支持,它实际上并没有进行反序列化,而是仅提供了我们可以调用的反序列化函数。

    下一步,我们要实际使用这些函数来反序列化数据。我们将在一个实现中定义这个行为,这是一个手动的过程(至少暂时是这样)!

    impl NoteInstruction {
    // 将传入的缓冲区解包到相关的指令
    // 输入的预期格式是一个用Borsh序列化的向量
    pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
    // 采用第一个字节作为变体来确定要执行哪个指令
    let (&variant, rest) = input.split_first().ok_or(ProgramError::InvalidInstructionData)?;
    // 使用临时有效载荷结构体进行反序列化
    let payload = NoteInstructionPayload::try_from_slice(rest).unwrap();
    // 通过变体匹配,确定函数所期望的数据结构,然后返回TestStruct或错误
    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上调用它。这就是反序列化的过程!

    接下来的步骤包括:

    我们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会为你处理大部分反序列化工作)。

    entrypoint!(process_instruction);

    pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8]
    ) -> ProgramResult {

    // 解压指令数据
    let instruction = NoteInstruction::unpack(instruction_data)?;

    // 匹配指令并执行相应的逻辑
    match instruction {
    NoteInstruction::CreateNote { title, body, id } => {
    msg!("Instruction: CreateNote");
    create_note(accounts, title, body, id, program_id)
    }
    NoteInstruction::UpdateNote { title, body, id } => {
    msg!("Instruction: UpdateNote");
    update_note(accounts, title, body, id)
    }
    NoteInstruction::DeleteNote { id } => {
    msg!("Instruction: DeleteNote");
    delete_note(accounts, id)
    }
    }
    }

    首先,我们要做的是定义程序的入口函数。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/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/index.html b/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/index.html index e2664f906..e0c21dadc 100644 --- a/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/index.html +++ b/Solana-Co-Learn/module3/nft-staking/build-an-nft-staking-program/index.html @@ -5,13 +5,13 @@ 🛠️ 构建NFT质押程序 | All in One Solana - +
    -
    Skip to main content

    🛠️ 构建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),
    }
    }

    /**
    此函数的作用是创建一个属于您和您的NFT的独特PDA账户。
    这将存储有关程序状态的信息,从而决定它是否已质押。
    **/
    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("账户尚未初始化")]
    UninitializedAccount,

    #[error("派生的PDA与传入的PDA不符")]
    InvalidPda,

    #[error("无效的代币账户")]
    InvalidTokenAccount,

    #[error("无效的质押账户")]
    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 {
    /**
    这里是我们如何确定数据大小的方法。在您的UserStakeInfo结构体中,我们有以下数据:

    pub is_initialized: bool, // 1字节
    pub token_account: Pubkey, // 32字节
    pub stake_start_time: UnixTimestamp, // 64字节
    pub last_stake_redeem: UnixTimestamp, // 64字节
    pub user_pubkey: Pubkey, // 32字节
    pub stake_state: StakeState, // 1字节
    **/
    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!("PDA种子无效");
    return Err(StakeError::InvalidPda.into());
    }

    // 创建账户
    let mut account_data = try_from_slice_unchecked::<UserStakeInfo>(&stake_state.data.borrow()).unwrap();

    if !account_data.is_initialized() {
    msg!("账户尚未初始化");
    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(Let's Go)!!! 我们终于完成了所有的函数定义。现在如果你运行程序,它应该会显示“构建成功”。太棒了!我们已经完成了第三周的任务,已经过半了!加油,继续保持这样的势头,我们一起朝着最终目标前进!如果你有任何问题或需要进一步的帮助,请随时联系我。

    - +
    Skip to main content

    🛠️ 构建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),
    }
    }

    /**
    此函数的作用是创建一个属于您和您的NFT的独特PDA账户。
    这将存储有关程序状态的信息,从而决定它是否已质押。
    **/
    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("账户尚未初始化")]
    UninitializedAccount,

    #[error("派生的PDA与传入的PDA不符")]
    InvalidPda,

    #[error("无效的代币账户")]
    InvalidTokenAccount,

    #[error("无效的质押账户")]
    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 {
    /**
    这里是我们如何确定数据大小的方法。在您的UserStakeInfo结构体中,我们有以下数据:

    pub is_initialized: bool, // 1字节
    pub token_account: Pubkey, // 32字节
    pub stake_start_time: UnixTimestamp, // 64字节
    pub last_stake_redeem: UnixTimestamp, // 64字节
    pub user_pubkey: Pubkey, // 32字节
    pub stake_state: StakeState, // 1字节
    **/
    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!("PDA种子无效");
    return Err(StakeError::InvalidPda.into());
    }

    // 创建账户
    let mut account_data = try_from_slice_unchecked::<UserStakeInfo>(&stake_state.data.borrow()).unwrap();

    if !account_data.is_initialized() {
    msg!("账户尚未初始化");
    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(Let's Go)!!! 我们终于完成了所有的函数定义。现在如果你运行程序,它应该会显示“构建成功”。太棒了!我们已经完成了第三周的任务,已经过半了!加油,继续保持这样的势头,我们一起朝着最终目标前进!如果你有任何问题或需要进一步的帮助,请随时联系我。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module3/nft-staking/how-staking-works/index.html b/Solana-Co-Learn/module3/nft-staking/how-staking-works/index.html index f1ff843f2..cca42dcc3 100644 --- a/Solana-Co-Learn/module3/nft-staking/how-staking-works/index.html +++ b/Solana-Co-Learn/module3/nft-staking/how-staking-works/index.html @@ -5,15 +5,15 @@ 🕒 质押工作机制详解 | All in One Solana - +
    Skip to main content

    🕒 质押工作机制详解

    恭喜你已经接近第三周的完成了!现在让我们将你学到的所有知识运用到你正在进行的NFT项目(buildoors项目)的相关质押计划中。

    我们希望你能完整地构建质押计划的所有内容,除了实际的代币功能部分。这表示在你计划与代币程序交互的任何环节,我们暂时只记录一条消息或跳过它,待下周再进行深入审视。

    目前,你的主要目标是开发一个能够跟踪每个用户质押状态的程序。下面是一些基本步骤:

    你应该设计4个指令:

    • 初始化质押账户(InitializeStakeAccount): 这将创建一个新账户,用于记录每个用户/非同质化代币组合的质押过程状态信息。该PDA的种子应由用户的公钥和非同质化代币的令牌账户组成。
    • 质押: 此指令通常用于实际质押操作。但目前,我们并不进行真正的质押,只是更新“状态”账户,以显示代币已被质押,及质押时间等信息。
    • 兑换: 这里是你会根据用户的抵押时间发放奖励代币的地方。目前,只需记录他们应得的代币数量(可以暂时设定每单位时间1个代币),并更新状态以显示上次兑换代币的时间。
    • 解除质押: 此处是你赎回任何多余代币并撤销NFT质押的地方。现阶段,这只意味着更新状态,以表明NFT未被质押,并记录应得的奖励代币数量。

    这确实是一项具有挑战性的任务。在查看参考解决方案或观看视频教程之前,试着自己先设计一些内容。如果没有做得完美,也没关系,挣扎是学习过程的一部分。 提示:你可以使用solana_program::clock::Clock来获取时间。如果需要,你可以查看文档。 -如果你已经尽力尝试了,还可以随时查看解决方案代码。如果你准备继续,欢迎开始为质押功能和与程序交互的用户界面进行开发。

    - +如果你已经尽力尝试了,还可以随时查看解决方案代码。如果你准备继续,欢迎开始为质押功能和与程序交互的用户界面进行开发。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module3/nft-staking/index.html b/Solana-Co-Learn/module3/nft-staking/index.html index 7487d94e2..6367964f6 100644 --- a/Solana-Co-Learn/module3/nft-staking/index.html +++ b/Solana-Co-Learn/module3/nft-staking/index.html @@ -5,13 +5,13 @@ NFT质押 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/index.html b/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/index.html index 72e4289f2..fded736d2 100644 --- a/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/index.html +++ b/Solana-Co-Learn/module3/security-and-validation/error-handling-and-data-validation/index.html @@ -5,13 +5,13 @@ ❗ 错误处理和数据验证 | All in One Solana - +
    -
    Skip to main content

    ❗ 错误处理和数据验证

    本节课将为你介绍一些程序安全方面的基本注意事项。虽然这并非全面的概述,但它能让你像攻击者那样思考,思索重要的问题:我如何破解这个程序?

    😡 自定义错误

    Rust具有非常强大的错误处理机制。你可能已经遇到了一些要求你必须处理异常情况的编译器规则。

    下面展示了如何为我们的笔记程序创建自定义错误的方法:

    use solana_program::{program_error::ProgramError};
    use thiserror::Error;

    #[derive(Error)]
    pub enum NoteError {
    #[error("Wrong Note Owner")]
    Forbidden,

    #[error("test is too long")]
    InvalidLength
    }

    通过derive宏属性,我们可以使NoteError枚举具有默认的错误Trait实现。

    每种错误类型我们都会通过#[error("...")]标记提供相应的错误信息。

    返回自定义错误

    程序返回的错误必须是ProgramError类型。通过impl,我们可以将自定义错误与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!("缺少必要的签名");
    return Err(ProgramError::MissingRequiredSignature)
    }

    数据验证

    你还应该在适当的情况下验证客户提供的指令数据。

    例如,如果你的程序是一个游戏,用户可能会分配角色属性点。你可能需要验证分配的积分加上现有分配是否超出了最大限制。

    if character.agility + new_agility > 100 {
    msg!("属性点数不得超过100");
    return Err(AttributeError::TooHigh.into())
    }

    整数溢出和下溢

    Rust的整数有固定的大小,所以只能容纳特定范围的数字。如果进行算术运算的结果超出了该范围,那么结果会回绕。

    为了避免整数溢出和下溢,你可以:

    • 确保逻辑上不会发生溢出或下溢。
    • 使用checked_add等已检查的数学运算符代替+
    let first_int: u8 = 5;
    let second_int: u8 = 255;
    let sum = first_int.checked_add(second_int);

    想象一下,那些没有采取最基本安全措施的程序都有哪些漏洞等待被发现,那些漏洞赏金就在眼前🥵🤑。

    - +
    Skip to main content

    ❗ 错误处理和数据验证

    本节课将为你介绍一些程序安全方面的基本注意事项。虽然这并非全面的概述,但它能让你像攻击者那样思考,思索重要的问题:我如何破解这个程序?

    😡 自定义错误

    Rust具有非常强大的错误处理机制。你可能已经遇到了一些要求你必须处理异常情况的编译器规则。

    下面展示了如何为我们的笔记程序创建自定义错误的方法:

    use solana_program::{program_error::ProgramError};
    use thiserror::Error;

    #[derive(Error)]
    pub enum NoteError {
    #[error("Wrong Note Owner")]
    Forbidden,

    #[error("test is too long")]
    InvalidLength
    }

    通过derive宏属性,我们可以使NoteError枚举具有默认的错误Trait实现。

    每种错误类型我们都会通过#[error("...")]标记提供相应的错误信息。

    返回自定义错误

    程序返回的错误必须是ProgramError类型。通过impl,我们可以将自定义错误与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!("缺少必要的签名");
    return Err(ProgramError::MissingRequiredSignature)
    }

    数据验证

    你还应该在适当的情况下验证客户提供的指令数据。

    例如,如果你的程序是一个游戏,用户可能会分配角色属性点。你可能需要验证分配的积分加上现有分配是否超出了最大限制。

    if character.agility + new_agility > 100 {
    msg!("属性点数不得超过100");
    return Err(AttributeError::TooHigh.into())
    }

    整数溢出和下溢

    Rust的整数有固定的大小,所以只能容纳特定范围的数字。如果进行算术运算的结果超出了该范围,那么结果会回绕。

    为了避免整数溢出和下溢,你可以:

    • 确保逻辑上不会发生溢出或下溢。
    • 使用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/Solana-Co-Learn/module3/security-and-validation/index.html b/Solana-Co-Learn/module3/security-and-validation/index.html index b508521aa..fc3a49fba 100644 --- a/Solana-Co-Learn/module3/security-and-validation/index.html +++ b/Solana-Co-Learn/module3/security-and-validation/index.html @@ -5,13 +5,13 @@ 安全和验证 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module3/security-and-validation/secure-our-program/index.html b/Solana-Co-Learn/module3/security-and-validation/secure-our-program/index.html index 9008a7010..7d08ceb45 100644 --- a/Solana-Co-Learn/module3/security-and-validation/secure-our-program/index.html +++ b/Solana-Co-Learn/module3/security-and-validation/secure-our-program/index.html @@ -5,13 +5,13 @@ 🔑 保障我们程序的安全 | All in One Solana - +
    -
    Skip to main content

    🔑 保障我们程序的安全

    是时候保障我们的Solana电影数据库程序不受到干扰了。我们将加入一些基础的安全防护,进行输入验证,并增添一个 update_movie_review 指令。

    我会为你在一个点击之下就开始,你可以看一下这个Playground设置链接

    完整的文件结构如下所示:

    • lib.rs - 注册模块
    • entrypoint.rs - 程序的入口点
    • instruction.rs - 指令数据的序列化与反序列化
    • processor.rs - 处理指令的程序逻辑
    • state.rs - 状态的序列化与反序列化
    • error.rs - 自定义程序错误

    请注意与“状态管理”结束时的初始代码所存在的不同。

    processor.rs 中:

    • account_len 函数里,将 add_movie_review 更改为固定大小的1000。

    • 通过这样做,当用户更新电影评论时,我们就无需担心重新分配大小或重新计算租金。

    // 从这里
    let account_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());

    // 变为这里
    let account_len: usize = 1000;

    state.rs 中:

    • 实现了一个检查结构体上的 is_initialized 字段的函数。
    • Sealed 接口实现了 MovieAccountState ,这样就能指定 MovieAccountState 具有已知大小,并为其提供了一些编译器优化。
    // 在 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 的方法
    // 在 error.rs 内
    use solana_program::program_error::ProgramError;
    use thiserror::Error;

    #[derive(Debug, Error)]
    pub enum ReviewError{
    // error 0
    #[error("uninitialized account")]
    UninitializedAccount,
    // error 1
    #[error("Derived PDA did not match the given PDA")]
    InvalidPDA,
    // error 2
    #[error("input data length is too long")]
    InvalidDataLength,
    // error 3
    #[error("rating is out of range 5 or less than 1")]
    }

    impl From<ReviewError> for ProgramError {
    fn from(e: ReviewError) -> Self {
    ProgramError::Custom(e as u32)
    }
    }

    请前往 processor.rs 并将 ReviewError 纳入使用范围。

    // 在 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)
    }

    数据验证

    • 确保 rating 落在 15 的评分范围内。我们不想看到 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 指令。

    首先,在 instruction.rs 文件中,我们将从更新 MovieInstruction 枚举开始:

    // 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 函数中添加新变体
      • (可选)添加新的负载结构体
    2. 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/CreatorsDAO/solana-movie-frontend
    cd solana-movie-frontend
    git checkout solution-update-reviews
    npm install

    你的前端现在应该能显示评论了!你可以添加评论,也可以更新你之前的评论!

    🚢 挑战

    现在,是时候让你亲自动手构建一些内容了。你可以以之前课程中用到的学生自我介绍项目为基础进行构建。

    学生自我介绍项目是Solana上的一个有趣项目,允许学生们在线上展示自己的身份。该项目会获取用户的姓名和简短留言作为instruction_data,并创建一个专门的账户来将这些信息储存在链上。

    结合你在本课程中学到的知识,尝试对学生自我介绍项目进行扩展。你应该完成以下任务:

    1. 新增指令:允许学生更新自己的留言。

    2. 安全实现:按照本节课所学,确保项目的基本安全性。

    你可以从这里获取起始代码。

    尽量自主完成这个挑战!如果遇到任何困难,你可以参考解决方案代码。不过请注意,根据你自己实施的检查和错误处理方式,你的代码可能会与解决方案略有不同。

    祝你挑战成功,玩得开心!

    - +
    Skip to main content

    🔑 保障我们程序的安全

    是时候保障我们的Solana电影数据库程序不受到干扰了。我们将加入一些基础的安全防护,进行输入验证,并增添一个 update_movie_review 指令。

    我会为你在一个点击之下就开始,你可以看一下这个Playground设置链接

    完整的文件结构如下所示:

    • lib.rs - 注册模块
    • entrypoint.rs - 程序的入口点
    • instruction.rs - 指令数据的序列化与反序列化
    • processor.rs - 处理指令的程序逻辑
    • state.rs - 状态的序列化与反序列化
    • error.rs - 自定义程序错误

    请注意与“状态管理”结束时的初始代码所存在的不同。

    processor.rs 中:

    • account_len 函数里,将 add_movie_review 更改为固定大小的1000。

    • 通过这样做,当用户更新电影评论时,我们就无需担心重新分配大小或重新计算租金。

    // 从这里
    let account_len: usize = 1 + 1 + (4 + title.len()) + (4 + description.len());

    // 变为这里
    let account_len: usize = 1000;

    state.rs 中:

    • 实现了一个检查结构体上的 is_initialized 字段的函数。
    • Sealed 接口实现了 MovieAccountState ,这样就能指定 MovieAccountState 具有已知大小,并为其提供了一些编译器优化。
    // 在 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 的方法
    // 在 error.rs 内
    use solana_program::program_error::ProgramError;
    use thiserror::Error;

    #[derive(Debug, Error)]
    pub enum ReviewError{
    // error 0
    #[error("uninitialized account")]
    UninitializedAccount,
    // error 1
    #[error("Derived PDA did not match the given PDA")]
    InvalidPDA,
    // error 2
    #[error("input data length is too long")]
    InvalidDataLength,
    // error 3
    #[error("rating is out of range 5 or less than 1")]
    }

    impl From<ReviewError> for ProgramError {
    fn from(e: ReviewError) -> Self {
    ProgramError::Custom(e as u32)
    }
    }

    请前往 processor.rs 并将 ReviewError 纳入使用范围。

    // 在 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)
    }

    数据验证

    • 确保 rating 落在 15 的评分范围内。我们不想看到 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 指令。

    首先,在 instruction.rs 文件中,我们将从更新 MovieInstruction 枚举开始:

    // 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 函数中添加新变体
      • (可选)添加新的负载结构体
    2. 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/CreatorsDAO/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/Solana-Co-Learn/module4/cross-program-invocations/build-a-payment-system-with-cpis/index.html b/Solana-Co-Learn/module4/cross-program-invocations/build-a-payment-system-with-cpis/index.html index 063060667..ebba3187e 100644 --- a/Solana-Co-Learn/module4/cross-program-invocations/build-a-payment-system-with-cpis/index.html +++ b/Solana-Co-Learn/module4/cross-program-invocations/build-a-payment-system-with-cpis/index.html @@ -5,13 +5,13 @@ 💸 使用CPI构建支付系统 | All in One Solana - +
    -
    Skip to main content

    💸 使用CPI构建支付系统

    上一堂课我们已经完成了Mint账户的准备工作,热身环节到此结束,现在正式开始主要表演。

    我们将深入到审查和评论的工作流程中,并添加必要的逻辑来铸造代币。

    我们首先从电影评论开始。请转到 processor.rs 文件,并更新 add_movie_review 函数,以便接收额外的账户。

    // Inside add_movie_review
    msg!("Adding movie review...");
    msg!("Title: {}", title);
    msg!("Rating: {}", rating);
    msg!("Description: {}", description);

    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 pda_counter = next_account_info(account_info_iter)?;
    let token_mint = next_account_info(account_info_iter)?;
    let mint_auth = next_account_info(account_info_iter)?;
    let user_ata = next_account_info(account_info_iter)?;
    let system_program = next_account_info(account_info_iter)?;
    let token_program = next_account_info(account_info_iter)?;

    新增的部分包括:

    • token_mint - 代币的铸币地址。
    • mint_auth - 代币铸造机构的地址。
    • user_ata - 用户与此代币发行机构关联的令牌账户(用于代币铸造)。
    • token_program - 代币程序的地址。

    这里并没有太多特殊之处,这些只是处理代币时所期望的账户。

    还记得我们的编程习惯吗?每次添加一个账户后,立即添加验证!以下是我们需要在 add_movie_review 函数中添加的内容:

    msg!("deriving mint authority");
    let (mint_pda, _mint_bump) = Pubkey::find_program_address(&[b"token_mint"], program_id);
    let (mint_auth_pda, mint_auth_bump) =
    Pubkey::find_program_address(&[b"token_auth"], program_id);

    if *token_mint.key != mint_pda {
    msg!("Incorrect token mint");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *mint_auth.key != mint_auth_pda {
    msg!("Mint passed in and mint derived do not match");
    return Err(ReviewError::InvalidPDA.into());
    }

    if *user_ata.key != get_associated_token_address(initializer.key, token_mint.key) {
    msg!("Incorrect token mint");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *token_program.key != TOKEN_PROGRAM_ID {
    msg!("Incorrect token program");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    你现在已经反复实践过这样的流程,所以这些操作应该感觉得相当熟悉了 :)

    现在我们可以开始铸币了!就在程序结束之前,我们会添加如下代码: Ok(())

    msg!("Minting 10 tokens to User associated token account");
    invoke_signed(
    // Instruction
    &spl_token::instruction::mint_to(
    token_program.key,
    token_mint.key,
    user_ata.key,
    mint_auth.key,
    &[],
    10*LAMPORTS_PER_SOL,
    )?,
    // Account_infos
    &[token_mint.clone(), user_ata.clone(), mint_auth.clone()],
    // Seeds
    &[&[b"token_auth", &[mint_auth_bump]]],
    )?;

    Ok(())

    mint_to 是来自SPL令牌库的指令,所以我们还需更新顶部的导入内容:

    // Existing imports
    use spl_token::{instruction::{initialize_mint, mint_to}, ID as TOKEN_PROGRAM_ID};

    我们的评论功能已经完成了!现在每当有人留下评论时,我们就会给他们发送10个代币。

    我们将在 add_comment 函数中执行完全相同的操作: processor.rs

    // Inside add_comment
    let account_info_iter = &mut accounts.iter();

    let commenter = next_account_info(account_info_iter)?;
    let pda_review = next_account_info(account_info_iter)?;
    let pda_counter = next_account_info(account_info_iter)?;
    let pda_comment = next_account_info(account_info_iter)?;
    let token_mint = next_account_info(account_info_iter)?;
    let mint_auth = next_account_info(account_info_iter)?;
    let user_ata = next_account_info(account_info_iter)?;
    let system_program = next_account_info(account_info_iter)?;
    let token_program = next_account_info(account_info_iter)?;

    // Mint tokens here
    msg!("deriving mint authority");
    let (mint_pda, _mint_bump) = Pubkey::find_program_address(&[b"token_mint"], program_id);
    let (mint_auth_pda, mint_auth_bump) =
    Pubkey::find_program_address(&[b"token_auth"], program_id);

    if *token_mint.key != mint_pda {
    msg!("Incorrect token mint");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *mint_auth.key != mint_auth_pda {
    msg!("Mint passed in and mint derived do not match");
    return Err(ReviewError::InvalidPDA.into());
    }

    if *user_ata.key != get_associated_token_address(commenter.key, token_mint.key) {
    msg!("Incorrect token mint");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *token_program.key != TOKEN_PROGRAM_ID {
    msg!("Incorrect token program");
    return Err(ReviewError::IncorrectAccountError.into());
    }
    msg!("Minting 5 tokens to User associated token account");
    invoke_signed(
    // Instruction
    &spl_token::instruction::mint_to(
    token_program.key,
    token_mint.key,
    user_ata.key,
    mint_auth.key,
    &[],
    5 * LAMPORTS_PER_SOL,
    )?,
    // Account_infos
    &[token_mint.clone(), user_ata.clone(), mint_auth.clone()],
    // Seeds
    &[&[b"token_auth", &[mint_auth_bump]]],
    )?;

    Ok(())

    注意,不要重复 Ok(()) ,因为那会导致错误。

    希望你现在能够看出这些模式的共通性了。虽然在进行本地开发时,我们需要写很多代码,但整个工作流程相当简单,并且感觉很“纯粹”。

    🚀 构建、部署和测试

    是时候赚取一些爆米花代币了 🍿

    首先,让我们开始构建和部署项目。

    cargo build-sbf
    solana program deploy <PATH>

    接下来,我们将测试初始化代币铸造流程。

    git clone https://github.com/buildspace/solana-movie-token-client
    cd solana-movie-token-client
    npm install

    和以前一样,需要进行以下操作:

    1. index.ts 中更新 PROGRAM_ID 的值。
    2. 修改第67行的连接为在线连接。
    const connection = new web3.Connection("http://localhost:8899");

    运行 npm start 后,你的 Mint 账户将会被初始化。

    最后,我们可以使用前端来发送电影评论,并因此获得一些代币。

    像往常一样,你可以继续使用之前停下的前端,或者从正确的分支创建一个新的实例。

    git clone https://github.com/buildspace/solana-movie-frontend/
    cd solana-movie-frontend
    git checkout solution-add-tokens
    npm install

    更新 PROGRAM_ID,提交评论,发表评论后,你现在应该能在 Phantom 钱包中看到你的代币了!

    🚢 挑战

    为了运用你在本课程中学到的有关 CPI 的知识,不妨考虑如何将其整合到学生介绍方案中。你可以做些类似我们演示中的事情,比如在用户自我介绍时铸造一些代币给他们。或者,如果你感到更有挑战性,思考如何将课程中学到的所有内容整合在一起,从零开始创建全新的项目。

    如果你选择做类似的演示,可以自由使用相同的脚本来调用 initialize_mint 指令,或者你可以展现创造力,从客户端初始化铸币过程,然后将铸币权限转移到程序 PDA。如果你需要查看可能的解决方案,请查看这个游乐场链接

    享受编程的乐趣,并将此视为自我提升的机会!

    - +
    Skip to main content

    💸 使用CPI构建支付系统

    上一堂课我们已经完成了Mint账户的准备工作,热身环节到此结束,现在正式开始主要表演。

    我们将深入到审查和评论的工作流程中,并添加必要的逻辑来铸造代币。

    我们首先从电影评论开始。请转到 processor.rs 文件,并更新 add_movie_review 函数,以便接收额外的账户。

    // Inside add_movie_review
    msg!("Adding movie review...");
    msg!("Title: {}", title);
    msg!("Rating: {}", rating);
    msg!("Description: {}", description);

    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 pda_counter = next_account_info(account_info_iter)?;
    let token_mint = next_account_info(account_info_iter)?;
    let mint_auth = next_account_info(account_info_iter)?;
    let user_ata = next_account_info(account_info_iter)?;
    let system_program = next_account_info(account_info_iter)?;
    let token_program = next_account_info(account_info_iter)?;

    新增的部分包括:

    • token_mint - 代币的铸币地址。
    • mint_auth - 代币铸造机构的地址。
    • user_ata - 用户与此代币发行机构关联的令牌账户(用于代币铸造)。
    • token_program - 代币程序的地址。

    这里并没有太多特殊之处,这些只是处理代币时所期望的账户。

    还记得我们的编程习惯吗?每次添加一个账户后,立即添加验证!以下是我们需要在 add_movie_review 函数中添加的内容:

    msg!("deriving mint authority");
    let (mint_pda, _mint_bump) = Pubkey::find_program_address(&[b"token_mint"], program_id);
    let (mint_auth_pda, mint_auth_bump) =
    Pubkey::find_program_address(&[b"token_auth"], program_id);

    if *token_mint.key != mint_pda {
    msg!("Incorrect token mint");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *mint_auth.key != mint_auth_pda {
    msg!("Mint passed in and mint derived do not match");
    return Err(ReviewError::InvalidPDA.into());
    }

    if *user_ata.key != get_associated_token_address(initializer.key, token_mint.key) {
    msg!("Incorrect token mint");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *token_program.key != TOKEN_PROGRAM_ID {
    msg!("Incorrect token program");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    你现在已经反复实践过这样的流程,所以这些操作应该感觉得相当熟悉了 :)

    现在我们可以开始铸币了!就在程序结束之前,我们会添加如下代码: Ok(())

    msg!("Minting 10 tokens to User associated token account");
    invoke_signed(
    // Instruction
    &spl_token::instruction::mint_to(
    token_program.key,
    token_mint.key,
    user_ata.key,
    mint_auth.key,
    &[],
    10*LAMPORTS_PER_SOL,
    )?,
    // Account_infos
    &[token_mint.clone(), user_ata.clone(), mint_auth.clone()],
    // Seeds
    &[&[b"token_auth", &[mint_auth_bump]]],
    )?;

    Ok(())

    mint_to 是来自SPL令牌库的指令,所以我们还需更新顶部的导入内容:

    // Existing imports
    use spl_token::{instruction::{initialize_mint, mint_to}, ID as TOKEN_PROGRAM_ID};

    我们的评论功能已经完成了!现在每当有人留下评论时,我们就会给他们发送10个代币。

    我们将在 add_comment 函数中执行完全相同的操作: processor.rs

    // Inside add_comment
    let account_info_iter = &mut accounts.iter();

    let commenter = next_account_info(account_info_iter)?;
    let pda_review = next_account_info(account_info_iter)?;
    let pda_counter = next_account_info(account_info_iter)?;
    let pda_comment = next_account_info(account_info_iter)?;
    let token_mint = next_account_info(account_info_iter)?;
    let mint_auth = next_account_info(account_info_iter)?;
    let user_ata = next_account_info(account_info_iter)?;
    let system_program = next_account_info(account_info_iter)?;
    let token_program = next_account_info(account_info_iter)?;

    // Mint tokens here
    msg!("deriving mint authority");
    let (mint_pda, _mint_bump) = Pubkey::find_program_address(&[b"token_mint"], program_id);
    let (mint_auth_pda, mint_auth_bump) =
    Pubkey::find_program_address(&[b"token_auth"], program_id);

    if *token_mint.key != mint_pda {
    msg!("Incorrect token mint");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *mint_auth.key != mint_auth_pda {
    msg!("Mint passed in and mint derived do not match");
    return Err(ReviewError::InvalidPDA.into());
    }

    if *user_ata.key != get_associated_token_address(commenter.key, token_mint.key) {
    msg!("Incorrect token mint");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *token_program.key != TOKEN_PROGRAM_ID {
    msg!("Incorrect token program");
    return Err(ReviewError::IncorrectAccountError.into());
    }
    msg!("Minting 5 tokens to User associated token account");
    invoke_signed(
    // Instruction
    &spl_token::instruction::mint_to(
    token_program.key,
    token_mint.key,
    user_ata.key,
    mint_auth.key,
    &[],
    5 * LAMPORTS_PER_SOL,
    )?,
    // Account_infos
    &[token_mint.clone(), user_ata.clone(), mint_auth.clone()],
    // Seeds
    &[&[b"token_auth", &[mint_auth_bump]]],
    )?;

    Ok(())

    注意,不要重复 Ok(()) ,因为那会导致错误。

    希望你现在能够看出这些模式的共通性了。虽然在进行本地开发时,我们需要写很多代码,但整个工作流程相当简单,并且感觉很“纯粹”。

    🚀 构建、部署和测试

    是时候赚取一些爆米花代币了 🍿

    首先,让我们开始构建和部署项目。

    cargo build-sbf
    solana program deploy <PATH>

    接下来,我们将测试初始化代币铸造流程。

    git clone https://github.com/buildspace/solana-movie-token-client
    cd solana-movie-token-client
    npm install

    和以前一样,需要进行以下操作:

    1. index.ts 中更新 PROGRAM_ID 的值。
    2. 修改第67行的连接为在线连接。
    const connection = new web3.Connection("http://localhost:8899");

    运行 npm start 后,你的 Mint 账户将会被初始化。

    最后,我们可以使用前端来发送电影评论,并因此获得一些代币。

    像往常一样,你可以继续使用之前停下的前端,或者从正确的分支创建一个新的实例。

    git clone https://github.com/buildspace/solana-movie-frontend/
    cd solana-movie-frontend
    git checkout solution-add-tokens
    npm install

    更新 PROGRAM_ID,提交评论,发表评论后,你现在应该能在 Phantom 钱包中看到你的代币了!

    🚢 挑战

    为了运用你在本课程中学到的有关 CPI 的知识,不妨考虑如何将其整合到学生介绍方案中。你可以做些类似我们演示中的事情,比如在用户自我介绍时铸造一些代币给他们。或者,如果你感到更有挑战性,思考如何将课程中学到的所有内容整合在一起,从零开始创建全新的项目。

    如果你选择做类似的演示,可以自由使用相同的脚本来调用 initialize_mint 指令,或者你可以展现创造力,从客户端初始化铸币过程,然后将铸币权限转移到程序 PDA。如果你需要查看可能的解决方案,请查看这个游乐场链接

    享受编程的乐趣,并将此视为自我提升的机会!

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/cross-program-invocations/index.html b/Solana-Co-Learn/module4/cross-program-invocations/index.html index 535a1b01c..e642e7cbe 100644 --- a/Solana-Co-Learn/module4/cross-program-invocations/index.html +++ b/Solana-Co-Learn/module4/cross-program-invocations/index.html @@ -5,13 +5,13 @@ CPIs(跨程序调用) | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/cross-program-invocations/mint-token-for-users/index.html b/Solana-Co-Learn/module4/cross-program-invocations/mint-token-for-users/index.html index 9b472f6e3..c97d686eb 100644 --- a/Solana-Co-Learn/module4/cross-program-invocations/mint-token-for-users/index.html +++ b/Solana-Co-Learn/module4/cross-program-invocations/mint-token-for-users/index.html @@ -5,13 +5,13 @@ 🥇 为用户铸造代币 | All in One Solana - +
    -
    Skip to main content

    🥇 为用户铸造代币

    我们的电影评论项目进展得不错,但还没有充分体现Web3的特性。目前我们主要将Solana用作数据库。让我们通过奖励用户增加一些趣味性吧!每当用户评论一部电影或留下评论时,我们将为其铸造代币。这可以想象成StackOverflow,只不过是用代币来代替点赞。

    你可以在上一次的本地环境上继续开发,或者通过复制这个环境来创建一个新的环境。

    git clone https://github.com/buildspace/solana-movie-program/
    cd solana-movie-program
    git checkout solution-add-comments

    我们将使用SPL代币程序来实现所有这些神奇的功能,所以请更新 Cargo.toml 文件中的依赖项:

    [dependencies]
    solana-program = "~1.10.29"
    borsh = "0.9.3"
    thiserror = "1.0.31"
    spl-token = { version="3.2.0", features = [ "no-entrypoint" ] }
    spl-associated-token-account = { version="=1.0.5", features = [ "no-entrypoint" ] }

    让我们快速测试一下,看看是否能够使用这些新的依赖项正常构建:cargo build-sbf

    一切就绪,我们现在可以开始构建了!

    🤖 设置代币铸造

    我们首先要创建一个代币铸造。提醒一下:代币铸造是一个特殊的账户,用于存储我们的代币数据。

    这是一条新的指令,所以我们将按照添加评论支持时的相同步骤来操作:

    • 更新指令枚举
    • 更新unpack函数
    • 更新 process_instruction 函数

    instruction.rs开始,我们先更新枚举:

    pub enum MovieInstruction {
    AddMovieReview {
    title: String,
    rating: u8,
    description: String,
    },
    UpdateMovieReview {
    title: String,
    rating: u8,
    description: String,
    },
    AddComment {
    comment: String,
    },
    InitializeMint, // 这里新增了初始化铸币的操作
    }

    这里我们不需要任何字段——调用该函数时只需提供地址!

    接下来,我们将更新解包函数:

    impl MovieInstruction {
    pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
    let (&variant, rest) = input
    .split_first()
    .ok_or(ProgramError::InvalidInstructionData)?;
    Ok(match variant {
    0 => {
    let payload = MovieReviewPayload::try_from_slice(rest).unwrap();
    Self::AddMovieReview {
    title: payload.title,
    rating: payload.rating,
    description: payload.description,
    }
    }
    1 => {
    let payload = MovieReviewPayload::try_from_slice(rest).unwrap();
    Self::UpdateMovieReview {
    title: payload.title,
    rating: payload.rating,
    description: payload.description,
    }
    }
    2 => {
    let payload = CommentPayload::try_from_slice(rest).unwrap();
    Self::AddComment {
    comment: payload.comment,
    }
    }
    // 这里新增了初始化铸币的操作
    3 => Self::InitializeMint,
    _ => return Err(ProgramError::InvalidInstructionData),
    })
    }
    }

    你会立即注意到 process_instruction 的匹配语句中存在错误,因为我们没有处理所有情况。让我们通过引入新的SPL导入并添加到匹配语句中来修复这个问题,继续往下开发。

    // Update imports at the top
    use solana_program::{
    //Existing imports within solana_program

    sysvar::{rent::Rent, Sysvar, rent::ID as RENT_PROGRAM_ID},
    native_token::LAMPORTS_PER_SOL,
    system_program::ID as SYSTEM_PROGRAM_ID
    }
    use spl_associated_token_account::get_associated_token_address;
    use spl_token::{instruction::initialize_mint, ID as TOKEN_PROGRAM_ID};

    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),
    MovieInstruction::UpdateMovieReview {
    title,
    rating,
    description,
    } => update_movie_review(program_id, accounts, title, rating, description),
    MovieInstruction::AddComment { comment } => add_comment(program_id, accounts, comment),
    // New instruction handled here to initialize the mint account
    MovieInstruction::InitializeMint => initialize_token_mint(program_id, accounts),
    }
    }
    // Rest of the file remains the same

    最后,在 initialize_token_mint 功能之后,我们可以在 processor.rs 底部实施 add_comment 账户

    pub fn initialize_token_mint(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult {
    let account_info_iter = &mut accounts.iter();

    // The order of accounts is not arbitrary, the client will send them in this order
    // Whoever sent in the transaction
    let initializer = next_account_info(account_info_iter)?;
    // Token mint PDA - derived on the client
    let token_mint = next_account_info(account_info_iter)?;
    // Token mint authority
    let mint_auth = next_account_info(account_info_iter)?;
    // System program to create a new account
    let system_program = next_account_info(account_info_iter)?;
    // Solana Token program address
    let token_program = next_account_info(account_info_iter)?;
    // System account to calcuate the rent
    let sysvar_rent = next_account_info(account_info_iter)?;

    // Derive the mint PDA again so we can validate it
    // The seed is just "token_mint"
    let (mint_pda, mint_bump) = Pubkey::find_program_address(&[b"token_mint"], program_id);
    // Derive the mint authority so we can validate it
    // The seed is just "token_auth"
    let (mint_auth_pda, _mint_auth_bump) =
    Pubkey::find_program_address(&[b"token_auth"], program_id);

    msg!("Token mint: {:?}", mint_pda);
    msg!("Mint authority: {:?}", mint_auth_pda);

    // Validate the important accounts passed in
    if mint_pda != *token_mint.key {
    msg!("Incorrect token mint account");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *token_program.key != TOKEN_PROGRAM_ID {
    msg!("Incorrect token program");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *mint_auth.key != mint_auth_pda {
    msg!("Incorrect mint auth account");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *system_program.key != SYSTEM_PROGRAM_ID {
    msg!("Incorrect system program");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *sysvar_rent.key != RENT_PROGRAM_ID {
    msg!("Incorrect rent program");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    // Calculate the rent
    let rent = Rent::get()?;
    // We know the size of a mint account is 82 (remember it lol)
    let rent_lamports = rent.minimum_balance(82);

    // Create the token mint PDA
    invoke_signed(
    &system_instruction::create_account(
    initializer.key,
    token_mint.key,
    rent_lamports,
    82, // Size of the token mint account
    token_program.key,
    ),
    // Accounts we're reading from or writing to
    &[
    initializer.clone(),
    token_mint.clone(),
    system_program.clone(),
    ],
    // Seeds for our token mint account
    &[&[b"token_mint", &[mint_bump]]],
    )?;

    msg!("Created token mint account");

    // Initialize the mint account
    invoke_signed(
    &initialize_mint(
    token_program.key,
    token_mint.key,
    mint_auth.key,
    Option::None, // Freeze authority - we don't want anyone to be able to freeze!
    9, // Number of decimals
    )?,
    // Which accounts we're reading from or writing to
    &[token_mint.clone(), sysvar_rent.clone(), mint_auth.clone()],
    // The seeds for our token mint PDA
    &[&[b"token_mint", &[mint_bump]]],
    )?;

    msg!("Initialized token mint");

    Ok(())
    }

    在高层次上,这里的操作过程可概括为以下几个步骤:

    1. 遍历账户列表,提取必要的信息。
    2. 派生代币的mint PDA(程序派生地址)。
    3. 对传入的重要账户进行验证:
      • Token mint account - 代币铸币账户。
      • Mint authority account - 铸币权限账户。
      • System program - 系统程序。
      • Token program - 代币程序。
      • Sysvar rent - 用于计算租金的系统变量账户。
    4. 计算mint account所需的租金。
    5. 创建token mint PDA
    6. 初始化mint account

    由于我们调用了一个未声明的新错误类型,你会收到一个错误提示。解决方法是打开error.rs文件,并将IncorrectAccountError添加到ReviewError枚举中。

    #[derive(Debug, Error)]
    pub enum ReviewError {
    #[error("Account not initialized yet")]
    UninitializedAccount,

    #[error("PDA derived does not equal PDA passed in")]
    InvalidPDA,

    #[error("Input data exceeds max length")]
    InvalidDataLength,

    #[error("Rating greater than 5 or less than 1")]
    InvalidRating,

    // 新增的错误类型
    #[error("Accounts do not match")]
    IncorrectAccountError,
    }

    这个错误信息非常直观。

    然后,在文件浏览器中打开目标文件夹,并在部署文件夹中删除密钥对。

    回到你的控制台,运行:

    cargo build-sbf

    然后复制并粘贴控制台打印的部署命令。

    如果你遇到insufficient funds的问题,请直接运行solana airdrop 2

    一旦在本地部署完成,你就可以开始进行测试了!我们将使用本地客户端脚本来测试账户初始化。以下是你需要做的设置步骤:

    git clone https://github.com/buildspace/solana-movie-token-client
    cd solana-movie-token-client
    npm install

    在运行脚本之前,请:

    1. 更新index.ts中的PROGRAM_ID
    2. 将第67行的连接更改为你的本地连接:
    const connection = new web3.Connection("http://localhost:8899");
    1. 在第二个控制台窗口中运行solana logs PROGRAM_ID_HERE

    现在,你应该有一个控制台正在记录此程序的所有输出,并且已准备好运行脚本。

    如果你运行npm start,你应该能够看到有关创建铸币账户的日志信息。

    :D

    - +
    Skip to main content

    🥇 为用户铸造代币

    我们的电影评论项目进展得不错,但还没有充分体现Web3的特性。目前我们主要将Solana用作数据库。让我们通过奖励用户增加一些趣味性吧!每当用户评论一部电影或留下评论时,我们将为其铸造代币。这可以想象成StackOverflow,只不过是用代币来代替点赞。

    你可以在上一次的本地环境上继续开发,或者通过复制这个环境来创建一个新的环境。

    git clone https://github.com/buildspace/solana-movie-program/
    cd solana-movie-program
    git checkout solution-add-comments

    我们将使用SPL代币程序来实现所有这些神奇的功能,所以请更新 Cargo.toml 文件中的依赖项:

    [dependencies]
    solana-program = "~1.10.29"
    borsh = "0.9.3"
    thiserror = "1.0.31"
    spl-token = { version="3.2.0", features = [ "no-entrypoint" ] }
    spl-associated-token-account = { version="=1.0.5", features = [ "no-entrypoint" ] }

    让我们快速测试一下,看看是否能够使用这些新的依赖项正常构建:cargo build-sbf

    一切就绪,我们现在可以开始构建了!

    🤖 设置代币铸造

    我们首先要创建一个代币铸造。提醒一下:代币铸造是一个特殊的账户,用于存储我们的代币数据。

    这是一条新的指令,所以我们将按照添加评论支持时的相同步骤来操作:

    • 更新指令枚举
    • 更新unpack函数
    • 更新 process_instruction 函数

    instruction.rs开始,我们先更新枚举:

    pub enum MovieInstruction {
    AddMovieReview {
    title: String,
    rating: u8,
    description: String,
    },
    UpdateMovieReview {
    title: String,
    rating: u8,
    description: String,
    },
    AddComment {
    comment: String,
    },
    InitializeMint, // 这里新增了初始化铸币的操作
    }

    这里我们不需要任何字段——调用该函数时只需提供地址!

    接下来,我们将更新解包函数:

    impl MovieInstruction {
    pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
    let (&variant, rest) = input
    .split_first()
    .ok_or(ProgramError::InvalidInstructionData)?;
    Ok(match variant {
    0 => {
    let payload = MovieReviewPayload::try_from_slice(rest).unwrap();
    Self::AddMovieReview {
    title: payload.title,
    rating: payload.rating,
    description: payload.description,
    }
    }
    1 => {
    let payload = MovieReviewPayload::try_from_slice(rest).unwrap();
    Self::UpdateMovieReview {
    title: payload.title,
    rating: payload.rating,
    description: payload.description,
    }
    }
    2 => {
    let payload = CommentPayload::try_from_slice(rest).unwrap();
    Self::AddComment {
    comment: payload.comment,
    }
    }
    // 这里新增了初始化铸币的操作
    3 => Self::InitializeMint,
    _ => return Err(ProgramError::InvalidInstructionData),
    })
    }
    }

    你会立即注意到 process_instruction 的匹配语句中存在错误,因为我们没有处理所有情况。让我们通过引入新的SPL导入并添加到匹配语句中来修复这个问题,继续往下开发。

    // Update imports at the top
    use solana_program::{
    //Existing imports within solana_program

    sysvar::{rent::Rent, Sysvar, rent::ID as RENT_PROGRAM_ID},
    native_token::LAMPORTS_PER_SOL,
    system_program::ID as SYSTEM_PROGRAM_ID
    }
    use spl_associated_token_account::get_associated_token_address;
    use spl_token::{instruction::initialize_mint, ID as TOKEN_PROGRAM_ID};

    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),
    MovieInstruction::UpdateMovieReview {
    title,
    rating,
    description,
    } => update_movie_review(program_id, accounts, title, rating, description),
    MovieInstruction::AddComment { comment } => add_comment(program_id, accounts, comment),
    // New instruction handled here to initialize the mint account
    MovieInstruction::InitializeMint => initialize_token_mint(program_id, accounts),
    }
    }
    // Rest of the file remains the same

    最后,在 initialize_token_mint 功能之后,我们可以在 processor.rs 底部实施 add_comment 账户

    pub fn initialize_token_mint(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult {
    let account_info_iter = &mut accounts.iter();

    // The order of accounts is not arbitrary, the client will send them in this order
    // Whoever sent in the transaction
    let initializer = next_account_info(account_info_iter)?;
    // Token mint PDA - derived on the client
    let token_mint = next_account_info(account_info_iter)?;
    // Token mint authority
    let mint_auth = next_account_info(account_info_iter)?;
    // System program to create a new account
    let system_program = next_account_info(account_info_iter)?;
    // Solana Token program address
    let token_program = next_account_info(account_info_iter)?;
    // System account to calcuate the rent
    let sysvar_rent = next_account_info(account_info_iter)?;

    // Derive the mint PDA again so we can validate it
    // The seed is just "token_mint"
    let (mint_pda, mint_bump) = Pubkey::find_program_address(&[b"token_mint"], program_id);
    // Derive the mint authority so we can validate it
    // The seed is just "token_auth"
    let (mint_auth_pda, _mint_auth_bump) =
    Pubkey::find_program_address(&[b"token_auth"], program_id);

    msg!("Token mint: {:?}", mint_pda);
    msg!("Mint authority: {:?}", mint_auth_pda);

    // Validate the important accounts passed in
    if mint_pda != *token_mint.key {
    msg!("Incorrect token mint account");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *token_program.key != TOKEN_PROGRAM_ID {
    msg!("Incorrect token program");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *mint_auth.key != mint_auth_pda {
    msg!("Incorrect mint auth account");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *system_program.key != SYSTEM_PROGRAM_ID {
    msg!("Incorrect system program");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    if *sysvar_rent.key != RENT_PROGRAM_ID {
    msg!("Incorrect rent program");
    return Err(ReviewError::IncorrectAccountError.into());
    }

    // Calculate the rent
    let rent = Rent::get()?;
    // We know the size of a mint account is 82 (remember it lol)
    let rent_lamports = rent.minimum_balance(82);

    // Create the token mint PDA
    invoke_signed(
    &system_instruction::create_account(
    initializer.key,
    token_mint.key,
    rent_lamports,
    82, // Size of the token mint account
    token_program.key,
    ),
    // Accounts we're reading from or writing to
    &[
    initializer.clone(),
    token_mint.clone(),
    system_program.clone(),
    ],
    // Seeds for our token mint account
    &[&[b"token_mint", &[mint_bump]]],
    )?;

    msg!("Created token mint account");

    // Initialize the mint account
    invoke_signed(
    &initialize_mint(
    token_program.key,
    token_mint.key,
    mint_auth.key,
    Option::None, // Freeze authority - we don't want anyone to be able to freeze!
    9, // Number of decimals
    )?,
    // Which accounts we're reading from or writing to
    &[token_mint.clone(), sysvar_rent.clone(), mint_auth.clone()],
    // The seeds for our token mint PDA
    &[&[b"token_mint", &[mint_bump]]],
    )?;

    msg!("Initialized token mint");

    Ok(())
    }

    在高层次上,这里的操作过程可概括为以下几个步骤:

    1. 遍历账户列表,提取必要的信息。
    2. 派生代币的mint PDA(程序派生地址)。
    3. 对传入的重要账户进行验证:
      • Token mint account - 代币铸币账户。
      • Mint authority account - 铸币权限账户。
      • System program - 系统程序。
      • Token program - 代币程序。
      • Sysvar rent - 用于计算租金的系统变量账户。
    4. 计算mint account所需的租金。
    5. 创建token mint PDA
    6. 初始化mint account

    由于我们调用了一个未声明的新错误类型,你会收到一个错误提示。解决方法是打开error.rs文件,并将IncorrectAccountError添加到ReviewError枚举中。

    #[derive(Debug, Error)]
    pub enum ReviewError {
    #[error("Account not initialized yet")]
    UninitializedAccount,

    #[error("PDA derived does not equal PDA passed in")]
    InvalidPDA,

    #[error("Input data exceeds max length")]
    InvalidDataLength,

    #[error("Rating greater than 5 or less than 1")]
    InvalidRating,

    // 新增的错误类型
    #[error("Accounts do not match")]
    IncorrectAccountError,
    }

    这个错误信息非常直观。

    然后,在文件浏览器中打开目标文件夹,并在部署文件夹中删除密钥对。

    回到你的控制台,运行:

    cargo build-sbf

    然后复制并粘贴控制台打印的部署命令。

    如果你遇到insufficient funds的问题,请直接运行solana airdrop 2

    一旦在本地部署完成,你就可以开始进行测试了!我们将使用本地客户端脚本来测试账户初始化。以下是你需要做的设置步骤:

    git clone https://github.com/buildspace/solana-movie-token-client
    cd solana-movie-token-client
    npm install

    在运行脚本之前,请:

    1. 更新index.ts中的PROGRAM_ID
    2. 将第67行的连接更改为你的本地连接:
    const connection = new web3.Connection("http://localhost:8899");
    1. 在第二个控制台窗口中运行solana logs PROGRAM_ID_HERE

    现在,你应该有一个控制台正在记录此程序的所有输出,并且已准备好运行脚本。

    如果你运行npm start,你应该能够看到有关创建铸币账户的日志信息。

    :D

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/cross-program-invocations/the-cross-program-boss-fight/index.html b/Solana-Co-Learn/module4/cross-program-invocations/the-cross-program-boss-fight/index.html index f2fd96e58..97a514d51 100644 --- a/Solana-Co-Learn/module4/cross-program-invocations/the-cross-program-boss-fight/index.html +++ b/Solana-Co-Learn/module4/cross-program-invocations/the-cross-program-boss-fight/index.html @@ -5,13 +5,13 @@ ⚔ 跨项目的Boss战斗 | All in One Solana - +
    -
    Skip to main content

    ⚔ 跨项目的Boss战斗

    如果你是一位玩家,可能曾经玩过那些具有庞大Boss战的游戏。这类Boss通常强大到个人难以战胜,因此你必须与朋友们联手攻击它们。就像灭霸与复仇者联盟的战斗一样。

    战胜这些Boss的秘诀在于合作。每个人共同出力,施展自己的能力。Solana为你提供了合作的超能力:可组合性是其架构的核心设计原则。

    能够释放这种力量的是什么呢?那就是跨程序调用,或者称作CPIs

    想象一下你的终极NFT质押项目。在这里,我们将进行许多与代币相关的操作(质押、赎回、解质押),无需自己从头构建,只需调用代币程序,它就会为我们处理这些操作。

    🔀 跨程序调用

    跨程序调用是一种程序直接调用另一个程序的方式。就如同任何客户端可以通过JSON RPC调用任何程序,任何程序也可以直接调用其他程序。

    CPIs将整个Solana生态系统本质上转变为一个巨大的API,作为开发者,你可以随意发挥。

    🤔 如何制作一个CPI

    你之前已经操作过几次CPI,所以这应该看起来非常熟悉!

    CPIs是通过使用 solana_program 库中的invokeinvoke_signed函数创建的。

    CPIs能够将调用者的签名权限赋予被调用者。

    • invoke将原始交易签名传递给你想要调用的程序。
    • invoke_signed允许你的程序通过所谓的PDA(程序派生地址)“签署”指令。
    // Used when there are not signatures for PDAs needed
    pub fn invoke(
    instruction: &Instruction,
    account_infos: &[AccountInfo<'_>]
    ) -> ProgramResult

    // Used when a program must provide a 'signature' for a PDA, hence the signer_seeds parameter
    pub fn invoke_signed(
    instruction: &Instruction,
    account_infos: &[AccountInfo<'_>],
    signers_seeds: &[&[&[u8]]]
    ) -> ProgramResult

    Instruction 类型的定义如下:

    • program_id - 指定要调用的程序的公钥。
    • accounts - 一个包含账户元数据的向量列表,你需要将被调用程序将要读取或写入的所有账户都包括进去。
    • data - 一个字节缓冲区,代表作为向被调用程序传递的数据的向量。

    根据你所调用的程序的不同,可能会有一个特定的 crate 包含辅助函数来创建 Instruction 对象。accountsdata 字段都是 Vec 类型,即向量。你可以使用 vec 宏,利用数组表示法构建一个向量。

    pub struct Instruction {
    pub program_id: Pubkey,
    pub accounts: Vec<AccountMeta>,
    pub data: Vec<u8>,
    }

    accounts 字段需要一个类型为AccountMeta的向量。Instruction 结构的以下字段详细展示了 AccountMeta 的内容:

    pub struct AccountMeta {
    pub pubkey: Pubkey,
    pub is_signer: bool,
    pub is_writable: bool,
    }

    例如:

    • AccountMeta::new - 表示账户可写。
    • AccountMeta::read_only - 表示账户不可写入。
    • (account1_pubkey, true) - 表示账户是签署人。
    • (account2_pubkey, false) - 表示账户不是签署人。
    use solana_program::instruction::AccountMeta;

    let accounts = vec![
    AccountMeta::new(account1_pubkey, true),
    AccountMeta::new(account2_pubkey, false),
    AccountMeta::read_only(account3_pubkey, false),
    AccountMeta::read_only(account4_pubkey, true),
    ];

    以下是一个创建 Instruction 的示例:

    • accounts - 指令所需的 AccountMeta 的向量。
    • data - 指令所需的序列化指令数据。
    • programId - 被调用的程序。
    • 使用 solana_program::instruction::Instruction 来创建新的 Instruction
    use solana_program::instruction::{AccountMeta, Instruction};

    let accounts = vec![
    AccountMeta::new(account1_pubkey, true),
    AccountMeta::new(account2_pubkey, false),
    AccountMeta::read_only(account3_pubkey, false),
    AccountMeta::read_only(account4_pubkey, true),
    ];

    struct InstructionData {
    amount: u8,
    }

    let data = BorshSerialize.try_to_vec(InstructionData { amount: 1 });

    let instruction = Instruction {
    program_id: *program_id,
    accounts,
    data,
    };

    📜 传递账户列表

    在底层,invokeinvoke_signed 实质上都是交易,所以我们需要传入一个 account_info 对象的列表。

    你可以使用在 solana_program 包中的 account_info 结构体上实现的 Clone Trait 来复制每个需要传递到CPIaccount_info 对象。

    Clone trait 会返回一个 account_info 实例的副本。

    &[first_account.clone(), second_account.clone(), third_account.clone()]

    🏒 CPIinvoke

    请记住 - 调用其实就是像传递交易一样,执行这个操作的程序并不会真正接触到它。这意味着无需包含签名,因为Solana的运行时会将原始签名传递给你的程序。

    🏑 CPIinvoke_signed

    每当我们使用PDA时,我们会使用 invoke_signed 并传入种子。

    Solana运行时将使用提供的种子和调用程序的 program_id 内部调用create_program_address,然后将结果与指令中提供的地址进行比较。如果有任何账户地址与PDA匹配,该账户上的 is_signer 标志将被设置为 true

    这就像一条效率的捷径!

    😲 最佳实践与常见陷阱

    执行CPI时,你可能会遇到一些常见错误,通常表明你在构建CPI时使用了错误的信息。

    例如,“签名者权限升级”表示你在指示中错误地代签地址。如果你在使用 invoke_signed 并收到此错误,可能是你提供的种子不正确。

    EF1M4SPfKcchb6scq297y8FPCaLvj5kGjwMzjTM68wjA's signer privilege escalated
    Program returned error: "Cross-program invocation with unauthorized signer or writable account"

    还有其他可能导致问题的情况,包括:

    • 任何可能被程序修改的账户必须指定为可写入。
    • 写入未指定为可写的账户会导致交易失败。
    • 写入不属于该程序的账户也会导致交易失败。
    • 任何可能在程序执行期间被修改的Lamport余额的账户也必须被指定为可写入。
    • 等等。
    2qoeXa9fo8xVHzd2h9mVcueh6oK3zmAiJxCTySM5rbLZ's writable privilege escalated
    Program returned error: "Cross-program invocation with unauthorized signer or writable account"

    这里的核心概念是,如果你不在交易中明确声明你要操作这些账户,那么你就不能随意对其进行操作。

    🤔 意义何在

    CPISolana生态系统的一项关键特性,它允许所有部署的程序之间互操作。这为在现有基础上构建新协议和应用提供了可能,就像搭积木一样。

    可组合性是加密货币的一个重要组成部分,而CPI则使其在Solana上成为可能。

    CPI的另一重要方面是它们允许程序为其PDAs签名。正如你可能已经注意到的,PDAs在Solana开发中被广泛使用,因为它们允许程序以特定方式控制特定地址,以便没有外部用户能够为这些地址生成有效签名的交易。

    通过这些解释,希望对Solana中的CPI技术有更深入的理解。如果你还有任何问题或需要进一步解释,请随时提问。

    - +
    Skip to main content

    ⚔ 跨项目的Boss战斗

    如果你是一位玩家,可能曾经玩过那些具有庞大Boss战的游戏。这类Boss通常强大到个人难以战胜,因此你必须与朋友们联手攻击它们。就像灭霸与复仇者联盟的战斗一样。

    战胜这些Boss的秘诀在于合作。每个人共同出力,施展自己的能力。Solana为你提供了合作的超能力:可组合性是其架构的核心设计原则。

    能够释放这种力量的是什么呢?那就是跨程序调用,或者称作CPIs

    想象一下你的终极NFT质押项目。在这里,我们将进行许多与代币相关的操作(质押、赎回、解质押),无需自己从头构建,只需调用代币程序,它就会为我们处理这些操作。

    🔀 跨程序调用

    跨程序调用是一种程序直接调用另一个程序的方式。就如同任何客户端可以通过JSON RPC调用任何程序,任何程序也可以直接调用其他程序。

    CPIs将整个Solana生态系统本质上转变为一个巨大的API,作为开发者,你可以随意发挥。

    🤔 如何制作一个CPI

    你之前已经操作过几次CPI,所以这应该看起来非常熟悉!

    CPIs是通过使用 solana_program 库中的invokeinvoke_signed函数创建的。

    CPIs能够将调用者的签名权限赋予被调用者。

    • invoke将原始交易签名传递给你想要调用的程序。
    • invoke_signed允许你的程序通过所谓的PDA(程序派生地址)“签署”指令。
    // Used when there are not signatures for PDAs needed
    pub fn invoke(
    instruction: &Instruction,
    account_infos: &[AccountInfo<'_>]
    ) -> ProgramResult

    // Used when a program must provide a 'signature' for a PDA, hence the signer_seeds parameter
    pub fn invoke_signed(
    instruction: &Instruction,
    account_infos: &[AccountInfo<'_>],
    signers_seeds: &[&[&[u8]]]
    ) -> ProgramResult

    Instruction 类型的定义如下:

    • program_id - 指定要调用的程序的公钥。
    • accounts - 一个包含账户元数据的向量列表,你需要将被调用程序将要读取或写入的所有账户都包括进去。
    • data - 一个字节缓冲区,代表作为向被调用程序传递的数据的向量。

    根据你所调用的程序的不同,可能会有一个特定的 crate 包含辅助函数来创建 Instruction 对象。accountsdata 字段都是 Vec 类型,即向量。你可以使用 vec 宏,利用数组表示法构建一个向量。

    pub struct Instruction {
    pub program_id: Pubkey,
    pub accounts: Vec<AccountMeta>,
    pub data: Vec<u8>,
    }

    accounts 字段需要一个类型为AccountMeta的向量。Instruction 结构的以下字段详细展示了 AccountMeta 的内容:

    pub struct AccountMeta {
    pub pubkey: Pubkey,
    pub is_signer: bool,
    pub is_writable: bool,
    }

    例如:

    • AccountMeta::new - 表示账户可写。
    • AccountMeta::read_only - 表示账户不可写入。
    • (account1_pubkey, true) - 表示账户是签署人。
    • (account2_pubkey, false) - 表示账户不是签署人。
    use solana_program::instruction::AccountMeta;

    let accounts = vec![
    AccountMeta::new(account1_pubkey, true),
    AccountMeta::new(account2_pubkey, false),
    AccountMeta::read_only(account3_pubkey, false),
    AccountMeta::read_only(account4_pubkey, true),
    ];

    以下是一个创建 Instruction 的示例:

    • accounts - 指令所需的 AccountMeta 的向量。
    • data - 指令所需的序列化指令数据。
    • programId - 被调用的程序。
    • 使用 solana_program::instruction::Instruction 来创建新的 Instruction
    use solana_program::instruction::{AccountMeta, Instruction};

    let accounts = vec![
    AccountMeta::new(account1_pubkey, true),
    AccountMeta::new(account2_pubkey, false),
    AccountMeta::read_only(account3_pubkey, false),
    AccountMeta::read_only(account4_pubkey, true),
    ];

    struct InstructionData {
    amount: u8,
    }

    let data = BorshSerialize.try_to_vec(InstructionData { amount: 1 });

    let instruction = Instruction {
    program_id: *program_id,
    accounts,
    data,
    };

    📜 传递账户列表

    在底层,invokeinvoke_signed 实质上都是交易,所以我们需要传入一个 account_info 对象的列表。

    你可以使用在 solana_program 包中的 account_info 结构体上实现的 Clone Trait 来复制每个需要传递到CPIaccount_info 对象。

    Clone trait 会返回一个 account_info 实例的副本。

    &[first_account.clone(), second_account.clone(), third_account.clone()]

    🏒 CPIinvoke

    请记住 - 调用其实就是像传递交易一样,执行这个操作的程序并不会真正接触到它。这意味着无需包含签名,因为Solana的运行时会将原始签名传递给你的程序。

    🏑 CPIinvoke_signed

    每当我们使用PDA时,我们会使用 invoke_signed 并传入种子。

    Solana运行时将使用提供的种子和调用程序的 program_id 内部调用create_program_address,然后将结果与指令中提供的地址进行比较。如果有任何账户地址与PDA匹配,该账户上的 is_signer 标志将被设置为 true

    这就像一条效率的捷径!

    😲 最佳实践与常见陷阱

    执行CPI时,你可能会遇到一些常见错误,通常表明你在构建CPI时使用了错误的信息。

    例如,“签名者权限升级”表示你在指示中错误地代签地址。如果你在使用 invoke_signed 并收到此错误,可能是你提供的种子不正确。

    EF1M4SPfKcchb6scq297y8FPCaLvj5kGjwMzjTM68wjA's signer privilege escalated
    Program returned error: "Cross-program invocation with unauthorized signer or writable account"

    还有其他可能导致问题的情况,包括:

    • 任何可能被程序修改的账户必须指定为可写入。
    • 写入未指定为可写的账户会导致交易失败。
    • 写入不属于该程序的账户也会导致交易失败。
    • 任何可能在程序执行期间被修改的Lamport余额的账户也必须被指定为可写入。
    • 等等。
    2qoeXa9fo8xVHzd2h9mVcueh6oK3zmAiJxCTySM5rbLZ's writable privilege escalated
    Program returned error: "Cross-program invocation with unauthorized signer or writable account"

    这里的核心概念是,如果你不在交易中明确声明你要操作这些账户,那么你就不能随意对其进行操作。

    🤔 意义何在

    CPISolana生态系统的一项关键特性,它允许所有部署的程序之间互操作。这为在现有基础上构建新协议和应用提供了可能,就像搭积木一样。

    可组合性是加密货币的一个重要组成部分,而CPI则使其在Solana上成为可能。

    CPI的另一重要方面是它们允许程序为其PDAs签名。正如你可能已经注意到的,PDAs在Solana开发中被广泛使用,因为它们允许程序以特定方式控制特定地址,以便没有外部用户能够为这些地址生成有效签名的交易。

    通过这些解释,希望对Solana中的CPI技术有更深入的理解。如果你还有任何问题或需要进一步解释,请随时提问。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/index.html b/Solana-Co-Learn/module4/index.html index dc6074205..bb9031bfa 100644 --- a/Solana-Co-Learn/module4/index.html +++ b/Solana-Co-Learn/module4/index.html @@ -5,13 +5,13 @@ PDAs 与 CPIs | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/pdas/build-on-chain-comments/index.html b/Solana-Co-Learn/module4/pdas/build-on-chain-comments/index.html index 1373ad84f..dec776067 100644 --- a/Solana-Co-Learn/module4/pdas/build-on-chain-comments/index.html +++ b/Solana-Co-Learn/module4/pdas/build-on-chain-comments/index.html @@ -5,14 +5,14 @@ 💬 链上评论功能的构建 | All in One Solana - +
    Skip to main content

    💬 链上评论功能的构建

    现在是时候充分利用PDA的功能了。我们将给我们的旧电影评论程序添加评论支持功能。

    首先,在本地环境中新建一个项目并设置好。

    cargo new --lib movie-review-comments
    cd movie-review-comments

    然后,打开 Cargo.toml 文件,这样我们就可以添加所需的依赖项和进行其他配置了:

    [package]
    name = "movie-review-comments"
    version = "0.1.0"
    edition = "2021"

    # 更多关键字和定义,请查看:https://doc.rust-lang.org/cargo/reference/manifest.html

    [features]
    no-entrypoint = []

    [dependencies]
    solana-program = "1.10.29"
    borsh = "0.9.3"
    thiserror = "1.0.31"

    [lib]
    crate-type = ["cdylib", "lib"]
    caution

    这里需要注意的是solana-program, borsh, thiserror 的版本可能会太低了,请使用cargo add <crates-name>安装。

    此外,你还需要将我们之前用过的所有文件和代码搬过来。你可以找到我们上次离开时的电影评论程序,并将文件结构和内容复制到新的本地项目中。

    完成这些操作后,可以通过构建程序来确认一切是否准备就绪:

    cargo build-sbf

    首次运行可能会花费几分钟。如果一切顺利,你应该会看到一个显示“完成”的绿色消息。

    我们现在已经准备好开始组合构建项目了!

    info

    开始前的提示

    请注意,这是一堂较为深入的课程。我们将编写大量代码,这可能会让你觉得有些压力重重。但当你编写实际的程序时,不必进行如此繁琐的工作,速度会快得多。下周我们将深入学习如何使用Anchor,这会让整个过程变得更简单。我们现在选择采用原生方式,以便深入了解这些概念并为你奠定坚实的基础。

    🤓 数据结构化

    在存储数据时,决定如何摆放和连接物品是非常关键的。想象一下,我们需要为每个电影评论存储其下的评论。那么这在链上会是什么样子呢?当我们在客户端上阅读时,又该如何找到特定评论的评论呢?这就涉及到了数据映射。

    在这里并没有一成不变的“规则”,你需要用上计算机工程师的智慧来弄明白该如何做,就像设计数据库模式一样。通常,我们期望的结构具备以下特性:

    • 结构不要过于复杂
    • 能让数据容易检索

    具体的实现方式可能因情况而异,但有些常见的模式是你会经常看到的。一旦你明白了如何组织和连接存储数据的方法,你就能找出最适合你情况的最佳解决方案。

    存储评论

    我们首先需要决定评论将存储在何处。你可能还记得,在 add_movie_review 中,我们为每个电影评论创建了一个新的PDA。因此,我们是否可以简单地将一个大的评论数组添加到PDA中,然后就大功告成了呢?答案是否定的。由于账户的空间有限,所以我们很快就会用完空间。

    那么让我们按照电影评论的方式来进行。我们将为每条评论创建一个新的PDA,这样我们就可以存储尽可能多的评论了!为了将评论与它们所属的评论连接起来,我们将使用电影评论的PDA地址作为评论账户的种子。

    阅读评论

    我们的结构将为每个电影评论提供理论上无限数量的评论。然而,对于每个电影评论,没有任何特性来区分评论之间的关系。我们该如何知道每个电影评论有多少条评论呢?

    我们可以创建另一个账户来存储这个信息!并且,我们还可以使用一个编号系统来跟踪评论账户。

    是否感到困惑?我当时确实觉得很复杂。以下是一个方便的图表,有助于你形象地理解这个结构:

    对于每一篇电影评论,我们将拥有一个评论计数器PDA和许多评论PDA。我还列出了每个PDA的种子 - 这是我们获取账户的方式。

    这样,如果我想要获取评论#5,就知道可以在从电影评论PDA和5派生的账户中找到它。

    📦 构建基本组件

    我们想要创建两个新账户来存储数据。下面是我们在程序中需要完成的所有步骤:

    • 定义结构体,用于表示评论计数器和评论账户
    • 更新现有的 MovieAccountState,增加一个鉴别器字段(稍后将详细解释)
    • 添加一个指令变体,用来表示 add_comment 指令
    • 更新现有的 add_movie_review 指令,包括创建评论计数器账户的部分
    • 创建一个新的 add_comment 指令

    首先,我们从为新账户创建结构体开始。我们需要定义每个账户中存储的数据。打开 state.rs 文件并将其更新为以下内容:

    use borsh::{BorshSerialize, BorshDeserialize};
    use solana_program::{
    // 引入 Pubkey
    pubkey::Pubkey,
    program_pack::{IsInitialized, Sealed},
    };

    #[derive(BorshSerialize, BorshDeserialize)]
    pub struct MovieAccountState {
    // 新增了两个字段 - discriminator 和 reviewer
    pub discriminator: String,
    pub is_initialized: bool,
    pub reviewer: Pubkey,
    pub rating: u8,
    pub title: String,
    pub description: String,
    }

    // 新结构体,记录评论总数
    #[derive(BorshSerialize, BorshDeserialize)]
    pub struct MovieCommentCounter {
    pub discriminator: String,
    pub is_initialized: bool,
    pub counter: u64,
    }

    // 新结构体,存储单个评论
    #[derive(BorshSerialize, BorshDeserialize)]
    pub struct MovieComment {
    pub discriminator: String,
    pub is_initialized: bool,
    pub review: Pubkey,
    pub commenter: Pubkey,
    pub comment: String,
    pub count: u64,
    }

    impl Sealed for MovieAccountState {}

    impl IsInitialized for MovieAccountState {
    fn is_initialized(&self) -> bool {
    self.is_initialized
    }
    }

    这些新结构体都需要可序列化,所以我们在这里使用了 Borsh 派生宏。我们还添加了一个 is_initialized 字段,用于确认该账户是否已准备好使用。

    由于现在我们在程序中有多种类型的账户,所以我们需要一种方式来区分这些不同的账户。当我们在客户端上执行时,我们将获取我们电影评论程序的所有账户。这就是 getProgramAccounts 的作用。我们可以通过指定账户数据的前 8 个字节来过滤账户列表。

    我们选择使用字符串作为鉴别器,因为我们可以事先确定鉴别器的内容,这样在过滤时我们就知道要在客户端上寻找什么。

    最后,我们需要为这些新结构体实现 IsInitialized 接口。我只是从 MovieAccountState 中复制/粘贴了实现代码,并将其放在了一旁:

    impl IsInitialized for MovieCommentCounter {
    fn is_initialized(&self) -> bool {
    self.is_initialized
    }
    }

    impl IsInitialized for MovieComment {
    fn is_initialized(&self) -> bool {
    self.is_initialized
    }
    }

    📏 定义账户大小

    如果你查看位于 processor.rs 中的 add_movie_review,你会发现我们在创建账户时计算账户的大小。这样做并不是特别实用,因为这个计算是不可复用的。所以现在我们将针对这些账户进行实现,代码如下:

    impl MovieAccountState {
    pub const DISCRIMINATOR: &'static str = "review";

    pub fn get_account_size(title: String, description: String) -> usize {
    // 4个字节存储后续动态数据(字符串)的大小
    (4 + MovieAccountState::DISCRIMINATOR.len())
    + 1 // 1个字节用于is_initialized(布尔值)
    + 32 // 32个字节用于电影评论账户密钥
    + 1 // 1个字节用于评分
    + (4 + title.len()) // 4个字节存储后续动态数据(字符串)的大小
    + (4 + description.len()) // 同上
    }
    }

    impl MovieComment {
    pub const DISCRIMINATOR: &'static str = "comment";

    pub fn get_account_size(comment: String) -> usize {
    (4 + MovieComment::DISCRIMINATOR.len())
    + 1 // 1个字节用于is_initialized(布尔值)
    + 32 // 32个字节用于电影评论账户密钥
    + 32 // 32个字节用于评论者密钥的大小
    + (4 + comment.len()) // 4个字节存储后续动态数据(字符串)的大小
    + 8 // 8个字节用于计数(u64)
    }
    }

    impl MovieCommentCounter {
    pub const DISCRIMINATOR: &'static str = "counter";
    pub const SIZE: usize = (4 + MovieCommentCounter::DISCRIMINATOR.len()) + 1 + 8;
    }

    impl Sealed for MovieCommentCounter{}

    由于电影评论账户和电影评论都有动态内容,所以我们需要函数来获取它们的大小。代码注释解释了每个字节的用途。

    MovieCommentCounter 的大小始终保持不变,因此我们可以声明一个常量代替函数。

    在这里,我们也看到了我们的鉴别器!由于它不会改变,我们使用 'static 关键字来创建一个静态常量,在整个程序的运行期间保持不变。代码注释解释了每个字节的用途。

    最后,由于我们正在进行实现,我还包括了 MovieCommentCounterSealed 实现。提醒一下,当结构体的大小已知时, Sealed 特性可以让编译器进行一些优化。由于 MovieCommentCounter 有已知的固定大小,所以我们需要实现它!

    至此,你已完成了 state.rs 的整体结构,它的大纲应该如下图所示:

    总的来说,对于每个账户状态,我们有:

    • 一个用来表示账户数据的结构体
    • 一个函数实现,用于告知我们账户是否已准备好
    • 一个函数实现,用于计算每个账户内容的大小
    • 一个静态常量,用于区分账户
    • 如果账户大小不是动态的,则可以选择实现一个 Sealed 方案。

    👨‍🏫 更新我们的指令

    现在我们已经完成了所有状态的处理,可以开始更新我们的指令处理程序,并实现实际的评论逻辑。

    首先从指令处理程序开始,我们需要更新指令枚举,以支持在 instruction.rs 中的评论功能:

    pub enum MovieInstruction {
    AddMovieReview {
    title: String,
    rating: u8,
    description: String
    },
    UpdateMovieReview {
    title: String,
    rating: u8,
    description: String
    },
    AddComment {
    comment: String
    }
    }

    用于表示指令数据的结构体非常简洁:

    #[derive(BorshDeserialize)]
    struct CommentPayload {
    comment: String
    }

    此外,我们还需要稍微重构一下 unpack 函数的实现。由于以前的添加和更新指令的有效载荷是相同的,我们可以在匹配语句之前对其进行反序列化。但现在,我们引入了带有不同类型有效载荷的评论功能,所以我们将把反序列化操作移到匹配语句中。具体如下:

    impl MovieInstruction {
    pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
    let (&variant, rest) = input
    .split_first()
    .ok_or(ProgramError::InvalidInstructionData)?;

    Ok(match variant {
    0 => {
    let payload = MovieReviewPayload::try_from_slice(rest)
    .map_err(|_| ProgramError::from(Error::ParseMovieReviewPayloadFailed))?;

    Self::AddMovieReview {
    title: payload.title,
    rating: payload.rating,
    description: payload.description,
    }
    }
    1 => {
    let payload = MovieReviewPayload::try_from_slice(rest)
    .map_err(|_| ProgramError::from(Error::ParseMovieReviewPayloadFailed))?;

    Self::UpdateMovieReview {
    title: payload.title,
    rating: payload.rating,
    description: payload.description,
    }
    }
    2 => {
    // 评论载荷使用自己的反序列化器,因为数据类型不同
    let payload = CommentPayload::try_from_slice(rest)
    .map_err(|_| ProgramError::from(Error::ParseMovieCommentPayloadFailed))?;

    Self::AddComment {
    comment: payload.comment,
    }
    }
    _ => return Err(ProgramError::InvalidInstructionData),
    })
    }
    }

    现在你应该对这部分内容感到非常熟悉了 :)

    最后一部分是更新 process_instruction 中的 match 语句:

    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)
    },

    MovieInstruction::UpdateMovieReview { title, rating, description } => {
    update_movie_review(program_id, accounts, title, rating, description)
    },

    MovieInstruction::AddComment { comment } => {
    add_comment(program_id, accounts, comment)
    }
    }
    }

    总结一下,我们所做的工作是:

    • 更新指令枚举以包括新的评论指令
    • 添加指令有效载荷的结构体以便我们进行反序列化操作
    • 更新了 unpack 函数,以涵盖新的指令类型
    • 更新了 match 语句,以便在 process_instruction 函数中处理新的指令

    你可能会在这里遇到一个错误,因为 add_comment 还不存在,你可以暂时添加一个空函数来解决这个问题:

    pub fn add_comment(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    comment: String
    ) -> ProgramResult {
    Ok(())
    }

    🎬 为创建评论计数器账户更新 add_movie_review

    由于每个电影评论都需要一个计数器账户,因此我们需要在 add_movie_review 函数中增加逻辑来创建该计数器账户。

    首先,在 processor.rs 文件的 add_movie_review 函数中,我们要新增一个 pda_counter,代表将要初始化的新评论计数器账户和电影评论账户。

    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)?;
    // 用于存储评论计数的新账户
    let pda_counter = next_account_info(account_info_iter)?;

    在创建PDA时验证它是个好习惯,这样就能确保你永远不会忘记。请在 pda_account 验证后添加以下内容:

    let (counter_pda, counter_bump_seed) = Pubkey::find_program_address(
    &[pda.as_ref(), "comment".as_ref()],
    program_id
    )

    if counter_pda != *pda_counter.key {
    msg!("计数器PDA的种子无效");
    return Err(ProgramError::InvalidArgument)
    }

    还记得我们将账户大小移至 state.rs 吗?好,现在我们需要用它来计算账户的大小。将以下内容替换到 total_len 调用处:

    let account_len: usize = 1000;

    if MovieAccountState::get_account_size(title.clone(), description.clone()) > account_len {
    msg!("数据长度大于1000字节");
    return Err(ReviewError::InvalidDataLength.into());
    }

    我们还增加了一个 discriminator 字段,所以我们需要更新 account_data 段的数据结构体:

    account_data.discriminator = MovieAccountState::DISCRIMINATOR.to_string();
    account_data.reviewer = *initializer.key;
    account_data.title = title;
    account_data.rating = rating;
    account_data.description = description;
    account_data.is_initialized = true;

    最后,在 add_movie_review 函数中增加逻辑来初始化评论计数器账户:

    msg!("创建评论计数器");
    let rent = Rent::get()?;
    let counter_rent_lamports = rent.minimum_balance(MovieCommentCounter::SIZE);

    // 推导地址并验证传入的PDA种子是否正确
    let (counter, counter_bump) =
    Pubkey::find_program_address(&[pda.as_ref(), "comment".as_ref()], program_id);
    if counter != *pda_counter.key {
    msg!("PDA的种子无效");
    return Err(ProgramError::InvalidArgument);
    }

    // 创建评论计数器账户
    invoke_signed(
    &system_instruction::create_account(
    initializer.key, // 租金支付者
    pda_counter.key, // 要创建账户的地址
    counter_rent_lamports, // 存入账户的租金数量
    MovieCommentCounter::SIZE.try_into().unwrap(), // 账户的大小
    program_id,
    ),
    &[
    // 将要读/写的账户列表
    initializer.clone(),
    pda_counter.clone(),
    system_program.clone(),
    ],
    // PDA的种子
    // PDA账户
    // 字符串"comment"
    &[&[pda.as_ref(), "comment".as_ref(), &[counter_bump]]],
    )?;
    msg!("评论计数器已创建");

    // 反序列化新创建的计数器账户
    let mut counter_data =
    try_from_slice_unchecked::<MovieCommentCounter>(&pda_counter.data.borrow()).unwrap();

    msg!("检查计数器账户是否已初始化");
    if counter_data.is_initialized() {
    msg!("账户已初始化");
    return Err(ProgramError::AccountAlreadyInitialized);
    }

    counter_data.discriminator = MovieCommentCounter::DISCRIMINATOR.to_string();
    counter_data.counter = 0;
    counter_data.is_initialized = true;
    msg!("评论计数: {}", counter_data.counter);
    counter_data.serialize(&mut &mut pda_counter.data.borrow_mut()[..])?;

    msg!("评论计数器已初始化");
    Ok(())

    简要回顾一下这段复杂代码在做什么:

    • 计算评论计数器账户所需的租金。
    • 验证PDA的种子是否正确。
    • 使用 invoke_signed 创建评论计数器账户。
    • 从新创建的账户中反序列化数据。
    • 检查账户是否已初始化。
    • 设置数据并初始化账户。
    • 序列化数据。

    请仔细查看评论,每一行代码都有相应的解释。

    现在,每当创建新的评论时,都会初始化两个账户:

    • 第一个是存储评论内容的审核账户。这与我们开始的程序版本相同。
    • 第二个账户是用于存储评论计数器的。

    💬 添加评论支持

    最后的一块拼图是在 processor.rs 文件底部实现 add_comment 函数。

    这是我们在这个函数中需要执行的步骤:

    • 遍历传入的程序账户。
    • 计算新评论账户所需的租金免税金额。
    • 使用评论地址和当前评论计数作为种子,推导评论账户的PDA。
    • 调用系统程序创建新的评论账户。
    • 为新创建的账户设置适当的值。
    • 将账户数据序列化并从函数中返回。
    pub fn add_comment(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    comment: String
    ) -> ProgramResult {
    msg!("正在添加评论...");
    msg!("评论内容:{}", comment);

    let account_info_iter = &mut accounts.iter();

    let commenter = next_account_info(account_info_iter)?;
    let pda_review = next_account_info(account_info_iter)?;
    let pda_counter = next_account_info(account_info_iter)?;
    let pda_comment = next_account_info(account_info_iter)?;
    let system_program = next_account_info(account_info_iter)?;

    let mut counter_data = try_from_slice_unchecked::<MovieCommentCounter>(&pda_counter.data.borrow()).unwrap();

    let account_len = MovieComment::get_account_size(comment.clone());

    let rent = Rent::get()?;
    let rent_lamports = rent.minimum_balance(account_len);

    let (pda, bump_seed) = Pubkey::find_program_address(&[pda_review.key.as_ref(), counter_data.counter.to_be_bytes().as_ref(),], program_id);
    if pda != *pda_comment.key {
    msg!("Invalid seeds for PDA");
    return Err(ReviewError::InvalidPDA.into())
    }

    invoke_signed(
    &system_instruction::create_account(
    commenter.key,
    pda_comment.key,
    rent_lamports,
    account_len.try_into().unwrap(),
    program_id,
    ),
    &[commenter.clone(), pda_comment.clone(), system_program.clone()],
    &[&[pda_review.key.as_ref(), counter_data.counter.to_be_bytes().as_ref(), &[bump_seed]]],
    )?;

    msg!("Created Comment Account");

    let mut comment_data = try_from_slice_unchecked::<MovieComment>(&pda_comment.data.borrow()).unwrap();

    msg!("checking if comment account is already initialized");
    if comment_data.is_initialized() {
    msg!("Account already initialized");
    return Err(ProgramError::AccountAlreadyInitialized);
    }

    comment_data.discriminator = MovieComment::DISCRIMINATOR.to_string();
    comment_data.review = *pda_review.key;
    comment_data.commenter = *commenter.key;
    comment_data.comment = comment;
    comment_data.is_initialized = true;
    comment_data.serialize(&mut &mut pda_comment.data.borrow_mut()[..])?;

    msg!("Comment Count: {}", counter_data.counter);
    counter_data.counter += 1;
    counter_data.serialize(&mut &mut pda_counter.data.borrow_mut()[..])?;

    Ok(())
    }

    这段代码大量重复了我们之前所了解的操作,所以我不再赘述。

    我们经历了许多改变。点击这里查看最终版本,以便你可以比较并检查是否有问题。

    🚀 部署程序

    我们准备好部署了!

    本地部署与在游乐场上点击部署按钮的操作略有不同。

    首先,你需要构建程序:

    cargo build-sbf

    接下来,我们可以部署。请确保替换 <PATH> 为你的路径:

    solana program deploy <PATH>

    测试非常简单,只需设置以下前端:

    git clone https://github.com/buildspace/solana-movie-frontend/
    cd solana-movie-frontend
    git checkout solution-add-comments

    在你可以发表一些高质量的电影评论之前,你需要:

    • utils/constants.ts 文件中更新程序地址。
    • 将端点设置在 WalletContextProvider.tsxhttp://127.0.0.1:8899
    • Phantom网络更改为localhost
    • 使用 solana airdrop 2 PHANTOM_WALLET_ADDRESS 获取本地主机SOL

    你会看到在 localhost:3000 上,通过运行 npm run dev,评论的魔法就开始了!

    info

    热门提示 - 本地程序日志 -遇到错误吗?有什么异常吗?你可以在本地主机上查看程序日志:

    solana logs PROGRAM_ID

    🚢 挑战

    现在轮到你独立地构建一些东西了,你可以在之前课程中使用过的学生介绍程序的基础上进行扩展。

    利用你在本课程中学到的知识,尝试将所学应用到学生介绍计划中。你的扩展应该让其他用户能够对介绍进行回复。

    要进行测试,你需要获取此前端的 solution-paging-account-data 分支,并添加一个用于显示和提交评论的组件,或者你可以编写一个向程序发送交易的脚本。

    起始代码:

    如果你没有保存之前的starter代码,可以随意使用此存储库starter 分支。

    解决方案代码

    尽量自己完成这个任务!但如果遇到困难,可以参考 solution-add-replies 分支。

    - +遇到错误吗?有什么异常吗?你可以在本地主机上查看程序日志:

    solana logs PROGRAM_ID

    🚢 挑战

    现在轮到你独立地构建一些东西了,你可以在之前课程中使用过的学生介绍程序的基础上进行扩展。

    利用你在本课程中学到的知识,尝试将所学应用到学生介绍计划中。你的扩展应该让其他用户能够对介绍进行回复。

    要进行测试,你需要获取此前端的 solution-paging-account-data 分支,并添加一个用于显示和提交评论的组件,或者你可以编写一个向程序发送交易的脚本。

    起始代码:

    如果你没有保存之前的starter代码,可以随意使用此存储库starter 分支。

    解决方案代码

    尽量自己完成这个任务!但如果遇到困难,可以参考 solution-add-replies 分支。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/pdas/index.html b/Solana-Co-Learn/module4/pdas/index.html index 1c75962d9..6b67fbb0d 100644 --- a/Solana-Co-Learn/module4/pdas/index.html +++ b/Solana-Co-Learn/module4/pdas/index.html @@ -5,13 +5,13 @@ PDAs | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/pdas/pda-deep-dive/index.html b/Solana-Co-Learn/module4/pdas/pda-deep-dive/index.html index 51cf11a60..f72af049e 100644 --- a/Solana-Co-Learn/module4/pdas/pda-deep-dive/index.html +++ b/Solana-Co-Learn/module4/pdas/pda-deep-dive/index.html @@ -5,13 +5,13 @@ 🧐 PDA深入探究 | All in One Solana - +
    -
    Skip to main content

    🧐 PDA深入探究

    程序派生地址(Program Derived Address,PDA), 让我们一起深入了解它们的工作原理。

    PDA主要具有两个核心功能:

    • 提供一种确定性的方法来查找程序拥有的账户地址。
    • 授权派生自PDA的程序代表其签署,就像用户使用私钥签署一样。

    换言之,它们是Solana网络上用于存储的安全键值存储解决方案。

    🔎 寻找 PDAs (程序派生地址)

    到现在为止,每次我们需要派生一个地址时,都使用了一个方便的函数。那么,这个函数到底做了什么呢?要了解答案,我们需要理解Solana密钥对是如何生成的。

    回想一下密钥对的作用。它是一种证明你是你声称的人的方式。我们通过数字签名系统实现了这一点。Solana的密钥对基于所谓的Ed25519椭圆曲线(你不必担心这是什么)。

    由于PDAs由程序控制,所以它们不需要私钥。因此,我们使用不在Ed25519曲线上的地址来创建PDAs。这实际上意味着它们是没有相应私钥的公钥。

    就是这样。你不需要理解Ed25519,甚至不需要知道数字签名算法是什么。你只需要知道PDA看起来像普通的Solana地址,并且由程序控制。如果你想进一步了解,可以观看Computerphile关于数字签名的精彩视频。

    要在Solana程序中找到一个PDA,我们将使用 find_program_address 函数。

    seeds”是用于派生PDAfind_program_address 函数的可选输入。例如,seeds可以是任意组合:

    • 指令数据
    • 硬编码的值
    • 其他账户的公钥

    find_program_address 函数提供了一个额外的seeds,称为“bump seed”,以确保结果不在Ed25519曲线上。

    一旦找到有效的PDA,该函数将返回两个值:

    • PDA
    • 用于派生PDABump
    let (pda, bump_seed) = Pubkey::find_program_address(&[user.key.as_ref(), user_input.as_bytes().as_ref(), "SEED".as_bytes()], program_id);

    🍳 find_program_address函数内部解析

    find_program_address 是一个冒牌货 - 它实际上将输入 seedsprogram_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 变量,其值范围在0255之间。它被附加到可选的输入seeds中,然后传递给 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 函数对seedsprogram_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()))

    }

    总结一下:

    • 该函数会将输入seedsprogram_id 一并交给 try_find_program_address 函数处理。
    • try_find_program_address 函数在输入seeds中添加一个从255开始的 bump_seed,然后连续调用 create_program_address 函数,直到找到有效的PDA
    • 一旦找到了,就会返回找到的 PDA 和用于派生 PDAbump_seed

    无需深究所有细节!关键在于理解调用 find_program_address 函数时在高层次上到底发生了什么。

    🤔 有关程序派生地址(PDA)的一些说明

    • 对于相同的输入seeds,不同的凸起值会生成不同的有效PDA
    • find_program_address 返回的 bump_seed 总是找到的第一个有效的PDA
    • 这个 bump_seed 通常被称作“标准Bump”(canonical bump)。
    • 该函数只返回一个程序派生地址和用于派生该地址的增量seeds,不会做其他事情。
    • 该函数不会初始化新的账户,也不会返回与存储数据相关的PDA

    🗺 PDA账户中数据的组织和存储

    由于程序本质上没有状态,所有程序状态都由外部账户来管理。这意味着我们必须通过一系列映射来保持事务的联系。

    你如何将seedsPDA账户相映射,将高度取决于你的具体程序设计。虽然这不是一门关于系统设计或架构的课程,但以下几个指导方针值得注意:

    • 要使用在PDA派生过程中可知的seeds
    • 请细心思考如何将数据分组到一个账户中。
    • 要谨慎地考虑每个账户中数据结构的使用。
    • 通常来说,简单就是最好的。

    这些内容确实很多!不过再次强调,你不必记住此处解释的所有内容。下一步我们将构建一个链上评论系统,让我们一起探索这些理论如何在实际操作中发挥作用!

    - +
    Skip to main content

    🧐 PDA深入探究

    程序派生地址(Program Derived Address,PDA), 让我们一起深入了解它们的工作原理。

    PDA主要具有两个核心功能:

    • 提供一种确定性的方法来查找程序拥有的账户地址。
    • 授权派生自PDA的程序代表其签署,就像用户使用私钥签署一样。

    换言之,它们是Solana网络上用于存储的安全键值存储解决方案。

    🔎 寻找 PDAs (程序派生地址)

    到现在为止,每次我们需要派生一个地址时,都使用了一个方便的函数。那么,这个函数到底做了什么呢?要了解答案,我们需要理解Solana密钥对是如何生成的。

    回想一下密钥对的作用。它是一种证明你是你声称的人的方式。我们通过数字签名系统实现了这一点。Solana的密钥对基于所谓的Ed25519椭圆曲线(你不必担心这是什么)。

    由于PDAs由程序控制,所以它们不需要私钥。因此,我们使用不在Ed25519曲线上的地址来创建PDAs。这实际上意味着它们是没有相应私钥的公钥。

    就是这样。你不需要理解Ed25519,甚至不需要知道数字签名算法是什么。你只需要知道PDA看起来像普通的Solana地址,并且由程序控制。如果你想进一步了解,可以观看Computerphile关于数字签名的精彩视频。

    要在Solana程序中找到一个PDA,我们将使用 find_program_address 函数。

    seeds”是用于派生PDAfind_program_address 函数的可选输入。例如,seeds可以是任意组合:

    • 指令数据
    • 硬编码的值
    • 其他账户的公钥

    find_program_address 函数提供了一个额外的seeds,称为“bump seed”,以确保结果不在Ed25519曲线上。

    一旦找到有效的PDA,该函数将返回两个值:

    • PDA
    • 用于派生PDABump
    let (pda, bump_seed) = Pubkey::find_program_address(&[user.key.as_ref(), user_input.as_bytes().as_ref(), "SEED".as_bytes()], program_id);

    🍳 find_program_address函数内部解析

    find_program_address 是一个冒牌货 - 它实际上将输入 seedsprogram_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 变量,其值范围在0255之间。它被附加到可选的输入seeds中,然后传递给 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 函数对seedsprogram_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()))

    }

    总结一下:

    • 该函数会将输入seedsprogram_id 一并交给 try_find_program_address 函数处理。
    • try_find_program_address 函数在输入seeds中添加一个从255开始的 bump_seed,然后连续调用 create_program_address 函数,直到找到有效的PDA
    • 一旦找到了,就会返回找到的 PDA 和用于派生 PDAbump_seed

    无需深究所有细节!关键在于理解调用 find_program_address 函数时在高层次上到底发生了什么。

    🤔 有关程序派生地址(PDA)的一些说明

    • 对于相同的输入seeds,不同的凸起值会生成不同的有效PDA
    • find_program_address 返回的 bump_seed 总是找到的第一个有效的PDA
    • 这个 bump_seed 通常被称作“标准Bump”(canonical bump)。
    • 该函数只返回一个程序派生地址和用于派生该地址的增量seeds,不会做其他事情。
    • 该函数不会初始化新的账户,也不会返回与存储数据相关的PDA

    🗺 PDA账户中数据的组织和存储

    由于程序本质上没有状态,所有程序状态都由外部账户来管理。这意味着我们必须通过一系列映射来保持事务的联系。

    你如何将seedsPDA账户相映射,将高度取决于你的具体程序设计。虽然这不是一门关于系统设计或架构的课程,但以下几个指导方针值得注意:

    • 要使用在PDA派生过程中可知的seeds
    • 请细心思考如何将数据分组到一个账户中。
    • 要谨慎地考虑每个账户中数据结构的使用。
    • 通常来说,简单就是最好的。

    这些内容确实很多!不过再次强调,你不必记住此处解释的所有内容。下一步我们将构建一个链上评论系统,让我们一起探索这些理论如何在实际操作中发挥作用!

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/ship-a-staking-app/build-a-staking-ui/index.html b/Solana-Co-Learn/module4/ship-a-staking-app/build-a-staking-ui/index.html index f1e7c88cc..21924d4c4 100644 --- a/Solana-Co-Learn/module4/ship-a-staking-app/build-a-staking-ui/index.html +++ b/Solana-Co-Learn/module4/ship-a-staking-app/build-a-staking-ui/index.html @@ -5,13 +5,13 @@ 构建一个质押用户界面 | All in One Solana - +
    -
    Skip to main content

    构建一个质押用户界面

    让我们开始吧,我们要在我们的buildoors NFT项目上取得一些进展。在这个核心环节,我们希望完成三件事情:

    1. 为质押页面构建用户界面

    这就是我们的目标:

    请在前端项目的根目录下创建一个新的 utils 文件夹。然后创建一个名为 instructions.ts 的文件,并从NFT质押项目中复制/粘贴整个 instructions.ts 文件。由于代码较长超过200行,所以在这里就不粘贴了。😬

    请注意,“STAKING 4 DAYS”和“READY TO STAKE”这两个方块不会同时显示,只会显示与当前NFT质押状态相关的方块。

    如果需要,可以使用模拟数据来使界面大致符合你的要求。不过请注意,你的界面无需完全复制这个样子,可以根据需要进行个性化定制。

    1. 将实际质押功能添加到程序中

    别忘了,我们已经做了一些工作来存储状态,但程序还没有实际进行NFT质押或铸造BLD代币。我们将解决这个问题!

    1. 一旦程序完全准备就绪,就可以回到用户界面并使其工作起来。

    具体而言,“claim $BLD”,“stake buildoor”和“unstake buildoor”按钮应调用质押程序的相关指令。


    像往常一样,你可以独立尝试。请注意,这不是一项简单的任务,可能需要几个小时甚至更长时间。

    一旦你完成了,或者感觉快要困顿了,可以随时观看接下来的视频教程。在下一课中,我们将展示一种可能的解决方案。

    添加样式

    当我们回到用户界面构建时,首先要做的是在应用文件(//pages/_app.tsx)中为主题添加一些颜色。代码如下:

    const colors = {
    background: "#1F1F1F",
    accent: "#833BBE",
    bodyText: "rgba(255, 255, 255, 0.75)",
    secondaryPurple: "#CB8CFF",
    containerBg: "rgba(255, 255, 255, 0.1)",
    containerBgSecondary: "rgba(255, 255, 255, 0.05)",
    buttonGreen: "#7EFFA7",
    }

    新建薄荷路由

    我们将要在NewMint文件(//pages/newMint.tsx)中实现handleClick函数,这个函数将在质押后路由到新页面。

    首先,我们来初始化路由,命名为useRouter,并且别忘了检查那些可能遗漏的导入。

    const router = useRouter()

    接下来我们来实现这个异步事件处理函数,并路由到我们新命名为stake的页面。我们还将传递图片,因为我们已经从图片源获取了它,所以不需要再次加载。

    const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(
    async (event) => {
    router.push(`/stake?mint=${mint}&imageSrc=${metadata?.image}`)
    },
    [router, mint, metadata]
    )

    呀,当前这是一条无效的路径,会导致一个错误,所以让我们创建这个实际的页面。这将是一个新的文件,位于页面目录下(//pages/stake.tsx)。

    质押着陆页面,左半部分

    让我们为Stake创建一个NextPage,并确保已经导入了'next'库。

    const Stake: NextPage<StakeProps> = ({ mint, imageSrc }) => {
    return(
    <div></div>
    )
    }

    现在,让我们定义一些重要的属性。

    interface StakeProps {
    mint: PublicKey
    imageSrc: string
    }

    好的,我们继续前进。不妨快速检查一下npm run dev,确保前端正常渲染。

    如果你一直在忙着制造糖果,你可能会想要重置你的糖果机。🍬📠

    一切进展顺利。

    稍事休息,我们来谈谈前端的最佳实践。在顶级目录下创建一个env.local文件,并使用格式NEXT_PUBLIC_<变量名>来命名你的变量。这样它就会被注入到浏览器端的代码中,你就可以在文件中使用它。然后可以继续替换代码中的硬编码键值。

    回到质押页面,让我们开始构建我们实际想要在页面上显示的内容。我们将使用一些来自Chakra的组件,请确保你的导入正在自动完成,或者手动添加它们。如果你是前端专家,可以自由设计,否则可以跟随我的精美像素设计。👾👾👾

    有一些与我们之前为其他页面做的事情相似的部分,以下是需要注意的几点:

    1. 这里有一个与isStaking相关的押注检查,它会决定页面上显示"STAKING"还是"UNSTAKED"。你需要一个useState,并初始设置为false

    const [isStaking, setIsStaking] = useState(false)

    1. 我们想要显示抵押者的等级,所以需要另一个useState

    const [level, setLevel] = useState(1)

    再次运行npm run dev…哦对,我们需要一些属性,这样在我们首次访问时页面就可以显示一张图片。所以,让我们确保在文件底部调用了getInitialProps函数:

    Stake.getInitialProps = async ({ query }: any) => {
    const { mint, imageSrc } = query

    if (!mint || !imageSrc) throw { error: "no mint" }

    try {
    const mintPubkey = new PublicKey(mint)
    return { mint: mintPubkey, imageSrc: imageSrc }
    } catch {
    throw { error: "invalid mint" }
    }
    }

    质押页面,右半部分 && 质押选项展示组件

    好的,左半部分的工作已经完成,现在我们来专注于右侧。我们需要一个名为 VStack 的容器,在其中包括一些用于展示所需内容的独立逻辑。因此,让我们创建一个独立组件,命名为 StakeOptionsDisplay//components/StakeOptionsDisplay.tsx)。

    首先,我们从一个明显的检查开始,检查是否正在抵押,并在VStack中构建起来。

    export const StakeOptionsDisplay = ({
    isStaking,

    }: {
    isStaking: boolean

    }) => {
    return(
    )
    }

    在你遵循设计规范的同时,我们将在各个部分检查以下属性:

    1. isStaking会显示抵押的天数,或者显示"准备抵押"
    2. 已质押的天数,作为数字
    3. 总收入,作为数字
    4. 可申领的,作为数字

    以下是渲染的最终产品,适合那些喜欢粘贴前端代码的人 :P

    return (
    <VStack
    bgColor="containerBg"
    borderRadius="20px"
    padding="20px 40px"
    spacing={5}
    >
    <Text
    bgColor="containerBgSecondary"
    padding="4px 8px"
    borderRadius="20px"
    color="bodyText"
    as="b"
    fontSize="sm"
    >
    {isStaking
    ? `正在质押 ${daysStaked}${daysStaked === 1 ? "" : "S"}`
    : "准备质押"}
    </Text>
    <VStack spacing={-1}>
    <Text color="white" as="b" fontSize="4xl">
    {isStaking ? `${totalEarned} $BLD` : "0 $BLD"}
    </Text>
    <Text color="bodyText">
    {isStaking ? `${claimable} $BLD 已赚取` : "通过质押赚取 $BLD"}
    </Text>
    </VStack>
    <Button
    onClick={isStaking ? handleClaim : handleStake}
    bgColor="buttonGreen"
    width="200px"
    >
    <Text as="b">{isStaking ? "申领 $BLD" : "质押buildoor"}</Text>
    </Button>
    {isStaking ? <Button onClick={handleUnstake}>取消质押</Button> : null}
    </VStack>
    )

    如你所见,我们需要构建handleStakehandleClaimhandleUnstake的功能,稍后我们将回到这些。

    ...接着回到质押文件(//pages/stake.tsx)导入该组件和所需的属性。

    装备和战利品箱组件

    最后,我们来为装备和战利品箱构建另一个组件,可以称之为 ItemBox//components/ItemBox.tsx)。

    这是一个相对简单的案例,你只需按照视频操作,并可以随时与此代码进行比较。

    import { Center } from "@chakra-ui/react"
    import { ReactNode } from "react"

    export const ItemBox = ({
    children,
    bgColor,
    }: {
    children: ReactNode
    bgColor?: string
    }) => {
    return (
    <Center
    height="120px"
    width="120px"
    bgColor={bgColor || "containerBg"}
    borderRadius="10px"
    >
    {children}
    </Center>
    )
    }

    就这样,随意调整,根据你的喜好进行设计。接下来,我们将深入质押计划,并添加与代币相关的内容。

    做得很好,我们知道事情变得更复杂了,还有许多细致的工作要做——慢慢来,检查代码,如果有什么不明白的地方,在Discord上与我们联系。

    - +
    Skip to main content

    构建一个质押用户界面

    让我们开始吧,我们要在我们的buildoors NFT项目上取得一些进展。在这个核心环节,我们希望完成三件事情:

    1. 为质押页面构建用户界面

    这就是我们的目标:

    请在前端项目的根目录下创建一个新的 utils 文件夹。然后创建一个名为 instructions.ts 的文件,并从NFT质押项目中复制/粘贴整个 instructions.ts 文件。由于代码较长超过200行,所以在这里就不粘贴了。😬

    请注意,“STAKING 4 DAYS”和“READY TO STAKE”这两个方块不会同时显示,只会显示与当前NFT质押状态相关的方块。

    如果需要,可以使用模拟数据来使界面大致符合你的要求。不过请注意,你的界面无需完全复制这个样子,可以根据需要进行个性化定制。

    1. 将实际质押功能添加到程序中

    别忘了,我们已经做了一些工作来存储状态,但程序还没有实际进行NFT质押或铸造BLD代币。我们将解决这个问题!

    1. 一旦程序完全准备就绪,就可以回到用户界面并使其工作起来。

    具体而言,“claim $BLD”,“stake buildoor”和“unstake buildoor”按钮应调用质押程序的相关指令。


    像往常一样,你可以独立尝试。请注意,这不是一项简单的任务,可能需要几个小时甚至更长时间。

    一旦你完成了,或者感觉快要困顿了,可以随时观看接下来的视频教程。在下一课中,我们将展示一种可能的解决方案。

    添加样式

    当我们回到用户界面构建时,首先要做的是在应用文件(//pages/_app.tsx)中为主题添加一些颜色。代码如下:

    const colors = {
    background: "#1F1F1F",
    accent: "#833BBE",
    bodyText: "rgba(255, 255, 255, 0.75)",
    secondaryPurple: "#CB8CFF",
    containerBg: "rgba(255, 255, 255, 0.1)",
    containerBgSecondary: "rgba(255, 255, 255, 0.05)",
    buttonGreen: "#7EFFA7",
    }

    新建薄荷路由

    我们将要在NewMint文件(//pages/newMint.tsx)中实现handleClick函数,这个函数将在质押后路由到新页面。

    首先,我们来初始化路由,命名为useRouter,并且别忘了检查那些可能遗漏的导入。

    const router = useRouter()

    接下来我们来实现这个异步事件处理函数,并路由到我们新命名为stake的页面。我们还将传递图片,因为我们已经从图片源获取了它,所以不需要再次加载。

    const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(
    async (event) => {
    router.push(`/stake?mint=${mint}&imageSrc=${metadata?.image}`)
    },
    [router, mint, metadata]
    )

    呀,当前这是一条无效的路径,会导致一个错误,所以让我们创建这个实际的页面。这将是一个新的文件,位于页面目录下(//pages/stake.tsx)。

    质押着陆页面,左半部分

    让我们为Stake创建一个NextPage,并确保已经导入了'next'库。

    const Stake: NextPage<StakeProps> = ({ mint, imageSrc }) => {
    return(
    <div></div>
    )
    }

    现在,让我们定义一些重要的属性。

    interface StakeProps {
    mint: PublicKey
    imageSrc: string
    }

    好的,我们继续前进。不妨快速检查一下npm run dev,确保前端正常渲染。

    如果你一直在忙着制造糖果,你可能会想要重置你的糖果机。🍬📠

    一切进展顺利。

    稍事休息,我们来谈谈前端的最佳实践。在顶级目录下创建一个env.local文件,并使用格式NEXT_PUBLIC_<变量名>来命名你的变量。这样它就会被注入到浏览器端的代码中,你就可以在文件中使用它。然后可以继续替换代码中的硬编码键值。

    回到质押页面,让我们开始构建我们实际想要在页面上显示的内容。我们将使用一些来自Chakra的组件,请确保你的导入正在自动完成,或者手动添加它们。如果你是前端专家,可以自由设计,否则可以跟随我的精美像素设计。👾👾👾

    有一些与我们之前为其他页面做的事情相似的部分,以下是需要注意的几点:

    1. 这里有一个与isStaking相关的押注检查,它会决定页面上显示"STAKING"还是"UNSTAKED"。你需要一个useState,并初始设置为false

    const [isStaking, setIsStaking] = useState(false)

    1. 我们想要显示抵押者的等级,所以需要另一个useState

    const [level, setLevel] = useState(1)

    再次运行npm run dev…哦对,我们需要一些属性,这样在我们首次访问时页面就可以显示一张图片。所以,让我们确保在文件底部调用了getInitialProps函数:

    Stake.getInitialProps = async ({ query }: any) => {
    const { mint, imageSrc } = query

    if (!mint || !imageSrc) throw { error: "no mint" }

    try {
    const mintPubkey = new PublicKey(mint)
    return { mint: mintPubkey, imageSrc: imageSrc }
    } catch {
    throw { error: "invalid mint" }
    }
    }

    质押页面,右半部分 && 质押选项展示组件

    好的,左半部分的工作已经完成,现在我们来专注于右侧。我们需要一个名为 VStack 的容器,在其中包括一些用于展示所需内容的独立逻辑。因此,让我们创建一个独立组件,命名为 StakeOptionsDisplay//components/StakeOptionsDisplay.tsx)。

    首先,我们从一个明显的检查开始,检查是否正在抵押,并在VStack中构建起来。

    export const StakeOptionsDisplay = ({
    isStaking,

    }: {
    isStaking: boolean

    }) => {
    return(
    )
    }

    在你遵循设计规范的同时,我们将在各个部分检查以下属性:

    1. isStaking会显示抵押的天数,或者显示"准备抵押"
    2. 已质押的天数,作为数字
    3. 总收入,作为数字
    4. 可申领的,作为数字

    以下是渲染的最终产品,适合那些喜欢粘贴前端代码的人 :P

    return (
    <VStack
    bgColor="containerBg"
    borderRadius="20px"
    padding="20px 40px"
    spacing={5}
    >
    <Text
    bgColor="containerBgSecondary"
    padding="4px 8px"
    borderRadius="20px"
    color="bodyText"
    as="b"
    fontSize="sm"
    >
    {isStaking
    ? `正在质押 ${daysStaked}${daysStaked === 1 ? "" : "S"}`
    : "准备质押"}
    </Text>
    <VStack spacing={-1}>
    <Text color="white" as="b" fontSize="4xl">
    {isStaking ? `${totalEarned} $BLD` : "0 $BLD"}
    </Text>
    <Text color="bodyText">
    {isStaking ? `${claimable} $BLD 已赚取` : "通过质押赚取 $BLD"}
    </Text>
    </VStack>
    <Button
    onClick={isStaking ? handleClaim : handleStake}
    bgColor="buttonGreen"
    width="200px"
    >
    <Text as="b">{isStaking ? "申领 $BLD" : "质押buildoor"}</Text>
    </Button>
    {isStaking ? <Button onClick={handleUnstake}>取消质押</Button> : null}
    </VStack>
    )

    如你所见,我们需要构建handleStakehandleClaimhandleUnstake的功能,稍后我们将回到这些。

    ...接着回到质押文件(//pages/stake.tsx)导入该组件和所需的属性。

    装备和战利品箱组件

    最后,我们来为装备和战利品箱构建另一个组件,可以称之为 ItemBox//components/ItemBox.tsx)。

    这是一个相对简单的案例,你只需按照视频操作,并可以随时与此代码进行比较。

    import { Center } from "@chakra-ui/react"
    import { ReactNode } from "react"

    export const ItemBox = ({
    children,
    bgColor,
    }: {
    children: ReactNode
    bgColor?: string
    }) => {
    return (
    <Center
    height="120px"
    width="120px"
    bgColor={bgColor || "containerBg"}
    borderRadius="10px"
    >
    {children}
    </Center>
    )
    }

    就这样,随意调整,根据你的喜好进行设计。接下来,我们将深入质押计划,并添加与代币相关的内容。

    做得很好,我们知道事情变得更复杂了,还有许多细致的工作要做——慢慢来,检查代码,如果有什么不明白的地方,在Discord上与我们联系。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/ship-a-staking-app/build-a-token-minter/index.html b/Solana-Co-Learn/module4/ship-a-staking-app/build-a-token-minter/index.html index 9d5b22963..7aa9b5b49 100644 --- a/Solana-Co-Learn/module4/ship-a-staking-app/build-a-token-minter/index.html +++ b/Solana-Co-Learn/module4/ship-a-staking-app/build-a-token-minter/index.html @@ -5,13 +5,13 @@ 构建一个代币铸造器 | All in One Solana - +
    -
    Skip to main content

    构建一个代币铸造器

    铸币、质押等等

    很好,我们已经走了很长的路,现在让我们重新关注NFT质押计划。今天,我们将为质押者添加铸造奖励代币和执行质押操作所需的所有功能。有别于以前使用Solana Playground的方式,我们将在本地完成所有操作。可以从以下起始库开始:solutions-sans-tokens分支

    你会注意到这里有些不同。现在有一个名为“TS”的文件夹,其中包含了我们之前在Solana Playground的客户端项目中的全部内容。

    在你的前端项目中,需要在根目录下创建一个新的 utils 文件夹。接着创建一个名为 instructions.ts 的文件,并从NFT质押项目中复制/粘贴整个 instructions.ts 文件。由于代码超过200行,我在此不做展示。😬唯一重要的修改是在 /<project-name>/src/ts/src/utils/constants.ts 中,PROGRAM_ID 从项目的密钥对中读取。

    const string = fs.readFileSync(
    "../target/deploy/solana_nft_staking_program-keypair.json",
    "utf8"
    )

    ...

    export const PROGRAM_ID = Keypair.fromSecretKey(secretKey).publicKey

    准备好了!我们可以开始了。首先切换到TS目录,然后运行 npm run start。确保你已经完成了 cargo build-sbfsolana program deploy,并且你的集群设置是正确的。如果一切正常,它应该能够启动并运行。在控制台上,你应该能看到 stakesredeemsunstakes 的输出。请耐心等待,年轻的练剑师,这可能需要一两分钟的时间。

    假设一切顺利🎉,我们可以跳转到处理器文件(//src/processor.rs)。

    首先,我们需要处理一些导入:

    use mpl_token_metadata::ID as mpl_metadata_program_id;
    use spl_token::ID as spl_token_program_id;

    此外,在 solana_program::program::{invoke_signed} 的导入中添加 invoke

    现在,转到 process_stake 函数,我们将在这里进行第一次修改。

    习惯于此吧,我们经常会发现自己需要在许多地方添加账户。所以,现在是时候添加一些账户,以便我们能够真正借助令牌程序工作了。

    let nft_mint = next_account_info(account_info_iter)?;
    let nft_edition = next_account_info(account_info_iter)?;
    let stake_state = next_account_info(account_info_iter)?;
    let program_authority = next_account_info(account_info_iter)?;
    let token_program = next_account_info(account_info_iter)?;
    let metadata_program = next_account_info(account_info_iter)?;

    委托和冻结 —— 质押

    下一步,我们需要将程序设置为NFT的代理,委托NFT的权限,以便程序能够代表我们发起交易。

    msg!("Approving delegation");
    invoke(
    &spl_token::instruction::approve(
    &spl_token_program_id,
    nft_token_account.key,
    program_authority.key,
    user.key,
    &[user.key],
    1,
    )?,
    &[
    nft_token_account.clone(),
    program_authority.clone(),
    user.clone(),
    token_program.clone(),
    ],
    )?;

    现在,我们可以开始实际冻结代币的过程。我们不是真正改变代币的所有权,而是将其冻结,使在质押期间无法对代币进行任何操作。首先,我们需要为程序权限派生PDA(程序派生地址)。简单来说,我们会使用PDA作为代币铸造的授权实体,从而能够冻结账户。

    别忘了检查并确保PDA已经被提取。

    let (delegated_auth_pda, delegate_bump) =
    Pubkey::find_program_address(&[b"authority"], program_id);

    if delegated_auth_pda != *program_authority.key {
    msg!("Invalid seeds for PDA");
    return Err(StakeError::InvalidPda.into());
    }

    回到冻结操作本身,与委托批准不同,这里使用invoke_signed以从我们的程序进行签名。

    msg!("freezing NFT token account");
    invoke_signed(
    &mpl_token_metadata::instruction::freeze_delegated_account(
    mpl_metadata_program_id,
    *program_authority.key,
    *nft_token_account.key,
    *nft_edition.key,
    *nft_mint.key,
    ),
    &[
    program_authority.clone(),
    nft_token_account.clone(),
    nft_edition.clone(),
    nft_mint.clone(),
    metadata_program.clone(),
    ],
    &[&[b"authority", &[delegate_bump]]],
    )?;

    我们的程序的PDA现在具备了冻结令牌的权限。🧊

    接下来,我们将转到TypeScript文件(//ts/src/utils/instruction.rs),并向createStakingInstruction函数中添加更多的账户,确保其正常工作。

    我们需要确保新添加的账户与//src/processor.rs文件中process_stake函数的账户相匹配:

    nftMint: PublicKey,
    nftEdition: PublicKey,
    tokenProgram: PublicKey,
    metadataProgram: PublicKey,

    然后,我们将所有这些按照正确的顺序添加到TransactionInstruction中的账户列表。顺序非常重要。

    首先,取得授权账户:

    const [delegateAuthority] = PublicKey.findProgramAddressSync(
    [Buffer.from("authority")],
    programId
    )

    总共有5个新账户,你需要再次确保它们的顺序,并检查哪些是可写的,哪些是签名者。

    ...
    {
    pubkey: nftMint,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: nftEdition,
    isWritable: false,
    isSigner: false,
    },
    ...
    {
    pubkey: delegateAuthority,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: tokenProgram,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: metadataProgram,
    isWritable: false,
    isSigner: false,
    },

    测试我们的质押功能

    接下来,进入索引文件(//ts/src/index.rs),在创建stakeInstruction的地方,在testStaking函数中添加与之匹配的相同账户。

    下面是四个附加项:

    nft.mintAddress,
    nft.masterEditionAddress,
    TOKEN_PROGRAM_ID,
    METADATA_PROGRAM_ID,
    import { TOKEN_PROGRAM_ID } from "@solana/spl-token"
    import { PROGRAM_ID as METADATA_PROGRAM_ID } from "@metaplex-foundation/mpl-token-metadata"

    现在是时候测试我们的进展了:

    1. 使用cargo build-sbf重新构建程序,然后使用solana program deploy {path}进行更新。
    2. 确保你处于ts目录下,并执行npm run start

    假设没有出错,那我们就回到processor.rs文件,并向process_redeem函数添加相似的代码。

    委派和冻结 -- 兑换

    首先,你猜对了,我们要添加账户——一共有4个!

    let stake_mint = next_account_info(account_info_iter)?;
    let stake_authority = next_account_info(account_info_iter)?;
    let user_stake_ata = next_account_info(account_info_iter)?;
    let token_program = next_account_info(account_info_iter)?;

    接下来,我们将验证一些新账户。首先,我们要推导出stake_auth_pda,然后用自定义错误验证PDA

    let (stake_auth_pda, auth_bump) = Pubkey::find_program_address(&[b"mint"], program_id);

    if *stake_authority.key != stake_auth_pda {
    msg!("Invalid stake mint authority!");
    return Err(StakeError::InvalidPda.into());
    }

    向下滚动一些,我们要调用一个invoke_signed来调用令牌程序,以铸造代币,等我们了解了redeem_amount之后。我们需要指令的各种键,然后是所需的账户,最后是授权的种子。别忘了使用?来传播错误,否则红色波浪线将始终困扰你。

    invoke_signed(
    &spl_token::instruction::mint_to(
    token_program.key,
    stake_mint.key,
    user_stake_ata.key,
    stake_authority.key,
    &[stake_authority.key],
    redeem_amount.try_into().unwrap(),
    )?,
    &[
    stake_mint.clone(),
    user_stake_ata.clone(),
    stake_authority.clone(),
    token_program.clone(),
    ],
    &[&[b"mint", &[auth_bump]]],
    )?;

    这应该在此文件中处理铸币操作,但我们必须在客户端上添加新账户。

    我们回到之前的instruction.ts文件,向下滚动到createRedeemInstruction,并添加以下账户。

    mint: PublicKey,
    userStakeATA: PublicKey,
    tokenProgram: PublicKey,

    现在请记住,一些账户是派生的,如权威账户,所以我们不需要手动添加它。

    然后跳到TransactionInstruction本身,首先推导出mintAuth

    const [mintAuth] = PublicKey.findProgramAddressSync(
    [Buffer.from("mint")],
    programId
    )

    接下来进入return new TransactionInstruction,添加相关账户,并标明它们是否可写和/或可签。以下是我们需要添加的4个账户 - 请记住,顺序很重要。

    {
    pubkey: mint,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: mintAuth,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: userStakeATA,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: tokenProgram,
    isSigner: false,
    isWritable: false,
    },

    这应该包括了我们兑换所需的所有内容。我们最后需要回到同一个index.ts文件,并确保我们正确调用它,但这部分有些复杂,所以让我们先回到processor.rs并完成process_unstake函数。

    委托和冻结——解除质押

    解除质押过程基本上是将我们刚刚进行的质押和赎回步骤结合在一起,因此需要用到我们刚才操作过的所有账户。

    以下是我们需要添加的所有账户:

    let nft_mint = next_account_info(account_info_iter)?;
    let nft_edition = next_account_info(account_info_iter)?;
    ... (stake_state 应该在我们之前的代码中)
    let program_authority = next_account_info(account_info_iter)?;
    let stake_mint = next_account_info(account_info_iter)?;
    let stake_authority = next_account_info(account_info_iter)?;
    let user_stake_ata = next_account_info(account_info_iter)?;
    let token_program = next_account_info(account_info_iter)?;
    let metadata_program = next_account_info(account_info_iter)?;

    我们可以向下滚动,并复制粘贴 process_stakeprocess_redeem 函数中的一些验证:

    let (delegated_auth_pda, delegate_bump) =
    Pubkey::find_program_address(&[b"authority"], program_id);
    if delegated_auth_pda != *program_authority.key {
    msg!("Invalid seeds for PDA");
    return Err(StakeError::InvalidPda.into());
    }

    let (stake_auth_pda, auth_bump) = Pubkey::find_program_address(&[b"mint"], program_id);
    if *stake_authority.key != stake_auth_pda {
    msg!("Invalid stake mint authority!");
    return Err(StakeError::InvalidPda.into());
    }

    好的,这是相当新的部分,我们要“解冻”NFT代币账户。如果你还记得,我们之前冻结了它,现在我们要解冻它。这段代码与上面的冻结代码完全相反,我们只需更改辅助函数,使用 thaw_delegated_account

    msg!("thawing NFT token account");
    invoke_signed(
    &mpl_token_metadata::instruction::thaw_delegated_account(
    mpl_metadata_program_id,
    *program_authority.key,
    *nft_token_account.key,
    *nft_edition.key,
    *nft_mint.key,
    ),
    &[
    program_authority.clone(),
    nft_token_account.clone(),
    nft_edition.clone(),
    nft_mint.clone(),
    metadata_program.clone(),
    ],
    &[&[b"authority", &[delegate_bump]]],
    )?;

    接下来,我们需要撤销委托权限。与授权委托类似,但并不完全相同。我们可以移除 program_authority 字段,因为它不是必需的,并从批准助手函数中移除 amount

    msg!("Revoke delegation");
    invoke(
    &spl_token::instruction::revoke(
    &spl_token_program_id,
    nft_token_account.key,
    user.key,
    &[user.key],
    )?,
    &[
    nft_token_account.clone(),
    user.clone(),
    token_program.clone(),
    ],
    )?;

    最后,我们将从赎回函数中复制 invoke_signed,粘贴到 redeem_amount 下面。

    invoke_signed(
    &spl_token::instruction::mint_to(
    token_program.key,
    stake_mint.key,
    user_stake_ata.key,
    stake_authority.key,
    &[stake_authority.key],
    redeem_amount.try_into().unwrap(),
    )?,
    &[
    stake_mint.clone(),
    user_stake_ata.clone(),
    stake_authority.clone(),
    token_program.clone(),
    ],
    &[&[b"mint", &[auth_bump]]],
    )?;

    哦,还有一件事,我们实际上没有设置 redeem_amount,之前只是用了 unix_time。所以,改成 100 * unit_time,我们以后可以调整。确保在上述两个函数中都进行更改。

    这里应该就是了,回到客户端的文件上,添加所有的账户。向下滚动到 createUnstakeInstruction,将以下内容作为参数添加进去。

    nftMint: PublicKey,
    nftEdition: PublicKey,
    stakeMint: PublicKey,
    userStakeATA: PublicKey,
    tokenProgram: PublicKey,
    metadataProgram: PublicKey,

    再次提醒,有一些账户是自动派生的,所以我们不需要手动添加。

    接下来我们推导出 delegateAuthoritymintAuth,这与上面的代码完全相同。

    const [delegateAuthority] = PublicKey.findProgramAddressSync(
    [Buffer.from("authority")],
    programId
    )

    const [mintAuth] = PublicKey.findProgramAddressSync(
    [Buffer.from("mint")],
    programId
    )

    最后,我们将它们全部添加到指令中。这是很多账户,所以我们在这里全部发布,而不仅仅是我们要添加的那些。让你的眼睛不再在函数和文件之间来回移动。

    {
    pubkey: nftHolder,
    isWritable: false,
    isSigner: true,
    },
    {
    pubkey: nftTokenAccount,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: nftMint,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: nftEdition,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: stakeAccount,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: delegateAuthority,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: stakeMint,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: mintAuth,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: userStakeATA,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: tokenProgram,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: metadataProgram,
    isWritable: false,
    isSigner: false,
    },

    测试我们的功能

    好的,好的,我知道你已经迫不及待了,我们快到终点了。现在让我们回到index.ts文件中,调用并测试所有的函数。对于testRedeem函数,我们需要代币的铸币地址和用户的代币账户,以及createUnstakeInstruction

    首先,在testRedeem函数的参数中添加以下内容:

    stakeMint: web3.PublicKey,
    userStakeATA: web3.PublicKey

    然后,将它们添加到下方的createRedeemInstruction中:

    stakeMint,
    userStakeATA,
    TOKEN_PROGRAM_ID,
    PROGRAM_ID

    testUnstaking函数也进行上述相同的操作。

    接着,在createUnstakingInstruction中添加以下内容:

    nft.mintAddress,
    nft.masterEditionAddress,
    stakeMint,
    userStakeATA,
    TOKEN_PROGRAM_ID,
    METADATA_PROGRAM_ID,

    现在向下滚动到main()函数的调用位置,你会注意到testRedeemtestUnstaking都是红色的,因为它们缺少一些参数。

    首先,我们要声明stakeMint,目前我们将其硬编码,以及userStakeATA,该函数会创建ATA(如果ATA还不存在的话)。

    const stakeMint = new web3.PublicKey(
    "EMPTY FOR A MINUTE"
    )

    const userStakeATA = await getOrCreateAssociatedTokenAccount(
    connection,
    user,
    stakeMint,
    user.publicKey
    )

    ...现在,将调用更改为接收额外的参数:

    await testRedeem(connection, user, nft, stakeMint, userStakeATA.address)
    await testUnstaking(connection, user, nft, stakeMint, userStakeATA.address)

    前端编辑以测试功能

    我们暂时要切换到前端Buildoors项目中的index.ts文件(//tokens/bld/index.ts)。在这里,我们使用createBldToken函数创建BLD令牌。

    在该函数内部,我们称token.CreateMint的第三个参数为铸币授权,它掌管着铸币过程。最初,它是一个payer.publicKey,用于初始调用。我们很快就会更改铸币授权。

    首先,我们要向createBldToken函数添加一个参数:

    programId: web3.PublicKey

    然后向下滚动到主函数中的调用位置,并为await createBldToken调用添加第三个参数。

    new web3.PublicKey("USE YOUR PROGRAM ID")

    如果你找不到程序ID,你可以重新部署,控制台会显示你所需的程序ID

    向上滚动,超过const tokenMint,找到mintAuth。你可以在Anchor NFT质押计划中找到授权的具体信息。

    const [mintAuth] = await web3.PublicKey.findProgramAddress(
    [Buffer.from("mint")],
    programId
    )

    滚动回到下面,在transactionSignature创建后,我们将设置新的铸币权限(这是我们上面提到的更改)。

    await token.setAuthority(
    connection,
    payer,
    tokenMint,
    payer.publicKey,
    token.AuthorityType.MintTokens,
    mintAuth
    )

    现在,我们可以使用新的认证重新创建BLD令牌,并将其添加到上面的stakeMint中。

    const stakeMint = new web3.PublicKey(
    "EMPTY FOR A MINUTE"
    )

    最后,全面测试一切

    现在,请切换到主目录并运行 npm run create-bld-token。确保你已经将环境设置为devnet

    核实你的构建脚本,它应该如下所示:

    "creat-bld-token": "ts-node tokens/bld/index.ts"

    一旦成功执行完毕,你可以从tokens/bld目录中的cache.json文件中获取新的密钥。

    现在我们终于回到了NFT质押计划,并且可以在stakeMint创建中使用这个密钥:

    const stakeMint = new web3.PublicKey(
    "MINT KEY FROM CACHE.JSON"
    )

    现在应该一切准备就绪,并可以正常工作。返回到ts目录,并使用npm run start进行全面测试。如果一切顺利,你的控制台将确认初始化、质押、赎回和解质押都已成功完成。

    确实涉及了许多细节。深呼吸,给自己一些喘息的空间。这是一项充满挑战性的任务,不妨再回头看一遍,复习一下,甚至再次实践,不管需要付出多少努力。只要你能掌握这些内容,你就将成为一名出色的Solana开发者。

    - +
    Skip to main content

    构建一个代币铸造器

    铸币、质押等等

    很好,我们已经走了很长的路,现在让我们重新关注NFT质押计划。今天,我们将为质押者添加铸造奖励代币和执行质押操作所需的所有功能。有别于以前使用Solana Playground的方式,我们将在本地完成所有操作。可以从以下起始库开始:solutions-sans-tokens分支

    你会注意到这里有些不同。现在有一个名为“TS”的文件夹,其中包含了我们之前在Solana Playground的客户端项目中的全部内容。

    在你的前端项目中,需要在根目录下创建一个新的 utils 文件夹。接着创建一个名为 instructions.ts 的文件,并从NFT质押项目中复制/粘贴整个 instructions.ts 文件。由于代码超过200行,我在此不做展示。😬唯一重要的修改是在 /<project-name>/src/ts/src/utils/constants.ts 中,PROGRAM_ID 从项目的密钥对中读取。

    const string = fs.readFileSync(
    "../target/deploy/solana_nft_staking_program-keypair.json",
    "utf8"
    )

    ...

    export const PROGRAM_ID = Keypair.fromSecretKey(secretKey).publicKey

    准备好了!我们可以开始了。首先切换到TS目录,然后运行 npm run start。确保你已经完成了 cargo build-sbfsolana program deploy,并且你的集群设置是正确的。如果一切正常,它应该能够启动并运行。在控制台上,你应该能看到 stakesredeemsunstakes 的输出。请耐心等待,年轻的练剑师,这可能需要一两分钟的时间。

    假设一切顺利🎉,我们可以跳转到处理器文件(//src/processor.rs)。

    首先,我们需要处理一些导入:

    use mpl_token_metadata::ID as mpl_metadata_program_id;
    use spl_token::ID as spl_token_program_id;

    此外,在 solana_program::program::{invoke_signed} 的导入中添加 invoke

    现在,转到 process_stake 函数,我们将在这里进行第一次修改。

    习惯于此吧,我们经常会发现自己需要在许多地方添加账户。所以,现在是时候添加一些账户,以便我们能够真正借助令牌程序工作了。

    let nft_mint = next_account_info(account_info_iter)?;
    let nft_edition = next_account_info(account_info_iter)?;
    let stake_state = next_account_info(account_info_iter)?;
    let program_authority = next_account_info(account_info_iter)?;
    let token_program = next_account_info(account_info_iter)?;
    let metadata_program = next_account_info(account_info_iter)?;

    委托和冻结 —— 质押

    下一步,我们需要将程序设置为NFT的代理,委托NFT的权限,以便程序能够代表我们发起交易。

    msg!("Approving delegation");
    invoke(
    &spl_token::instruction::approve(
    &spl_token_program_id,
    nft_token_account.key,
    program_authority.key,
    user.key,
    &[user.key],
    1,
    )?,
    &[
    nft_token_account.clone(),
    program_authority.clone(),
    user.clone(),
    token_program.clone(),
    ],
    )?;

    现在,我们可以开始实际冻结代币的过程。我们不是真正改变代币的所有权,而是将其冻结,使在质押期间无法对代币进行任何操作。首先,我们需要为程序权限派生PDA(程序派生地址)。简单来说,我们会使用PDA作为代币铸造的授权实体,从而能够冻结账户。

    别忘了检查并确保PDA已经被提取。

    let (delegated_auth_pda, delegate_bump) =
    Pubkey::find_program_address(&[b"authority"], program_id);

    if delegated_auth_pda != *program_authority.key {
    msg!("Invalid seeds for PDA");
    return Err(StakeError::InvalidPda.into());
    }

    回到冻结操作本身,与委托批准不同,这里使用invoke_signed以从我们的程序进行签名。

    msg!("freezing NFT token account");
    invoke_signed(
    &mpl_token_metadata::instruction::freeze_delegated_account(
    mpl_metadata_program_id,
    *program_authority.key,
    *nft_token_account.key,
    *nft_edition.key,
    *nft_mint.key,
    ),
    &[
    program_authority.clone(),
    nft_token_account.clone(),
    nft_edition.clone(),
    nft_mint.clone(),
    metadata_program.clone(),
    ],
    &[&[b"authority", &[delegate_bump]]],
    )?;

    我们的程序的PDA现在具备了冻结令牌的权限。🧊

    接下来,我们将转到TypeScript文件(//ts/src/utils/instruction.rs),并向createStakingInstruction函数中添加更多的账户,确保其正常工作。

    我们需要确保新添加的账户与//src/processor.rs文件中process_stake函数的账户相匹配:

    nftMint: PublicKey,
    nftEdition: PublicKey,
    tokenProgram: PublicKey,
    metadataProgram: PublicKey,

    然后,我们将所有这些按照正确的顺序添加到TransactionInstruction中的账户列表。顺序非常重要。

    首先,取得授权账户:

    const [delegateAuthority] = PublicKey.findProgramAddressSync(
    [Buffer.from("authority")],
    programId
    )

    总共有5个新账户,你需要再次确保它们的顺序,并检查哪些是可写的,哪些是签名者。

    ...
    {
    pubkey: nftMint,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: nftEdition,
    isWritable: false,
    isSigner: false,
    },
    ...
    {
    pubkey: delegateAuthority,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: tokenProgram,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: metadataProgram,
    isWritable: false,
    isSigner: false,
    },

    测试我们的质押功能

    接下来,进入索引文件(//ts/src/index.rs),在创建stakeInstruction的地方,在testStaking函数中添加与之匹配的相同账户。

    下面是四个附加项:

    nft.mintAddress,
    nft.masterEditionAddress,
    TOKEN_PROGRAM_ID,
    METADATA_PROGRAM_ID,
    import { TOKEN_PROGRAM_ID } from "@solana/spl-token"
    import { PROGRAM_ID as METADATA_PROGRAM_ID } from "@metaplex-foundation/mpl-token-metadata"

    现在是时候测试我们的进展了:

    1. 使用cargo build-sbf重新构建程序,然后使用solana program deploy {path}进行更新。
    2. 确保你处于ts目录下,并执行npm run start

    假设没有出错,那我们就回到processor.rs文件,并向process_redeem函数添加相似的代码。

    委派和冻结 -- 兑换

    首先,你猜对了,我们要添加账户——一共有4个!

    let stake_mint = next_account_info(account_info_iter)?;
    let stake_authority = next_account_info(account_info_iter)?;
    let user_stake_ata = next_account_info(account_info_iter)?;
    let token_program = next_account_info(account_info_iter)?;

    接下来,我们将验证一些新账户。首先,我们要推导出stake_auth_pda,然后用自定义错误验证PDA

    let (stake_auth_pda, auth_bump) = Pubkey::find_program_address(&[b"mint"], program_id);

    if *stake_authority.key != stake_auth_pda {
    msg!("Invalid stake mint authority!");
    return Err(StakeError::InvalidPda.into());
    }

    向下滚动一些,我们要调用一个invoke_signed来调用令牌程序,以铸造代币,等我们了解了redeem_amount之后。我们需要指令的各种键,然后是所需的账户,最后是授权的种子。别忘了使用?来传播错误,否则红色波浪线将始终困扰你。

    invoke_signed(
    &spl_token::instruction::mint_to(
    token_program.key,
    stake_mint.key,
    user_stake_ata.key,
    stake_authority.key,
    &[stake_authority.key],
    redeem_amount.try_into().unwrap(),
    )?,
    &[
    stake_mint.clone(),
    user_stake_ata.clone(),
    stake_authority.clone(),
    token_program.clone(),
    ],
    &[&[b"mint", &[auth_bump]]],
    )?;

    这应该在此文件中处理铸币操作,但我们必须在客户端上添加新账户。

    我们回到之前的instruction.ts文件,向下滚动到createRedeemInstruction,并添加以下账户。

    mint: PublicKey,
    userStakeATA: PublicKey,
    tokenProgram: PublicKey,

    现在请记住,一些账户是派生的,如权威账户,所以我们不需要手动添加它。

    然后跳到TransactionInstruction本身,首先推导出mintAuth

    const [mintAuth] = PublicKey.findProgramAddressSync(
    [Buffer.from("mint")],
    programId
    )

    接下来进入return new TransactionInstruction,添加相关账户,并标明它们是否可写和/或可签。以下是我们需要添加的4个账户 - 请记住,顺序很重要。

    {
    pubkey: mint,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: mintAuth,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: userStakeATA,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: tokenProgram,
    isSigner: false,
    isWritable: false,
    },

    这应该包括了我们兑换所需的所有内容。我们最后需要回到同一个index.ts文件,并确保我们正确调用它,但这部分有些复杂,所以让我们先回到processor.rs并完成process_unstake函数。

    委托和冻结——解除质押

    解除质押过程基本上是将我们刚刚进行的质押和赎回步骤结合在一起,因此需要用到我们刚才操作过的所有账户。

    以下是我们需要添加的所有账户:

    let nft_mint = next_account_info(account_info_iter)?;
    let nft_edition = next_account_info(account_info_iter)?;
    ... (stake_state 应该在我们之前的代码中)
    let program_authority = next_account_info(account_info_iter)?;
    let stake_mint = next_account_info(account_info_iter)?;
    let stake_authority = next_account_info(account_info_iter)?;
    let user_stake_ata = next_account_info(account_info_iter)?;
    let token_program = next_account_info(account_info_iter)?;
    let metadata_program = next_account_info(account_info_iter)?;

    我们可以向下滚动,并复制粘贴 process_stakeprocess_redeem 函数中的一些验证:

    let (delegated_auth_pda, delegate_bump) =
    Pubkey::find_program_address(&[b"authority"], program_id);
    if delegated_auth_pda != *program_authority.key {
    msg!("Invalid seeds for PDA");
    return Err(StakeError::InvalidPda.into());
    }

    let (stake_auth_pda, auth_bump) = Pubkey::find_program_address(&[b"mint"], program_id);
    if *stake_authority.key != stake_auth_pda {
    msg!("Invalid stake mint authority!");
    return Err(StakeError::InvalidPda.into());
    }

    好的,这是相当新的部分,我们要“解冻”NFT代币账户。如果你还记得,我们之前冻结了它,现在我们要解冻它。这段代码与上面的冻结代码完全相反,我们只需更改辅助函数,使用 thaw_delegated_account

    msg!("thawing NFT token account");
    invoke_signed(
    &mpl_token_metadata::instruction::thaw_delegated_account(
    mpl_metadata_program_id,
    *program_authority.key,
    *nft_token_account.key,
    *nft_edition.key,
    *nft_mint.key,
    ),
    &[
    program_authority.clone(),
    nft_token_account.clone(),
    nft_edition.clone(),
    nft_mint.clone(),
    metadata_program.clone(),
    ],
    &[&[b"authority", &[delegate_bump]]],
    )?;

    接下来,我们需要撤销委托权限。与授权委托类似,但并不完全相同。我们可以移除 program_authority 字段,因为它不是必需的,并从批准助手函数中移除 amount

    msg!("Revoke delegation");
    invoke(
    &spl_token::instruction::revoke(
    &spl_token_program_id,
    nft_token_account.key,
    user.key,
    &[user.key],
    )?,
    &[
    nft_token_account.clone(),
    user.clone(),
    token_program.clone(),
    ],
    )?;

    最后,我们将从赎回函数中复制 invoke_signed,粘贴到 redeem_amount 下面。

    invoke_signed(
    &spl_token::instruction::mint_to(
    token_program.key,
    stake_mint.key,
    user_stake_ata.key,
    stake_authority.key,
    &[stake_authority.key],
    redeem_amount.try_into().unwrap(),
    )?,
    &[
    stake_mint.clone(),
    user_stake_ata.clone(),
    stake_authority.clone(),
    token_program.clone(),
    ],
    &[&[b"mint", &[auth_bump]]],
    )?;

    哦,还有一件事,我们实际上没有设置 redeem_amount,之前只是用了 unix_time。所以,改成 100 * unit_time,我们以后可以调整。确保在上述两个函数中都进行更改。

    这里应该就是了,回到客户端的文件上,添加所有的账户。向下滚动到 createUnstakeInstruction,将以下内容作为参数添加进去。

    nftMint: PublicKey,
    nftEdition: PublicKey,
    stakeMint: PublicKey,
    userStakeATA: PublicKey,
    tokenProgram: PublicKey,
    metadataProgram: PublicKey,

    再次提醒,有一些账户是自动派生的,所以我们不需要手动添加。

    接下来我们推导出 delegateAuthoritymintAuth,这与上面的代码完全相同。

    const [delegateAuthority] = PublicKey.findProgramAddressSync(
    [Buffer.from("authority")],
    programId
    )

    const [mintAuth] = PublicKey.findProgramAddressSync(
    [Buffer.from("mint")],
    programId
    )

    最后,我们将它们全部添加到指令中。这是很多账户,所以我们在这里全部发布,而不仅仅是我们要添加的那些。让你的眼睛不再在函数和文件之间来回移动。

    {
    pubkey: nftHolder,
    isWritable: false,
    isSigner: true,
    },
    {
    pubkey: nftTokenAccount,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: nftMint,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: nftEdition,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: stakeAccount,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: delegateAuthority,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: stakeMint,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: mintAuth,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: userStakeATA,
    isWritable: true,
    isSigner: false,
    },
    {
    pubkey: tokenProgram,
    isWritable: false,
    isSigner: false,
    },
    {
    pubkey: metadataProgram,
    isWritable: false,
    isSigner: false,
    },

    测试我们的功能

    好的,好的,我知道你已经迫不及待了,我们快到终点了。现在让我们回到index.ts文件中,调用并测试所有的函数。对于testRedeem函数,我们需要代币的铸币地址和用户的代币账户,以及createUnstakeInstruction

    首先,在testRedeem函数的参数中添加以下内容:

    stakeMint: web3.PublicKey,
    userStakeATA: web3.PublicKey

    然后,将它们添加到下方的createRedeemInstruction中:

    stakeMint,
    userStakeATA,
    TOKEN_PROGRAM_ID,
    PROGRAM_ID

    testUnstaking函数也进行上述相同的操作。

    接着,在createUnstakingInstruction中添加以下内容:

    nft.mintAddress,
    nft.masterEditionAddress,
    stakeMint,
    userStakeATA,
    TOKEN_PROGRAM_ID,
    METADATA_PROGRAM_ID,

    现在向下滚动到main()函数的调用位置,你会注意到testRedeemtestUnstaking都是红色的,因为它们缺少一些参数。

    首先,我们要声明stakeMint,目前我们将其硬编码,以及userStakeATA,该函数会创建ATA(如果ATA还不存在的话)。

    const stakeMint = new web3.PublicKey(
    "EMPTY FOR A MINUTE"
    )

    const userStakeATA = await getOrCreateAssociatedTokenAccount(
    connection,
    user,
    stakeMint,
    user.publicKey
    )

    ...现在,将调用更改为接收额外的参数:

    await testRedeem(connection, user, nft, stakeMint, userStakeATA.address)
    await testUnstaking(connection, user, nft, stakeMint, userStakeATA.address)

    前端编辑以测试功能

    我们暂时要切换到前端Buildoors项目中的index.ts文件(//tokens/bld/index.ts)。在这里,我们使用createBldToken函数创建BLD令牌。

    在该函数内部,我们称token.CreateMint的第三个参数为铸币授权,它掌管着铸币过程。最初,它是一个payer.publicKey,用于初始调用。我们很快就会更改铸币授权。

    首先,我们要向createBldToken函数添加一个参数:

    programId: web3.PublicKey

    然后向下滚动到主函数中的调用位置,并为await createBldToken调用添加第三个参数。

    new web3.PublicKey("USE YOUR PROGRAM ID")

    如果你找不到程序ID,你可以重新部署,控制台会显示你所需的程序ID

    向上滚动,超过const tokenMint,找到mintAuth。你可以在Anchor NFT质押计划中找到授权的具体信息。

    const [mintAuth] = await web3.PublicKey.findProgramAddress(
    [Buffer.from("mint")],
    programId
    )

    滚动回到下面,在transactionSignature创建后,我们将设置新的铸币权限(这是我们上面提到的更改)。

    await token.setAuthority(
    connection,
    payer,
    tokenMint,
    payer.publicKey,
    token.AuthorityType.MintTokens,
    mintAuth
    )

    现在,我们可以使用新的认证重新创建BLD令牌,并将其添加到上面的stakeMint中。

    const stakeMint = new web3.PublicKey(
    "EMPTY FOR A MINUTE"
    )

    最后,全面测试一切

    现在,请切换到主目录并运行 npm run create-bld-token。确保你已经将环境设置为devnet

    核实你的构建脚本,它应该如下所示:

    "creat-bld-token": "ts-node tokens/bld/index.ts"

    一旦成功执行完毕,你可以从tokens/bld目录中的cache.json文件中获取新的密钥。

    现在我们终于回到了NFT质押计划,并且可以在stakeMint创建中使用这个密钥:

    const stakeMint = new web3.PublicKey(
    "MINT KEY FROM CACHE.JSON"
    )

    现在应该一切准备就绪,并可以正常工作。返回到ts目录,并使用npm run start进行全面测试。如果一切顺利,你的控制台将确认初始化、质押、赎回和解质押都已成功完成。

    确实涉及了许多细节。深呼吸,给自己一些喘息的空间。这是一项充满挑战性的任务,不妨再回头看一遍,复习一下,甚至再次实践,不管需要付出多少努力。只要你能掌握这些内容,你就将成为一名出色的Solana开发者。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/ship-a-staking-app/index.html b/Solana-Co-Learn/module4/ship-a-staking-app/index.html index ac8f1a9e5..18fc9560f 100644 --- a/Solana-Co-Learn/module4/ship-a-staking-app/index.html +++ b/Solana-Co-Learn/module4/ship-a-staking-app/index.html @@ -5,13 +5,13 @@ 发行一个质押应用程序 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/ship-a-staking-app/put-it-all-together/index.html b/Solana-Co-Learn/module4/ship-a-staking-app/put-it-all-together/index.html index f367694c0..f06dfaf1e 100644 --- a/Solana-Co-Learn/module4/ship-a-staking-app/put-it-all-together/index.html +++ b/Solana-Co-Learn/module4/ship-a-staking-app/put-it-all-together/index.html @@ -5,13 +5,13 @@ 将所有部分整合到一起 | All in One Solana - +
    -
    Skip to main content

    将所有部分整合到一起

    前端质押部分

    你能感受到吗?终点线就在眼前了...至少对于这个核心部分来说是这样的。😆

    我们将集中精力使程序前端的质押和解质押指令正常运行。

    首先,在你的前端项目的根目录下创建一个名为 utils 的新文件夹。然后,创建一个名为 instructions.ts 的文件,并从NFT质押项目中复制/粘贴整个 instructions.ts 文件。由于代码超过200行,所以我不会在这里粘贴。😬

    下一步我们将进入 StakeOptionsDisplay 文件(//components/StakeOptionsDisplay.rs)。你会注意到我们有三个空函数:handleStakehandleUnstakehandleClaim。这将是本节的重点。

    和往常一样,先让我们准备好钱包和网络连接。

    const walletAdapter = useWallet()
    const { connection } = useConnection()

    我们先确认下钱包是否已连接。

    if (!walletAdapter.connected || !walletAdapter.publicKey) {
    alert("Please connect your wallet")
    return
    }

    如果一切正常,我们可以开始创建质押指示。

    const stakeInstruction = createStakingInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.mint.address,
    nftData.edition.address,
    TOKEN_PROGRAM_ID, // 需要导入
    METADATA_PROGRAM_ID, // 需要导入
    PROGRAM_ID // 需要从constants.ts导入
    )

    因此,进入 utils 文件夹,添加一个名为 constants.ts 的文件,并加入以下内容:

    import { PublicKey } from "@solana/web3.js"

    export const PROGRAM_ID = new PublicKey(
    process.env.NEXT_PUBLIC_STAKE_PROGRAM_ID ?? ""
    )

    这是我们在上述指示中使用的程序ID。确保你的env.local文件中有正确的程序ID

    stake 指令应该准备就绪了,接下来我们要创建一笔交易,添加指令,然后发送。

    const transaction = new Transaction().add(stakeInstruction)

    const signature = await walletAdapter.sendTransaction(transaction, connection)

    由于这是一个等待操作,确保在 handleStake 回调中添加 async 关键字。实际上,这三个函数都应该是异步回调函数。

    我们可以进行检查以确认是否已完成,因此让我们获取最新的区块哈希并确认交易。

    const latestBlockhash = await connection.getLatestBlockhash()

    await connection.confirmTransaction(
    {
    blockhash: latestBlockhash.blockhash,
    lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
    signature: signature,
    },
    "finalized"
    )
    } catch (error) {
    console.log(error)
    }

    await checkStakingStatus()

    确认交易后,我们可以检查是否仍在质押,因此让我们将此功能添加到 handleStake 代码块的顶部。

    const checkStakingStatus = useCallback(async () => {
    if (!walletAdapter.publicKey || !nftTokenAccount) {
    return
    }

    我们还需要将 walletAdapterconnection 添加为 handleStake 回调的依赖项。

    我们需要添加一些状态字段,所以向上滚动并添加质押状态的相关字段。

    const [isStaking, setIsStaking] = useState(isStaked)

    我们还要将参数 StakeOptionsDisplayisStaking 改为 isStaked,否则我们的状态无法正常工作。

    同时,我们还需要在 utils 中创建一个名为 accounts.ts 的新文件,并从我们的NFT质押程序utils文件夹中复制文件过来。可能还需要安装我们的borsh库。

    我们之所以要复制这些内容,是因为每次检查状态时,我们都要查看抵押账户的状态,并确认抵押的价值。

    接下来,在 checkStakingStatus 的回调函数中,我们要调用 getStakeAccount

    const account = await getStakeAccount(
    connection,
    walletAdapter.publicKey,
    nftTokenAccount
    )

    setIsStaking(account.state === 0)
    } catch (e) {
    console.log("error:", e)
    }

    既然我们要发送多个交易,请继续设置一个辅助函数来确认我们的交易。我们可以将上述代码粘贴进去。

    const sendAndConfirmTransaction = useCallback(
    async (transaction: Transaction) => {
    try {
    const signature = await walletAdapter.sendTransaction(
    transaction,
    connection
    )
    const latestBlockhash = await connection.getLatestBlockhash()
    await connection.confirmTransaction(
    {
    blockhash: latestBlockhash.blockhash,
    lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
    signature: signature,
    },
    "finalized"
    )
    } catch (error) {
    console.log(error)
    }

    await checkStakingStatus()
    },
    [walletAdapter, connection]
    )

    现在,在 handleStake 函数中只需调用 sendAndConfirmTransaction 即可。

    前端索赔/兑换

    现在就可以进行解除质押和领取奖励了。这两者实际上是相同的操作,不过增加了一个复杂的环节:我们是否需要为用户创建代币账户,用于存放他们即将获得的奖励代币。

    下面我们将解决 handleClaim 函数。

    首先,使用与之前相同的警报检查钱包适配器是否已连接并具有公钥。

    接着我们要检查奖励的关联令牌账户是否存在:

    const userStakeATA = await getAssociatedTokenAddress(
    STAKE_MINT,
    walletAdapter.publicKey
    )

    请快速查看我们创建的 constants.ts 文件,并为薄荷地址添加以下代码,因为我们需要 STAKE_MINT 的值:

    export const STAKE_MINT = new PublicKey(
    process.env.NEXT_PUBLIC_STAKE_MINT_ADDRESS ?? ""
    )

    当我们拥有了ATA后,我们需要调用 getAccountInfo 函数,它会返回一个账户或null

    const account = await connection.getAccountInfo(userStakeATA)

    随后,我们创建交易并检查是否存在一个账户,如果没有,我们调用 createAssociatedTokenAccountInstruction 函数;否则,我们调用 createRedeemInstruction 函数。

    const transaction = new Transaction()

    if (!account) {
    transaction.add(
    createAssociatedTokenAccountInstruction(
    walletAdapter.publicKey,
    userStakeATA,
    walletAdapter.publicKey,
    STAKE_MINT
    )
    )
    }

    transaction.add(
    createRedeemInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.mint.address,
    userStakeATA,
    TOKEN_PROGRAM_ID,
    PROGRAM_ID
    )
    )

    现在我们可以调用上面创建的辅助事务确认函数。

    await sendAndConfirmTransaction(transaction)
    }, [walletAdapter, connection, nftData, nftTokenAccount])

    最后,别忘了将依赖项 walletAdapterconnection 添加到回调函数中。

    前端解除质押操作

    对于 handleUnstake 函数,我们要确保与其他函数一样使用异步处理。你可以直接从 handleClaim 复制以下内容:

    if (
    !walletAdapter.connected ||
    !walletAdapter.publicKey ||
    !nftTokenAccount
    ) {
    alert("请连接您的钱包")
    return
    }

    const userStakeATA = await getAssociatedTokenAddress(
    STAKE_MINT,
    walletAdapter.publicKey
    )

    const account = await connection.getAccountInfo(userStakeATA)

    const transaction = new Transaction()

    if (!account) {
    transaction.add(
    createAssociatedTokenAccountInstruction(
    walletAdapter.publicKey,
    userStakeATA,
    walletAdapter.publicKey,
    STAKE_MINT
    )
    )
    }

    接下来,我们将向交易中添加指令,并再次调用辅助函数:

    transaction.add(
    createUnstakeInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.address,
    nftData.edition.address,
    STAKE_MINT,
    userStakeATA,
    TOKEN_PROGRAM_ID,
    METADATA_PROGRAM_ID,
    PROGRAM_ID
    )
    )

    await sendAndConfirmTransaction(transaction)
    }

    页面编辑的股份部分

    我们继续转到 stake.tsx 文件(位于 //pages/stake.tsx)并进行一些与上述内容相关的修改。

    首先,根据我们之前的编辑,我们需要将 isStaking 的使用更改为 isStaked。这项修改应在 <StakeOptionsDisplay> 组件中进行。我们还需要添加一个名为 nftData 的字段,并将其赋值为 nftData,我们还需要一个状态来存储这个值。

    const [nftData, setNftData] = useState<any>()`

    目前,我们还没有实际的数据。我们将使用一个 useEffect 钩子,在其中调用 metaplex,并通过铸币地址找到 NFT 数据。

    useEffect(() => {
    const metaplex = Metaplex.make(connection).use(
    walletAdapterIdentity(walletAdapter)
    )

    try {
    metaplex
    .nfts()
    .findByMint({ mintAddress: mint })
    .then((nft) => {
    console.log("在质押页面上的 NFT 数据:", nft)
    setNftData(nft)
    })
    } catch (e) {
    console.log("获取 NFT 时发生错误:", e)
    }
    }, [connection, walletAdapter])

    不要忘了像我们之前所做的那样,获取一个连接和钱包适配器。

    现在一切准备就绪,可以进行测试了。运行 npm run dev,然后在浏览器中打开本地主机。赶快试试,点击按钮吧!🔘 ⏏️ 🆒

    还需要进行一些编辑

    似乎还有几个方面可能需要改进。让我们回到 StakeOptionsDisplay 文件,并在 handleStake 函数之前添加以下的 useEffect 钩子。

    useEffect(() => {
    checkStakingStatus()

    if (nftData) {
    connection
    .getTokenLargestAccounts(nftData.mint.address)
    .then((accounts) => setNftTokenAccount(accounts.value[0].address))
    }
    }, [nftData, walletAdapter, connection])

    这是一个快速检查,确认我们是否有 NFT 数据,如果有的话,就为 NFT 代币账户设置值。这是一个 NFT,只有一个,所以它会是第一个地址,因此索引值为 '0'

    此外,在所有三个回调函数中,我们还需要将 nftData 添加为依赖项。

    最后,在 handleStake 中,在创建交易之前添加以下代码:

    const [stakeAccount] = PublicKey.findProgramAddressSync(
    [walletAdapter.publicKey.toBuffer(), nftTokenAccount.toBuffer()],
    PROGRAM_ID
    )

    const transaction = new Transaction()

    const account = await connection.getAccountInfo(stakeAccount)
    if (!account) {
    transaction.add(
    createInitializeStakeAccountInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    PROGRAM_ID
    )
    )
    }

    我们需要一个质押账户,也就是一个程序驱动的账户(PDA),用于在程序中存储有关你的质押状态的数据。如果我们没有这样的账户,上述代码会为我们初始化它。

    终于,我们完成了核心部分 4。这最后的部分有些杂乱,为确保没有遗漏任何东西,可以将整个 StakeOptionsDisplay 文件粘贴下来进行仔细检查。

    如果你想进一步改进代码或有任何其他问题,请随时提出。

    import { VStack, Text, Button } from "@chakra-ui/react"
    import { useConnection, useWallet } from "@solana/wallet-adapter-react"
    import { PublicKey, Transaction } from "@solana/web3.js"
    import { useCallback, useEffect, useState } from "react"
    import {
    createInitializeStakeAccountInstruction,
    createRedeemInstruction,
    createStakingInstruction,
    createUnstakeInstruction,
    } from "../utils/instructions"
    import {
    TOKEN_PROGRAM_ID,
    getAssociatedTokenAddress,
    createAssociatedTokenAccountInstruction,
    } from "@solana/spl-token"
    import { PROGRAM_ID as METADATA_PROGRAM_ID } from "@metaplex-foundation/mpl-token-metadata"
    import { PROGRAM_ID, STAKE_MINT } from "../utils/constants"
    import { getStakeAccount } from "../utils/accounts"

    export const StakeOptionsDisplay = ({
    nftData,
    isStaked,
    daysStaked,
    totalEarned,
    claimable,
    }: {
    nftData: any
    isStaked: boolean
    daysStaked: number
    totalEarned: number
    claimable: number
    }) => {
    const walletAdapter = useWallet()
    const { connection } = useConnection()

    const [isStaking, setIsStaking] = useState(isStaked)
    const [nftTokenAccount, setNftTokenAccount] = useState<PublicKey>()

    const checkStakingStatus = useCallback(async () => {
    if (!walletAdapter.publicKey || !nftTokenAccount) {
    return
    }

    try {
    const account = await getStakeAccount(
    connection,
    walletAdapter.publicKey,
    nftTokenAccount
    )

    console.log("stake account:", account)

    setIsStaking(account.state === 0)
    } catch (e) {
    console.log("error:", e)
    }
    }, [walletAdapter, connection, nftTokenAccount])

    useEffect(() => {
    checkStakingStatus()

    if (nftData) {
    connection
    .getTokenLargestAccounts(nftData.mint.address)
    .then((accounts) => setNftTokenAccount(accounts.value[0].address))
    }
    }, [nftData, walletAdapter, connection])

    const handleStake = useCallback(async () => {
    if (
    !walletAdapter.connected ||
    !walletAdapter.publicKey ||
    !nftTokenAccount
    ) {
    alert("Please connect your wallet")
    return
    }

    const [stakeAccount] = PublicKey.findProgramAddressSync(
    [walletAdapter.publicKey.toBuffer(), nftTokenAccount.toBuffer()],
    PROGRAM_ID
    )

    const transaction = new Transaction()

    const account = await connection.getAccountInfo(stakeAccount)
    if (!account) {
    transaction.add(
    createInitializeStakeAccountInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    PROGRAM_ID
    )
    )
    }

    const stakeInstruction = createStakingInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.mint.address,
    nftData.edition.address,
    TOKEN_PROGRAM_ID,
    METADATA_PROGRAM_ID,
    PROGRAM_ID
    )

    transaction.add(stakeInstruction)

    await sendAndConfirmTransaction(transaction)
    }, [walletAdapter, connection, nftData, nftTokenAccount])

    const sendAndConfirmTransaction = useCallback(
    async (transaction: Transaction) => {
    try {
    const signature = await walletAdapter.sendTransaction(
    transaction,
    connection
    )
    const latestBlockhash = await connection.getLatestBlockhash()
    await connection.confirmTransaction(
    {
    blockhash: latestBlockhash.blockhash,
    lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
    signature: signature,
    },
    "finalized"
    )
    } catch (error) {
    console.log(error)
    }

    await checkStakingStatus()
    },
    [walletAdapter, connection]
    )

    const handleUnstake = useCallback(async () => {
    if (
    !walletAdapter.connected ||
    !walletAdapter.publicKey ||
    !nftTokenAccount
    ) {
    alert("Please connect your wallet")
    return
    }

    const userStakeATA = await getAssociatedTokenAddress(
    STAKE_MINT,
    walletAdapter.publicKey
    )

    const account = await connection.getAccountInfo(userStakeATA)

    const transaction = new Transaction()

    if (!account) {
    transaction.add(
    createAssociatedTokenAccountInstruction(
    walletAdapter.publicKey,
    userStakeATA,
    walletAdapter.publicKey,
    STAKE_MINT
    )
    )
    }

    transaction.add(
    createUnstakeInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.address,
    nftData.edition.address,
    STAKE_MINT,
    userStakeATA,
    TOKEN_PROGRAM_ID,
    METADATA_PROGRAM_ID,
    PROGRAM_ID
    )
    )

    await sendAndConfirmTransaction(transaction)
    }, [walletAdapter, connection, nftData, nftTokenAccount])

    const handleClaim = useCallback(async () => {
    if (
    !walletAdapter.connected ||
    !walletAdapter.publicKey ||
    !nftTokenAccount
    ) {
    alert("Please connect your wallet")
    return
    }

    const userStakeATA = await getAssociatedTokenAddress(
    STAKE_MINT,
    walletAdapter.publicKey
    )

    const account = await connection.getAccountInfo(userStakeATA)

    const transaction = new Transaction()

    if (!account) {
    transaction.add(
    createAssociatedTokenAccountInstruction(
    walletAdapter.publicKey,
    userStakeATA,
    walletAdapter.publicKey,
    STAKE_MINT
    )
    )
    }

    transaction.add(
    createRedeemInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.mint.address,
    userStakeATA,
    TOKEN_PROGRAM_ID,
    PROGRAM_ID
    )
    )

    await sendAndConfirmTransaction(transaction)
    }, [walletAdapter, connection, nftData, nftTokenAccount])

    return (
    <VStack
    bgColor="containerBg"
    borderRadius="20px"
    padding="20px 40px"
    spacing={5}
    >
    <Text
    bgColor="containerBgSecondary"
    padding="4px 8px"
    borderRadius="20px"
    color="bodyText"
    as="b"
    fontSize="sm"
    >
    {isStaking
    ? `STAKING ${daysStaked} DAY${daysStaked === 1 ? "" : "S"}`
    : "READY TO STAKE"}
    </Text>
    <VStack spacing={-1}>
    <Text color="white" as="b" fontSize="4xl">
    {isStaking ? `${totalEarned} $BLD` : "0 $BLD"}
    </Text>
    <Text color="bodyText">
    {isStaking ? `${claimable} $BLD earned` : "earn $BLD by staking"}
    </Text>
    </VStack>
    <Button
    onClick={isStaking ? handleClaim : handleStake}
    bgColor="buttonGreen"
    width="200px"
    >
    <Text as="b">{isStaking ? "claim $BLD" : "stake buildoor"}</Text>
    </Button>
    {isStaking ? <Button onClick={handleUnstake}>unstake</Button> : null}
    </VStack>
    )
    }
    - +
    Skip to main content

    将所有部分整合到一起

    前端质押部分

    你能感受到吗?终点线就在眼前了...至少对于这个核心部分来说是这样的。😆

    我们将集中精力使程序前端的质押和解质押指令正常运行。

    首先,在你的前端项目的根目录下创建一个名为 utils 的新文件夹。然后,创建一个名为 instructions.ts 的文件,并从NFT质押项目中复制/粘贴整个 instructions.ts 文件。由于代码超过200行,所以我不会在这里粘贴。😬

    下一步我们将进入 StakeOptionsDisplay 文件(//components/StakeOptionsDisplay.rs)。你会注意到我们有三个空函数:handleStakehandleUnstakehandleClaim。这将是本节的重点。

    和往常一样,先让我们准备好钱包和网络连接。

    const walletAdapter = useWallet()
    const { connection } = useConnection()

    我们先确认下钱包是否已连接。

    if (!walletAdapter.connected || !walletAdapter.publicKey) {
    alert("Please connect your wallet")
    return
    }

    如果一切正常,我们可以开始创建质押指示。

    const stakeInstruction = createStakingInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.mint.address,
    nftData.edition.address,
    TOKEN_PROGRAM_ID, // 需要导入
    METADATA_PROGRAM_ID, // 需要导入
    PROGRAM_ID // 需要从constants.ts导入
    )

    因此,进入 utils 文件夹,添加一个名为 constants.ts 的文件,并加入以下内容:

    import { PublicKey } from "@solana/web3.js"

    export const PROGRAM_ID = new PublicKey(
    process.env.NEXT_PUBLIC_STAKE_PROGRAM_ID ?? ""
    )

    这是我们在上述指示中使用的程序ID。确保你的env.local文件中有正确的程序ID

    stake 指令应该准备就绪了,接下来我们要创建一笔交易,添加指令,然后发送。

    const transaction = new Transaction().add(stakeInstruction)

    const signature = await walletAdapter.sendTransaction(transaction, connection)

    由于这是一个等待操作,确保在 handleStake 回调中添加 async 关键字。实际上,这三个函数都应该是异步回调函数。

    我们可以进行检查以确认是否已完成,因此让我们获取最新的区块哈希并确认交易。

    const latestBlockhash = await connection.getLatestBlockhash()

    await connection.confirmTransaction(
    {
    blockhash: latestBlockhash.blockhash,
    lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
    signature: signature,
    },
    "finalized"
    )
    } catch (error) {
    console.log(error)
    }

    await checkStakingStatus()

    确认交易后,我们可以检查是否仍在质押,因此让我们将此功能添加到 handleStake 代码块的顶部。

    const checkStakingStatus = useCallback(async () => {
    if (!walletAdapter.publicKey || !nftTokenAccount) {
    return
    }

    我们还需要将 walletAdapterconnection 添加为 handleStake 回调的依赖项。

    我们需要添加一些状态字段,所以向上滚动并添加质押状态的相关字段。

    const [isStaking, setIsStaking] = useState(isStaked)

    我们还要将参数 StakeOptionsDisplayisStaking 改为 isStaked,否则我们的状态无法正常工作。

    同时,我们还需要在 utils 中创建一个名为 accounts.ts 的新文件,并从我们的NFT质押程序utils文件夹中复制文件过来。可能还需要安装我们的borsh库。

    我们之所以要复制这些内容,是因为每次检查状态时,我们都要查看抵押账户的状态,并确认抵押的价值。

    接下来,在 checkStakingStatus 的回调函数中,我们要调用 getStakeAccount

    const account = await getStakeAccount(
    connection,
    walletAdapter.publicKey,
    nftTokenAccount
    )

    setIsStaking(account.state === 0)
    } catch (e) {
    console.log("error:", e)
    }

    既然我们要发送多个交易,请继续设置一个辅助函数来确认我们的交易。我们可以将上述代码粘贴进去。

    const sendAndConfirmTransaction = useCallback(
    async (transaction: Transaction) => {
    try {
    const signature = await walletAdapter.sendTransaction(
    transaction,
    connection
    )
    const latestBlockhash = await connection.getLatestBlockhash()
    await connection.confirmTransaction(
    {
    blockhash: latestBlockhash.blockhash,
    lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
    signature: signature,
    },
    "finalized"
    )
    } catch (error) {
    console.log(error)
    }

    await checkStakingStatus()
    },
    [walletAdapter, connection]
    )

    现在,在 handleStake 函数中只需调用 sendAndConfirmTransaction 即可。

    前端索赔/兑换

    现在就可以进行解除质押和领取奖励了。这两者实际上是相同的操作,不过增加了一个复杂的环节:我们是否需要为用户创建代币账户,用于存放他们即将获得的奖励代币。

    下面我们将解决 handleClaim 函数。

    首先,使用与之前相同的警报检查钱包适配器是否已连接并具有公钥。

    接着我们要检查奖励的关联令牌账户是否存在:

    const userStakeATA = await getAssociatedTokenAddress(
    STAKE_MINT,
    walletAdapter.publicKey
    )

    请快速查看我们创建的 constants.ts 文件,并为薄荷地址添加以下代码,因为我们需要 STAKE_MINT 的值:

    export const STAKE_MINT = new PublicKey(
    process.env.NEXT_PUBLIC_STAKE_MINT_ADDRESS ?? ""
    )

    当我们拥有了ATA后,我们需要调用 getAccountInfo 函数,它会返回一个账户或null

    const account = await connection.getAccountInfo(userStakeATA)

    随后,我们创建交易并检查是否存在一个账户,如果没有,我们调用 createAssociatedTokenAccountInstruction 函数;否则,我们调用 createRedeemInstruction 函数。

    const transaction = new Transaction()

    if (!account) {
    transaction.add(
    createAssociatedTokenAccountInstruction(
    walletAdapter.publicKey,
    userStakeATA,
    walletAdapter.publicKey,
    STAKE_MINT
    )
    )
    }

    transaction.add(
    createRedeemInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.mint.address,
    userStakeATA,
    TOKEN_PROGRAM_ID,
    PROGRAM_ID
    )
    )

    现在我们可以调用上面创建的辅助事务确认函数。

    await sendAndConfirmTransaction(transaction)
    }, [walletAdapter, connection, nftData, nftTokenAccount])

    最后,别忘了将依赖项 walletAdapterconnection 添加到回调函数中。

    前端解除质押操作

    对于 handleUnstake 函数,我们要确保与其他函数一样使用异步处理。你可以直接从 handleClaim 复制以下内容:

    if (
    !walletAdapter.connected ||
    !walletAdapter.publicKey ||
    !nftTokenAccount
    ) {
    alert("请连接您的钱包")
    return
    }

    const userStakeATA = await getAssociatedTokenAddress(
    STAKE_MINT,
    walletAdapter.publicKey
    )

    const account = await connection.getAccountInfo(userStakeATA)

    const transaction = new Transaction()

    if (!account) {
    transaction.add(
    createAssociatedTokenAccountInstruction(
    walletAdapter.publicKey,
    userStakeATA,
    walletAdapter.publicKey,
    STAKE_MINT
    )
    )
    }

    接下来,我们将向交易中添加指令,并再次调用辅助函数:

    transaction.add(
    createUnstakeInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.address,
    nftData.edition.address,
    STAKE_MINT,
    userStakeATA,
    TOKEN_PROGRAM_ID,
    METADATA_PROGRAM_ID,
    PROGRAM_ID
    )
    )

    await sendAndConfirmTransaction(transaction)
    }

    页面编辑的股份部分

    我们继续转到 stake.tsx 文件(位于 //pages/stake.tsx)并进行一些与上述内容相关的修改。

    首先,根据我们之前的编辑,我们需要将 isStaking 的使用更改为 isStaked。这项修改应在 <StakeOptionsDisplay> 组件中进行。我们还需要添加一个名为 nftData 的字段,并将其赋值为 nftData,我们还需要一个状态来存储这个值。

    const [nftData, setNftData] = useState<any>()`

    目前,我们还没有实际的数据。我们将使用一个 useEffect 钩子,在其中调用 metaplex,并通过铸币地址找到 NFT 数据。

    useEffect(() => {
    const metaplex = Metaplex.make(connection).use(
    walletAdapterIdentity(walletAdapter)
    )

    try {
    metaplex
    .nfts()
    .findByMint({ mintAddress: mint })
    .then((nft) => {
    console.log("在质押页面上的 NFT 数据:", nft)
    setNftData(nft)
    })
    } catch (e) {
    console.log("获取 NFT 时发生错误:", e)
    }
    }, [connection, walletAdapter])

    不要忘了像我们之前所做的那样,获取一个连接和钱包适配器。

    现在一切准备就绪,可以进行测试了。运行 npm run dev,然后在浏览器中打开本地主机。赶快试试,点击按钮吧!🔘 ⏏️ 🆒

    还需要进行一些编辑

    似乎还有几个方面可能需要改进。让我们回到 StakeOptionsDisplay 文件,并在 handleStake 函数之前添加以下的 useEffect 钩子。

    useEffect(() => {
    checkStakingStatus()

    if (nftData) {
    connection
    .getTokenLargestAccounts(nftData.mint.address)
    .then((accounts) => setNftTokenAccount(accounts.value[0].address))
    }
    }, [nftData, walletAdapter, connection])

    这是一个快速检查,确认我们是否有 NFT 数据,如果有的话,就为 NFT 代币账户设置值。这是一个 NFT,只有一个,所以它会是第一个地址,因此索引值为 '0'

    此外,在所有三个回调函数中,我们还需要将 nftData 添加为依赖项。

    最后,在 handleStake 中,在创建交易之前添加以下代码:

    const [stakeAccount] = PublicKey.findProgramAddressSync(
    [walletAdapter.publicKey.toBuffer(), nftTokenAccount.toBuffer()],
    PROGRAM_ID
    )

    const transaction = new Transaction()

    const account = await connection.getAccountInfo(stakeAccount)
    if (!account) {
    transaction.add(
    createInitializeStakeAccountInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    PROGRAM_ID
    )
    )
    }

    我们需要一个质押账户,也就是一个程序驱动的账户(PDA),用于在程序中存储有关你的质押状态的数据。如果我们没有这样的账户,上述代码会为我们初始化它。

    终于,我们完成了核心部分 4。这最后的部分有些杂乱,为确保没有遗漏任何东西,可以将整个 StakeOptionsDisplay 文件粘贴下来进行仔细检查。

    如果你想进一步改进代码或有任何其他问题,请随时提出。

    import { VStack, Text, Button } from "@chakra-ui/react"
    import { useConnection, useWallet } from "@solana/wallet-adapter-react"
    import { PublicKey, Transaction } from "@solana/web3.js"
    import { useCallback, useEffect, useState } from "react"
    import {
    createInitializeStakeAccountInstruction,
    createRedeemInstruction,
    createStakingInstruction,
    createUnstakeInstruction,
    } from "../utils/instructions"
    import {
    TOKEN_PROGRAM_ID,
    getAssociatedTokenAddress,
    createAssociatedTokenAccountInstruction,
    } from "@solana/spl-token"
    import { PROGRAM_ID as METADATA_PROGRAM_ID } from "@metaplex-foundation/mpl-token-metadata"
    import { PROGRAM_ID, STAKE_MINT } from "../utils/constants"
    import { getStakeAccount } from "../utils/accounts"

    export const StakeOptionsDisplay = ({
    nftData,
    isStaked,
    daysStaked,
    totalEarned,
    claimable,
    }: {
    nftData: any
    isStaked: boolean
    daysStaked: number
    totalEarned: number
    claimable: number
    }) => {
    const walletAdapter = useWallet()
    const { connection } = useConnection()

    const [isStaking, setIsStaking] = useState(isStaked)
    const [nftTokenAccount, setNftTokenAccount] = useState<PublicKey>()

    const checkStakingStatus = useCallback(async () => {
    if (!walletAdapter.publicKey || !nftTokenAccount) {
    return
    }

    try {
    const account = await getStakeAccount(
    connection,
    walletAdapter.publicKey,
    nftTokenAccount
    )

    console.log("stake account:", account)

    setIsStaking(account.state === 0)
    } catch (e) {
    console.log("error:", e)
    }
    }, [walletAdapter, connection, nftTokenAccount])

    useEffect(() => {
    checkStakingStatus()

    if (nftData) {
    connection
    .getTokenLargestAccounts(nftData.mint.address)
    .then((accounts) => setNftTokenAccount(accounts.value[0].address))
    }
    }, [nftData, walletAdapter, connection])

    const handleStake = useCallback(async () => {
    if (
    !walletAdapter.connected ||
    !walletAdapter.publicKey ||
    !nftTokenAccount
    ) {
    alert("Please connect your wallet")
    return
    }

    const [stakeAccount] = PublicKey.findProgramAddressSync(
    [walletAdapter.publicKey.toBuffer(), nftTokenAccount.toBuffer()],
    PROGRAM_ID
    )

    const transaction = new Transaction()

    const account = await connection.getAccountInfo(stakeAccount)
    if (!account) {
    transaction.add(
    createInitializeStakeAccountInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    PROGRAM_ID
    )
    )
    }

    const stakeInstruction = createStakingInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.mint.address,
    nftData.edition.address,
    TOKEN_PROGRAM_ID,
    METADATA_PROGRAM_ID,
    PROGRAM_ID
    )

    transaction.add(stakeInstruction)

    await sendAndConfirmTransaction(transaction)
    }, [walletAdapter, connection, nftData, nftTokenAccount])

    const sendAndConfirmTransaction = useCallback(
    async (transaction: Transaction) => {
    try {
    const signature = await walletAdapter.sendTransaction(
    transaction,
    connection
    )
    const latestBlockhash = await connection.getLatestBlockhash()
    await connection.confirmTransaction(
    {
    blockhash: latestBlockhash.blockhash,
    lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
    signature: signature,
    },
    "finalized"
    )
    } catch (error) {
    console.log(error)
    }

    await checkStakingStatus()
    },
    [walletAdapter, connection]
    )

    const handleUnstake = useCallback(async () => {
    if (
    !walletAdapter.connected ||
    !walletAdapter.publicKey ||
    !nftTokenAccount
    ) {
    alert("Please connect your wallet")
    return
    }

    const userStakeATA = await getAssociatedTokenAddress(
    STAKE_MINT,
    walletAdapter.publicKey
    )

    const account = await connection.getAccountInfo(userStakeATA)

    const transaction = new Transaction()

    if (!account) {
    transaction.add(
    createAssociatedTokenAccountInstruction(
    walletAdapter.publicKey,
    userStakeATA,
    walletAdapter.publicKey,
    STAKE_MINT
    )
    )
    }

    transaction.add(
    createUnstakeInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.address,
    nftData.edition.address,
    STAKE_MINT,
    userStakeATA,
    TOKEN_PROGRAM_ID,
    METADATA_PROGRAM_ID,
    PROGRAM_ID
    )
    )

    await sendAndConfirmTransaction(transaction)
    }, [walletAdapter, connection, nftData, nftTokenAccount])

    const handleClaim = useCallback(async () => {
    if (
    !walletAdapter.connected ||
    !walletAdapter.publicKey ||
    !nftTokenAccount
    ) {
    alert("Please connect your wallet")
    return
    }

    const userStakeATA = await getAssociatedTokenAddress(
    STAKE_MINT,
    walletAdapter.publicKey
    )

    const account = await connection.getAccountInfo(userStakeATA)

    const transaction = new Transaction()

    if (!account) {
    transaction.add(
    createAssociatedTokenAccountInstruction(
    walletAdapter.publicKey,
    userStakeATA,
    walletAdapter.publicKey,
    STAKE_MINT
    )
    )
    }

    transaction.add(
    createRedeemInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.mint.address,
    userStakeATA,
    TOKEN_PROGRAM_ID,
    PROGRAM_ID
    )
    )

    await sendAndConfirmTransaction(transaction)
    }, [walletAdapter, connection, nftData, nftTokenAccount])

    return (
    <VStack
    bgColor="containerBg"
    borderRadius="20px"
    padding="20px 40px"
    spacing={5}
    >
    <Text
    bgColor="containerBgSecondary"
    padding="4px 8px"
    borderRadius="20px"
    color="bodyText"
    as="b"
    fontSize="sm"
    >
    {isStaking
    ? `STAKING ${daysStaked} DAY${daysStaked === 1 ? "" : "S"}`
    : "READY TO STAKE"}
    </Text>
    <VStack spacing={-1}>
    <Text color="white" as="b" fontSize="4xl">
    {isStaking ? `${totalEarned} $BLD` : "0 $BLD"}
    </Text>
    <Text color="bodyText">
    {isStaking ? `${claimable} $BLD earned` : "earn $BLD by staking"}
    </Text>
    </VStack>
    <Button
    onClick={isStaking ? handleClaim : handleStake}
    bgColor="buttonGreen"
    width="200px"
    >
    <Text as="b">{isStaking ? "claim $BLD" : "stake buildoor"}</Text>
    </Button>
    {isStaking ? <Button onClick={handleUnstake}>unstake</Button> : null}
    </VStack>
    )
    }
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/testing/index.html b/Solana-Co-Learn/module4/testing/index.html index 6f2bf7af5..a0f4292e3 100644 --- a/Solana-Co-Learn/module4/testing/index.html +++ b/Solana-Co-Learn/module4/testing/index.html @@ -5,13 +5,13 @@ 测试 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/testing/testing-solana-programs/index.html b/Solana-Co-Learn/module4/testing/testing-solana-programs/index.html index 91a5f657b..e80c40e7b 100644 --- a/Solana-Co-Learn/module4/testing/testing-solana-programs/index.html +++ b/Solana-Co-Learn/module4/testing/testing-solana-programs/index.html @@ -5,13 +5,13 @@ 🧪 测试 Solana 程序 | All in One Solana - +
    -
    Skip to main content

    🧪 测试 Solana 程序

    上节课的内容为准备 Mint 账户奠定了基础。预备阶段已完结,现在是真正行动的时候了。通过强大的测试流程,我们可以在问题真正显现之前捕捉开发人员引入的错误,从而最大限度地减少生产环境中的 bug 数量。

    本课程将涉及两种类型的测试:单元测试和集成测试。

    • 单元测试更小、更专注,一次只测试一个隔离的模块,并能测试私有接口。
    • 集成测试与你的库完全外部无关,使用你的代码的方式与使用其他外部代码相同,仅使用公共接口,并可能在每个测试中涉及多个模块。

    🔢 单元测试

    单元测试的目的是隔离其他代码,测试每个代码单元的工作情况,以快速确认代码是否按预期执行。

    Rust 中,单元测试通常与它们所测试的代码放置在同一文件中,并在名为 tests 的模块内声明,该模块带有 cfg(test) 的注解。

    • 通过 #[test] 属性在 tests 模块中定义测试。
    • cfg 属性代表配置,指示 Rust 只有在特定配置下才包含随后的代码。
    • #[cfg(test)] 注解告诉 Cargo 只有在运行 cargo test-sbf 时才编译测试代码。
    • 运行 cargo test-sbf 时,该模块中标记为测试的每个函数都会执行。

    你还可以在模块中创建非测试的辅助函数,例如:

    // 示例测试模块,包含一个单元测试
    #[cfg(test)]
    mod tests {
    #[test]
    fn it_works() {
    let result = 2 + 2;
    assert_eq!(result, 4);
    }

    fn helper_function() {
    doSomething()
    }
    }

    ❓ 如何构建单元测试

    使用 solana_sdk 来创建 Solana 程序的单元测试。这个 crateRust 中与 Typescript@solana/web3.js 包相对应。

    solana_program_test 也用于测试 Solana 程序,并包含一个基于 BanksClient 的测试框架。

    在下面的代码片段中,我们为我们的 program_id 创建了一个公钥,然后初始化了一个 ProgramTest 对象。

    banks_client 返回的 ProgramTest 将作为我们进入测试环境的接口。

    其中,payer 变量是使用 SOL 生成的新密钥对,将用于签名和支付交易。

    接着,我们创建一个第二个 Keypair,并使用合适的参数构建我们的 Transaction

    最后,我们使用 ProgramTest::new 调用时返回的 banks_client 来处理此交易,并检查返回值是否等于 Ok(_)

    该函数使用 #[tokio::test] 属性进行注解。

    Tokio 是一个用于编写异步代码的 Rust crate,该属性仅将我们的测试函数标记为 async

    // 位于 processor.rs 内部的测试模块
    #[cfg(test)]
    mod tests {
    use {
    super::*,
    assert_matches::*,
    solana_program::instruction::{AccountMeta, Instruction},
    solana_program_test::*,
    solana_sdk::{signature::Signer, transaction::Transaction, signer::keypair::Keypair},
    };

    #[tokio::test]
    async fn it_works() {
    let program_id = Pubkey::new_unique();

    let (mut banks_client, payer, recent_blockhash) = ProgramTest::new(
    "program_name",
    program_id,
    processor!(process_instruction),
    )
    .start()
    .await;

    let test_acct = Keypair::new();

    let mut transaction = Transaction::new_with_payer(
    &[Instruction {
    program_id,
    accounts: vec![
    AccountMeta::new(payer.pubkey(), true),
    AccountMeta::new(test_acct.pubkey(), true)
    ],
    data: vec![1, 2, 3],
    }],
    Some(&payer.pubkey()),
    );
    transaction.sign(&[&payer, &test_acct], recent_blockhash);

    assert_matches!(banks_client.process_transaction(transaction).await, Ok(_));
    }
    }

    集成测试

    集成测试旨在完全与其测试的代码分离,以验证不同代码部分是否能够协同工作。

    这些测试通过公共接口与你的代码进行交互,确保其他人能够按预期的方式访问它。虽然在单独运行时正常工作的代码单元可能在集成时出现问题,因此对集成代码的测试覆盖范围同样重要。

    ❓ 如何构建集成测试

    1. 创建集成测试目录: 在项目目录的顶层创建一个 tests 目录,在这个目录下创建任意数量的测试文件,每个文件都作为独立的集成测试。

    2. 独立测试: tests 目录中的每个文件都是一个独立的crate,因此我们需要将我们想要测试的代码库引入每个文件的作用域。

    3. 编写集成测试: 集成测试示例如下:

      // Example of integration test inside /tests/integration_test.rs file
      use example_lib;

      #[test]
      fn it_adds_two() {
      assert_eq!(4, example_lib::add_two(2));
      }
    4. 运行集成测试: 运行 cargo test-bpf 命令即可执行编写的测试。

    5. 输出包括三个部分: 单元测试、集成测试和文档测试。

    🔌 使用Typescript进行集成测试

    除了Rust集成测试外,还可以通过将程序部署到Devnet或本地验证器,并从你创建的客户端向其发送交易来进行测试。

    使用Typescript编写客户端测试脚本的步骤:

    1. 安装测试框架: 使用 npm install mocha chai 安装 MochaChai

    2. 更新package.json文件: 这会告诉编译器在运行命令 npm run test 时执行 /test 目录中的TypeScript文件或文件。

    3. 编写测试代码: 使用“describe”关键字声明,并用it指定每个测试。

      describe("begin tests", async () => {
      // First Mocha test
      it('first test', async () => {
      // Initialization code here to send the transaction
      ...
      // Fetch account info and deserialize
      const acct_info = await connection.getAccountInfo(pda)
      const acct = acct_struct.decode(acct_info.data)

      // Compare the value in the account to what you expect it to be
      chai.expect(acct.num).to.equal(1)
      }
      })
    4. 运行测试: 执行 npm run test 将执行所有测试,并返回每个测试是否通过或失败的结果。

    通过将测试集成到你的开发过程中,你可以确保代码质量和稳定性,同时减少未来可能出现的问题。在Solana开发中,这样的测试流程更是不可或缺的一环。

    > scripts@1.0.0 test
    > mocha -r ts-node/register ./test/*.ts

    ✔ first test (1308ms)
    ✔ second test

    2 passing (1s)

    ❌ 错误代码

    程序错误通常显示为程序返回的错误枚举中错误的十进制索引的十六进制形式。

    例如,当你在向SPL代币程序发送交易时遇到错误,错误代码 0x01 的十进制等价物就是1

    通过查看Token程序的源代码,我们能发现程序错误枚举中该索引位置的错误为 InsufficientFunds

    要翻译任何返回自定义程序错误代码的程序,你需要能访问其源代码。

    📜 程序日志

    Solana提供了非常简单的创建新自定义日志的方法,只需使用 msg!() 宏。

    Rust中编写单元测试时,请注意测试本身不能使用 msg!() 宏来记录信息。

    你需要使用Rust的本地 println!() 宏。

    程序代码中的该语句仍然有效,只是你不能在测试中使用它进行日志记录。

    🧮 计算预算

    开发区块链上的程序会遇到一些特殊限制,其中之一就是Solana上的计算预算。

    计算预算的目的在于防止程序滥用资源。

    当程序消耗完整个预算或超出限制时,运行时会终止程序并返回错误。

    默认情况下,计算预算被设置为200k计算单元乘以指令数量,最多不超过1.4M计算单元。

    基础费用为5,000 Lamports。一个微Lamport相当于0.000001 Lamports

    你可以使用 ComputeBudgetProgram.setComputeUnitLimit({ units: number }) 来设置新的计算预算。

    ComputeBudgetProgram.setComputeUnitPrice({ microLamports: number }) 可以将交易费用提高到基本费用(5,000 Lamports)之上。

    • 以微Lamports为单位的价值将乘以CU预算,从而确定Lamports中的优先费用。
    • 例如,如果你的CU预算为1M CU,并且你每CU增加了1Lamport,那么优先费用将为1 Lamport(1M * 0.000001)
    • 总费用将达到5001 Lamports

    要更改交易的计算预算,你必须将交易的前三条指令之一设置为预算设置指令。

    const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({
    units: 1000000
    });

    const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({
    microLamports: 1
    });

    const transaction = new Transaction()
    .add(modifyComputeUnits)
    .add(addPriorityFee)
    .add(
    SystemProgram.transfer({
    fromPubkey: payer.publicKey,
    toPubkey: toAccount,
    lamports: 10000000,
    })
    );

    你还可以使用 sol_log_compute_units() 函数来打印当前指令中程序剩余的计算单元数量。

    use solana_program::log::sol_log_compute_units;

    pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8],
    ) -> ProgramResult {

    sol_log_compute_units();

    ...
    }

    📦 堆栈大小

    每个程序在执行过程中都可以访问4KB的堆栈帧大小。在Rust中,所有值默认都在栈上分配。

    在像Rust这样的系统编程语言中,一个值是在栈上还是堆上分配的区别可能很重要,特别是在受限制的环境中,如区块链工作场景。

    当你处理更大、更复杂的程序时,可能会开始遇到使用完整4KB内存的问题。

    这通常称为"堆栈溢出"或"栈溢出"。

    程序可能会以两种方式达到堆栈限制:

    • 一些依赖的包可能包含违反堆栈帧限制的功能;
    • 或者程序本身在运行时达到堆栈限制。

    以下是当堆栈违规由依赖包引起时,可能出现的错误消息示例。

    Error: Function _ZN16curve25519_dalek7edwards21EdwardsBasepointTable6create17h178b3d2411f7f082E Stack offset of -30728 exceeded max offset of -4096 by 26632 bytes, please minimize large stack variables

    如果一个程序在运行时达到了4KB的堆栈限制,它将停止运行并返回一个错误:AccessViolation

    Program failed to complete: Access violation in stack frame 3 at address 0x200003f70 of size 8 by instruction #5128

    为了解决这个问题,你可以重构代码以更节省内存,或者将一部分内存分配到堆上。

    所有程序都可以访问一个32KB的运行时堆,这可以帮助你在堆栈上节省一些内存。

    为了实现这一点,你需要使用Box结构体。

    一个 box 是一个指向堆上类型为 T 的值的智能指针。

    你可以使用解引用运算符来访问封装的值。

    在下面的示例中,从Pubkey::create_program_address返回的值(一个公钥)将存储在堆上,而authority_pubkey变量则会持有指向堆上存储公钥位置的指针。

    let authority_pubkey = Box::new(Pubkey::create_program_address(authority_signer_seeds, program_id)?);

    if *authority_pubkey != *authority_info.key {
    msg!("Derived lending market authority {} does not match the lending market authority provided {}");
    return Err();
    }

    通过这样的调整,代码不仅可以避免堆栈溢出问题,还能使整体结构更加清晰合理。

    - +
    Skip to main content

    🧪 测试 Solana 程序

    上节课的内容为准备 Mint 账户奠定了基础。预备阶段已完结,现在是真正行动的时候了。通过强大的测试流程,我们可以在问题真正显现之前捕捉开发人员引入的错误,从而最大限度地减少生产环境中的 bug 数量。

    本课程将涉及两种类型的测试:单元测试和集成测试。

    • 单元测试更小、更专注,一次只测试一个隔离的模块,并能测试私有接口。
    • 集成测试与你的库完全外部无关,使用你的代码的方式与使用其他外部代码相同,仅使用公共接口,并可能在每个测试中涉及多个模块。

    🔢 单元测试

    单元测试的目的是隔离其他代码,测试每个代码单元的工作情况,以快速确认代码是否按预期执行。

    Rust 中,单元测试通常与它们所测试的代码放置在同一文件中,并在名为 tests 的模块内声明,该模块带有 cfg(test) 的注解。

    • 通过 #[test] 属性在 tests 模块中定义测试。
    • cfg 属性代表配置,指示 Rust 只有在特定配置下才包含随后的代码。
    • #[cfg(test)] 注解告诉 Cargo 只有在运行 cargo test-sbf 时才编译测试代码。
    • 运行 cargo test-sbf 时,该模块中标记为测试的每个函数都会执行。

    你还可以在模块中创建非测试的辅助函数,例如:

    // 示例测试模块,包含一个单元测试
    #[cfg(test)]
    mod tests {
    #[test]
    fn it_works() {
    let result = 2 + 2;
    assert_eq!(result, 4);
    }

    fn helper_function() {
    doSomething()
    }
    }

    ❓ 如何构建单元测试

    使用 solana_sdk 来创建 Solana 程序的单元测试。这个 crateRust 中与 Typescript@solana/web3.js 包相对应。

    solana_program_test 也用于测试 Solana 程序,并包含一个基于 BanksClient 的测试框架。

    在下面的代码片段中,我们为我们的 program_id 创建了一个公钥,然后初始化了一个 ProgramTest 对象。

    banks_client 返回的 ProgramTest 将作为我们进入测试环境的接口。

    其中,payer 变量是使用 SOL 生成的新密钥对,将用于签名和支付交易。

    接着,我们创建一个第二个 Keypair,并使用合适的参数构建我们的 Transaction

    最后,我们使用 ProgramTest::new 调用时返回的 banks_client 来处理此交易,并检查返回值是否等于 Ok(_)

    该函数使用 #[tokio::test] 属性进行注解。

    Tokio 是一个用于编写异步代码的 Rust crate,该属性仅将我们的测试函数标记为 async

    // 位于 processor.rs 内部的测试模块
    #[cfg(test)]
    mod tests {
    use {
    super::*,
    assert_matches::*,
    solana_program::instruction::{AccountMeta, Instruction},
    solana_program_test::*,
    solana_sdk::{signature::Signer, transaction::Transaction, signer::keypair::Keypair},
    };

    #[tokio::test]
    async fn it_works() {
    let program_id = Pubkey::new_unique();

    let (mut banks_client, payer, recent_blockhash) = ProgramTest::new(
    "program_name",
    program_id,
    processor!(process_instruction),
    )
    .start()
    .await;

    let test_acct = Keypair::new();

    let mut transaction = Transaction::new_with_payer(
    &[Instruction {
    program_id,
    accounts: vec![
    AccountMeta::new(payer.pubkey(), true),
    AccountMeta::new(test_acct.pubkey(), true)
    ],
    data: vec![1, 2, 3],
    }],
    Some(&payer.pubkey()),
    );
    transaction.sign(&[&payer, &test_acct], recent_blockhash);

    assert_matches!(banks_client.process_transaction(transaction).await, Ok(_));
    }
    }

    集成测试

    集成测试旨在完全与其测试的代码分离,以验证不同代码部分是否能够协同工作。

    这些测试通过公共接口与你的代码进行交互,确保其他人能够按预期的方式访问它。虽然在单独运行时正常工作的代码单元可能在集成时出现问题,因此对集成代码的测试覆盖范围同样重要。

    ❓ 如何构建集成测试

    1. 创建集成测试目录: 在项目目录的顶层创建一个 tests 目录,在这个目录下创建任意数量的测试文件,每个文件都作为独立的集成测试。

    2. 独立测试: tests 目录中的每个文件都是一个独立的crate,因此我们需要将我们想要测试的代码库引入每个文件的作用域。

    3. 编写集成测试: 集成测试示例如下:

      // Example of integration test inside /tests/integration_test.rs file
      use example_lib;

      #[test]
      fn it_adds_two() {
      assert_eq!(4, example_lib::add_two(2));
      }
    4. 运行集成测试: 运行 cargo test-bpf 命令即可执行编写的测试。

    5. 输出包括三个部分: 单元测试、集成测试和文档测试。

    🔌 使用Typescript进行集成测试

    除了Rust集成测试外,还可以通过将程序部署到Devnet或本地验证器,并从你创建的客户端向其发送交易来进行测试。

    使用Typescript编写客户端测试脚本的步骤:

    1. 安装测试框架: 使用 npm install mocha chai 安装 MochaChai

    2. 更新package.json文件: 这会告诉编译器在运行命令 npm run test 时执行 /test 目录中的TypeScript文件或文件。

    3. 编写测试代码: 使用“describe”关键字声明,并用it指定每个测试。

      describe("begin tests", async () => {
      // First Mocha test
      it('first test', async () => {
      // Initialization code here to send the transaction
      ...
      // Fetch account info and deserialize
      const acct_info = await connection.getAccountInfo(pda)
      const acct = acct_struct.decode(acct_info.data)

      // Compare the value in the account to what you expect it to be
      chai.expect(acct.num).to.equal(1)
      }
      })
    4. 运行测试: 执行 npm run test 将执行所有测试,并返回每个测试是否通过或失败的结果。

    通过将测试集成到你的开发过程中,你可以确保代码质量和稳定性,同时减少未来可能出现的问题。在Solana开发中,这样的测试流程更是不可或缺的一环。

    > scripts@1.0.0 test
    > mocha -r ts-node/register ./test/*.ts

    ✔ first test (1308ms)
    ✔ second test

    2 passing (1s)

    ❌ 错误代码

    程序错误通常显示为程序返回的错误枚举中错误的十进制索引的十六进制形式。

    例如,当你在向SPL代币程序发送交易时遇到错误,错误代码 0x01 的十进制等价物就是1

    通过查看Token程序的源代码,我们能发现程序错误枚举中该索引位置的错误为 InsufficientFunds

    要翻译任何返回自定义程序错误代码的程序,你需要能访问其源代码。

    📜 程序日志

    Solana提供了非常简单的创建新自定义日志的方法,只需使用 msg!() 宏。

    Rust中编写单元测试时,请注意测试本身不能使用 msg!() 宏来记录信息。

    你需要使用Rust的本地 println!() 宏。

    程序代码中的该语句仍然有效,只是你不能在测试中使用它进行日志记录。

    🧮 计算预算

    开发区块链上的程序会遇到一些特殊限制,其中之一就是Solana上的计算预算。

    计算预算的目的在于防止程序滥用资源。

    当程序消耗完整个预算或超出限制时,运行时会终止程序并返回错误。

    默认情况下,计算预算被设置为200k计算单元乘以指令数量,最多不超过1.4M计算单元。

    基础费用为5,000 Lamports。一个微Lamport相当于0.000001 Lamports

    你可以使用 ComputeBudgetProgram.setComputeUnitLimit({ units: number }) 来设置新的计算预算。

    ComputeBudgetProgram.setComputeUnitPrice({ microLamports: number }) 可以将交易费用提高到基本费用(5,000 Lamports)之上。

    • 以微Lamports为单位的价值将乘以CU预算,从而确定Lamports中的优先费用。
    • 例如,如果你的CU预算为1M CU,并且你每CU增加了1Lamport,那么优先费用将为1 Lamport(1M * 0.000001)
    • 总费用将达到5001 Lamports

    要更改交易的计算预算,你必须将交易的前三条指令之一设置为预算设置指令。

    const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({
    units: 1000000
    });

    const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({
    microLamports: 1
    });

    const transaction = new Transaction()
    .add(modifyComputeUnits)
    .add(addPriorityFee)
    .add(
    SystemProgram.transfer({
    fromPubkey: payer.publicKey,
    toPubkey: toAccount,
    lamports: 10000000,
    })
    );

    你还可以使用 sol_log_compute_units() 函数来打印当前指令中程序剩余的计算单元数量。

    use solana_program::log::sol_log_compute_units;

    pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8],
    ) -> ProgramResult {

    sol_log_compute_units();

    ...
    }

    📦 堆栈大小

    每个程序在执行过程中都可以访问4KB的堆栈帧大小。在Rust中,所有值默认都在栈上分配。

    在像Rust这样的系统编程语言中,一个值是在栈上还是堆上分配的区别可能很重要,特别是在受限制的环境中,如区块链工作场景。

    当你处理更大、更复杂的程序时,可能会开始遇到使用完整4KB内存的问题。

    这通常称为"堆栈溢出"或"栈溢出"。

    程序可能会以两种方式达到堆栈限制:

    • 一些依赖的包可能包含违反堆栈帧限制的功能;
    • 或者程序本身在运行时达到堆栈限制。

    以下是当堆栈违规由依赖包引起时,可能出现的错误消息示例。

    Error: Function _ZN16curve25519_dalek7edwards21EdwardsBasepointTable6create17h178b3d2411f7f082E Stack offset of -30728 exceeded max offset of -4096 by 26632 bytes, please minimize large stack variables

    如果一个程序在运行时达到了4KB的堆栈限制,它将停止运行并返回一个错误:AccessViolation

    Program failed to complete: Access violation in stack frame 3 at address 0x200003f70 of size 8 by instruction #5128

    为了解决这个问题,你可以重构代码以更节省内存,或者将一部分内存分配到堆上。

    所有程序都可以访问一个32KB的运行时堆,这可以帮助你在堆栈上节省一些内存。

    为了实现这一点,你需要使用Box结构体。

    一个 box 是一个指向堆上类型为 T 的值的智能指针。

    你可以使用解引用运算符来访问封装的值。

    在下面的示例中,从Pubkey::create_program_address返回的值(一个公钥)将存储在堆上,而authority_pubkey变量则会持有指向堆上存储公钥位置的指针。

    let authority_pubkey = Box::new(Pubkey::create_program_address(authority_signer_seeds, program_id)?);

    if *authority_pubkey != *authority_info.key {
    msg!("Derived lending market authority {} does not match the lending market authority provided {}");
    return Err();
    }

    通过这样的调整,代码不仅可以避免堆栈溢出问题,还能使整体结构更加清晰合理。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module4/testing/writing-tests-in-rust/index.html b/Solana-Co-Learn/module4/testing/writing-tests-in-rust/index.html index b78f14225..4545bb5f5 100644 --- a/Solana-Co-Learn/module4/testing/writing-tests-in-rust/index.html +++ b/Solana-Co-Learn/module4/testing/writing-tests-in-rust/index.html @@ -5,13 +5,13 @@ 😳 使用Rust编写测试 | All in One Solana - +
    -
    Skip to main content

    😳 使用Rust编写测试

    上一节课我们已经为MINT账户做好了准备。预热阶段已经结束,现在是正式开始的时候了。让我们为我们心爱的电影评论程序编写测试吧。

    设置 - 入门:https://github.com/buildspace/solana-movie-program/tree/solution-add-tokens

    • Cargo.toml 文件中添加:
    [dev-dependencies]
    assert_matches = "1.4.0"
    solana-program-test = "~1.10.29"
    solana-sdk = "~1.10.29"

    初始化测试框架

    • processor.rs 文件底部添加:
    // Inside processor.rs
    #[cfg(test)]
    mod tests {
    use {
    super::*,
    assert_matches::*,
    solana_program::{
    instruction::{AccountMeta, Instruction},
    system_program::ID as SYSTEM_PROGRAM_ID,
    },
    solana_program_test::*,
    solana_sdk::{
    signature::Signer,
    transaction::Transaction,
    sysvar::rent::ID as SYSVAR_RENT_ID
    },
    spl_associated_token_account::{
    get_associated_token_address,
    instruction::create_associated_token_account,
    },
    spl_token:: ID as TOKEN_PROGRAM_ID,
    };
    }

    辅助函数

    • 创建用于初始化铸币的辅助函数。
    • 在测试模块中添加一个函数,这样你可以在需要时调用它。
    // 在测试模块内部
    fn create_init_mint_ix(payer: Pubkey, program_id: Pubkey) -> (Pubkey, Pubkey, Instruction) {
    // 导出用于token mint授权的PDA
    let (mint, _bump_seed) = Pubkey::find_program_address(&[b"token_mint"], &program_id);
    let (mint_auth, _bump_seed) = Pubkey::find_program_address(&[b"token_auth"], &program_id);

    let init_mint_ix = Instruction {
    program_id: program_id,
    accounts: vec![
    AccountMeta::new_readonly(payer, true),
    AccountMeta::new(mint, false),
    AccountMeta::new(mint_auth, false),
    AccountMeta::new_readonly(SYSTEM_PROGRAM_ID, false),
    AccountMeta::new_readonly(TOKEN_PROGRAM_ID, false),
    AccountMeta::new_readonly(SYSVAR_RENT_ID, false)
    ],
    data: vec![3]
    };

    (mint, mint_auth, init_mint_ix)
    }

    初始化铸币测试

    • 测试 initialize_token_mint 指令。
    • 我们的辅助函数将返回一个元组。
    • 我们可以使用解构来获取我们所需的值:
      • mint pubkey
      • mint_auth pubkey
      • 相应的Instruction
    • 一旦指令组装完成,我们可以将其添加到 Transaction 中,并使用从 ProgramTest 构造函数生成的 banks_client 来处理它。
    • 使用 assert_matches! 宏来确认测试是否通过。
    // 第一个单元测试
    #[tokio::test]
    async fn test_initialize_mint_instruction() {
    let program_id = Pubkey::new_unique();
    let (mut banks_client, payer, recent_blockhash) = ProgramTest::new(
    "pda_local",
    program_id,
    processor!(process_instruction),
    )
    .start()
    .await;

    // 调用辅助函数
    let (_mint, _mint_auth, init_mint_ix) = create_init_mint_ix(payer.pubkey(), program_id);

    // 创建具有指令、帐户和输入数据的交易对象
    let mut transaction = Transaction::new_with_payer(
    &[init_mint_ix,],
    Some(&payer.pubkey()),
    );
    transaction.sign(&[&payer], recent_blockhash);

    // 处理交易并比较结果
    assert_matches!(banks_client.process_transaction(transaction).await, Ok(_));
    }

    添加电影评论测试

    • 测试 add_movie_review 指令设置:
    // 第二个单元测试
    #[tokio::test]
    async fn test_add_movie_review_instruction() {
    let program_id = Pubkey::new_unique();
    let (mut banks_client, payer, recent_blockhash) = ProgramTest::new(
    "pda_local",
    program_id,
    processor!(process_instruction),
    )
    .start()
    .await;

    // 调用辅助函数
    let (mint, mint_auth, init_mint_ix) = create_init_mint_ix(payer.pubkey(), program_id);

    }
    • 在第二个测试中推导出PDA
      • 导出评论,
      • 评论计数器,
      • 用户关联的令牌账户地址。
    // 创建评论PDA
    let title: String = "Captain America".to_owned();
    const RATING: u8 = 3;
    let review: String = "Liked the movie".to_owned();
    let (review_pda, _bump_seed) =
    Pubkey::find_program_address(&[payer.pubkey().as_ref(), title.as_bytes()], &program_id);

    // 创建评论计数器PDA
    let (comment_pda, _bump_seed) =
    Pubkey::find_program_address(&[review_pda.as_ref(), b"comment"], &program_id);

    // 创建与token mint关联的用户令牌账户
    let init_ata_ix: Instruction = create_associated_token_account(
    &payer.pubkey(),
    &payer.pubkey(),
    &mint,
    );

    let user_ata: Pubkey =
    get_associated_token_address(&payer.pubkey(), &mint);
    • 构建交易(仍在第二次测试中):
    // 将数据连接到单个缓冲区
    let mut data_vec = vec![0];
    data_vec.append(&mut (title.len().try_into().unwrap().to_le_bytes().try_into().unwrap()));
    data_vec.append(&mut title.into_bytes());
    data_vec.push(RATING);
    data_vec.append(&mut (review.len().try_into().unwrap().to_le_bytes().try_into().unwrap()));
    data_vec.append(&mut review.into_bytes());

    // 创建具有指令、帐户和输入数据的交易对象
    let mut transaction = Transaction::new_with_payer(
    &[
    init_mint_ix,
    init_ata_ix,
    Instruction {
    program_id: program_id,
    accounts: vec![
    AccountMeta::new_readonly(payer.pubkey(), true),
    AccountMeta::new(review_pda, false),
    AccountMeta::new(comment_pda, false),
    AccountMeta::new(mint, false),
    AccountMeta::new_readonly(mint_auth, false),
    AccountMeta::new(user_ata, false),
    AccountMeta::new_readonly(SYSTEM_PROGRAM_ID, false),
    AccountMeta::new_readonly(TOKEN_PROGRAM_ID, false),
    ],
    data: data_vec,
    },
    ],
    Some(&payer.pubkey()),
    );
    transaction.sign(&[&payer], recent_blockhash);

    // 处理交易并比较结果
    assert_matches!(banks_client.process_transaction(transaction).await, Ok(_));
    • 使用 cargo test-sbf 命令运行这些测试

    🚢 挑战

    既然你已经掌握了如何在Rust中编写单元测试,那就不妨继续添加一些你认为对电影评论或学生介绍程序功能至关重要的测试。

    如果你想进一步挑战自己,还可以尝试添加一些TypeScript的集成测试。虽然我们没有一起走过这些步骤,但尝试一下肯定不会错!

    随着你在项目中的进展,一些挑战可能会变得更加开放,从而让你能够根据自己的需求推动自己前进。不要滥用这个机会,而是把它看作提升学习效果的机会。

    - +
    Skip to main content

    😳 使用Rust编写测试

    上一节课我们已经为MINT账户做好了准备。预热阶段已经结束,现在是正式开始的时候了。让我们为我们心爱的电影评论程序编写测试吧。

    设置 - 入门:https://github.com/buildspace/solana-movie-program/tree/solution-add-tokens

    • Cargo.toml 文件中添加:
    [dev-dependencies]
    assert_matches = "1.4.0"
    solana-program-test = "~1.10.29"
    solana-sdk = "~1.10.29"

    初始化测试框架

    • processor.rs 文件底部添加:
    // Inside processor.rs
    #[cfg(test)]
    mod tests {
    use {
    super::*,
    assert_matches::*,
    solana_program::{
    instruction::{AccountMeta, Instruction},
    system_program::ID as SYSTEM_PROGRAM_ID,
    },
    solana_program_test::*,
    solana_sdk::{
    signature::Signer,
    transaction::Transaction,
    sysvar::rent::ID as SYSVAR_RENT_ID
    },
    spl_associated_token_account::{
    get_associated_token_address,
    instruction::create_associated_token_account,
    },
    spl_token:: ID as TOKEN_PROGRAM_ID,
    };
    }

    辅助函数

    • 创建用于初始化铸币的辅助函数。
    • 在测试模块中添加一个函数,这样你可以在需要时调用它。
    // 在测试模块内部
    fn create_init_mint_ix(payer: Pubkey, program_id: Pubkey) -> (Pubkey, Pubkey, Instruction) {
    // 导出用于token mint授权的PDA
    let (mint, _bump_seed) = Pubkey::find_program_address(&[b"token_mint"], &program_id);
    let (mint_auth, _bump_seed) = Pubkey::find_program_address(&[b"token_auth"], &program_id);

    let init_mint_ix = Instruction {
    program_id: program_id,
    accounts: vec![
    AccountMeta::new_readonly(payer, true),
    AccountMeta::new(mint, false),
    AccountMeta::new(mint_auth, false),
    AccountMeta::new_readonly(SYSTEM_PROGRAM_ID, false),
    AccountMeta::new_readonly(TOKEN_PROGRAM_ID, false),
    AccountMeta::new_readonly(SYSVAR_RENT_ID, false)
    ],
    data: vec![3]
    };

    (mint, mint_auth, init_mint_ix)
    }

    初始化铸币测试

    • 测试 initialize_token_mint 指令。
    • 我们的辅助函数将返回一个元组。
    • 我们可以使用解构来获取我们所需的值:
      • mint pubkey
      • mint_auth pubkey
      • 相应的Instruction
    • 一旦指令组装完成,我们可以将其添加到 Transaction 中,并使用从 ProgramTest 构造函数生成的 banks_client 来处理它。
    • 使用 assert_matches! 宏来确认测试是否通过。
    // 第一个单元测试
    #[tokio::test]
    async fn test_initialize_mint_instruction() {
    let program_id = Pubkey::new_unique();
    let (mut banks_client, payer, recent_blockhash) = ProgramTest::new(
    "pda_local",
    program_id,
    processor!(process_instruction),
    )
    .start()
    .await;

    // 调用辅助函数
    let (_mint, _mint_auth, init_mint_ix) = create_init_mint_ix(payer.pubkey(), program_id);

    // 创建具有指令、帐户和输入数据的交易对象
    let mut transaction = Transaction::new_with_payer(
    &[init_mint_ix,],
    Some(&payer.pubkey()),
    );
    transaction.sign(&[&payer], recent_blockhash);

    // 处理交易并比较结果
    assert_matches!(banks_client.process_transaction(transaction).await, Ok(_));
    }

    添加电影评论测试

    • 测试 add_movie_review 指令设置:
    // 第二个单元测试
    #[tokio::test]
    async fn test_add_movie_review_instruction() {
    let program_id = Pubkey::new_unique();
    let (mut banks_client, payer, recent_blockhash) = ProgramTest::new(
    "pda_local",
    program_id,
    processor!(process_instruction),
    )
    .start()
    .await;

    // 调用辅助函数
    let (mint, mint_auth, init_mint_ix) = create_init_mint_ix(payer.pubkey(), program_id);

    }
    • 在第二个测试中推导出PDA
      • 导出评论,
      • 评论计数器,
      • 用户关联的令牌账户地址。
    // 创建评论PDA
    let title: String = "Captain America".to_owned();
    const RATING: u8 = 3;
    let review: String = "Liked the movie".to_owned();
    let (review_pda, _bump_seed) =
    Pubkey::find_program_address(&[payer.pubkey().as_ref(), title.as_bytes()], &program_id);

    // 创建评论计数器PDA
    let (comment_pda, _bump_seed) =
    Pubkey::find_program_address(&[review_pda.as_ref(), b"comment"], &program_id);

    // 创建与token mint关联的用户令牌账户
    let init_ata_ix: Instruction = create_associated_token_account(
    &payer.pubkey(),
    &payer.pubkey(),
    &mint,
    );

    let user_ata: Pubkey =
    get_associated_token_address(&payer.pubkey(), &mint);
    • 构建交易(仍在第二次测试中):
    // 将数据连接到单个缓冲区
    let mut data_vec = vec![0];
    data_vec.append(&mut (title.len().try_into().unwrap().to_le_bytes().try_into().unwrap()));
    data_vec.append(&mut title.into_bytes());
    data_vec.push(RATING);
    data_vec.append(&mut (review.len().try_into().unwrap().to_le_bytes().try_into().unwrap()));
    data_vec.append(&mut review.into_bytes());

    // 创建具有指令、帐户和输入数据的交易对象
    let mut transaction = Transaction::new_with_payer(
    &[
    init_mint_ix,
    init_ata_ix,
    Instruction {
    program_id: program_id,
    accounts: vec![
    AccountMeta::new_readonly(payer.pubkey(), true),
    AccountMeta::new(review_pda, false),
    AccountMeta::new(comment_pda, false),
    AccountMeta::new(mint, false),
    AccountMeta::new_readonly(mint_auth, false),
    AccountMeta::new(user_ata, false),
    AccountMeta::new_readonly(SYSTEM_PROGRAM_ID, false),
    AccountMeta::new_readonly(TOKEN_PROGRAM_ID, false),
    ],
    data: data_vec,
    },
    ],
    Some(&payer.pubkey()),
    );
    transaction.sign(&[&payer], recent_blockhash);

    // 处理交易并比较结果
    assert_matches!(banks_client.process_transaction(transaction).await, Ok(_));
    • 使用 cargo test-sbf 命令运行这些测试

    🚢 挑战

    既然你已经掌握了如何在Rust中编写单元测试,那就不妨继续添加一些你认为对电影评论或学生介绍程序功能至关重要的测试。

    如果你想进一步挑战自己,还可以尝试添加一些TypeScript的集成测试。虽然我们没有一起走过这些步骤,但尝试一下肯定不会错!

    随着你在项目中的进展,一些挑战可能会变得更加开放,从而让你能够根据自己的需求推动自己前进。不要滥用这个机会,而是把它看作提升学习效果的机会。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/a-full-stack-anchor-app/build-the-front-end/index.html b/Solana-Co-Learn/module5/a-full-stack-anchor-app/build-the-front-end/index.html index 43b71ee47..adfadc835 100644 --- a/Solana-Co-Learn/module5/a-full-stack-anchor-app/build-the-front-end/index.html +++ b/Solana-Co-Learn/module5/a-full-stack-anchor-app/build-the-front-end/index.html @@ -5,13 +5,13 @@ 🏬 前端开发 | All in One Solana - +
    -
    Skip to main content

    🏬 前端开发

    既然程序已经运行起来了,现在我们来进入前端代码的部分,为Anchor做适当的调整。整个设置过程只需一分钟,稍作等待,我们还会有一些修改要做。

    首先,我们需要从程序中引入IDL文件。你可以直接将整个文件复制并粘贴到utils文件夹中,包括JSONTypeScript格式。

    然后,创建一个名为WorkspaceProvider.ts的新组件文件。为了节省时间,我们可以直接从我们之前构建的电影评论前端中复制粘贴这段代码,然后将所有的"电影评论"实例替换为"Anchor NFT质押"。你会注意到我们正在从常量文件夹中导入PROGRAM_IDs,所以请进入该文件夹并确保程序ID是我们Anchor NFT质押程序的新ID(而非我们Solana原生程序的ID)。

    import { createContext, useContext } from "react"
    import {
    Program,
    AnchorProvider,
    Idl,
    setProvider,
    } from "@project-serum/anchor"
    import { AnchorNftStaking, IDL } from "../utils/anchor_nft_staking"
    import { Connection } from "@solana/web3.js"
    import { useAnchorWallet, useConnection } from "@solana/wallet-adapter-react"
    import { PROGRAM_ID } from "../utils/constants"

    const WorkspaceContext = createContext({})
    const programId = PROGRAM_ID

    interface Workspace {
    connection?: Connection
    provider?: AnchorProvider
    program?: Program<AnchorNftStaking>
    }

    const WorkspaceProvider = ({ children }: any) => {
    const wallet = useAnchorWallet() || MockWallet
    const { connection } = useConnection()

    const provider = new AnchorProvider(connection, wallet, {})
    setProvider(provider)

    const program = new Program(IDL as Idl, programId)
    const workspace = {
    connection,
    provider,
    program,
    }

    return (
    <WorkspaceContext.Provider value={workspace}>
    {children}
    </WorkspaceContext.Provider>
    )
    }

    const useWorkspace = (): Workspace => {
    return useContext(WorkspaceContext)
    }

    import { Keypair } from "@solana/web3.js"

    const MockWallet = {
    publicKey: Keypair.generate().publicKey,
    signTransaction: () => Promise.reject(),
    signAllTransactions: () => Promise.reject(),
    }

    export { WorkspaceProvider, useWorkspace }

    另外,请从电影评论项目中复制模拟钱包文件,或者创建一个名为MockWallet.ts的新组件,并粘贴下面的代码。

    import { Keypair } from "@solana/web3.js"

    const MockWallet = {
    publicKey: Keypair.generate().publicKey,
    signTransaction: () => Promise.reject(),
    signAllTransactions: () => Promise.reject(),
    }

    export default MockWallet

    确保已经安装了项目serum,可以通过运行npm install @project-serum/anchor来安装。

    现在执行npm run dev,打开本地主机看看是否一切正常。如果没问题,我们就继续进行下去。

    既然进口和额外组件已经准备好了,我们来仔细检查文件,找出我们在使用Anchor时可以进一步简化的地方。

    请跳转到文件(/pages/_app.tsx),并添加我们的新WorkspaceProvider组件,同时确保已经正确导入。

    function MyApp({ Component, pageProps }: AppProps) {
    return (
    <ChakraProvider theme={theme}>
    <WalletContextProvider>
    <WorkspaceProvider>
    <Component {...pageProps} />
    </WorkspaceProvider>
    </WalletContextProvider>
    </ChakraProvider>
    )
    }

    跳转到组件文件夹中的StakeOptionsDisplay.ts文件。

    首先,我们导入Anchor

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

    在声明两个状态变量之后,我们来定义工作空间。

    let workspace = useWorkspace()

    接下来,在checkStakingStatus函数里添加一个额外的检查,连同我们的其他检查一起,确保!workspace.program的存在。

    if (
    !walletAdapter.connected ||
    !walletAdapter.publicKey ||
    !nftTokenAccount ||
    !workspace.program
    )

    现在,跳转到/utils/accounts.ts文件。你可以删除所有的borsh代码,并将getStakeAccount代码替换为以下代码。这就是使用Anchor工作的美妙之处之一,我们不需要担心序列化和反序列化的问题。

    export async function getStakeAccount(
    program: any,
    user: PublicKey,
    tokenAccount: PublicKey
    ): Promise<StakeAccount> {
    const [pda] = PublicKey.findProgramAddressSync(
    [user.toBuffer(), tokenAccount.toBuffer()],
    program.programId
    )

    const account = await program.account.userStakeInfo.fetch(pda)
    return account
    }

    现在,一切都已经比以前简单得多了,不是吗?

    回到StakeOptionsDisplay文件中的checkStakingStatus函数,在被称为getStakeAccount的地方,将第一个参数从connection更改为workspace.program

    打开浏览器,确保本地主机上的所有功能正常运行。

    再回到StakeOptionsDisplay文件,向下滚动到handleStake函数。

    再次,首先添加一个检查!workspace.program的步骤。很快,我们也将其添加到handleUnstakehandleClaim函数中。

    你现在可以放心地从我们之前的工作中删除所有这些代码。

    const account = await connection.getAccountInfo(stakeAccount)
    if (!account) {
    transaction.add(
    createInitializeStakeAccountInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    PROGRAM_ID
    )
    )
    }

    const stakeInstruction = createStakingInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.mint.address,
    nftData.edition.address,
    TOKEN_PROGRAM_ID,
    METADATA_PROGRAM_ID,
    PROGRAM_ID
    )

    ... 简单地用以下内容替换它:

    transaction.add(
    await workspace.program.methods
    .stake()
    .accounts({
    nftTokenAccount: nftTokenAccount,
    nftMint: nftData.mint.address,
    nftEdition: nftData.edition.address,
    metadataProgram: METADATA_PROGRAM_ID,
    })
    .instruction()
    )

    这也意味着我们在instructions.ts文件中创建的一大堆代码现在已经不再需要了。再次返回浏览器进行测试。

    假如一切都运行正常,我们接下来将处理handleUnstake代码部分。

    由于现在程序已经处理了所有的事情,我们将放弃下面这段代码:

    const account = await connection.getAccountInfo(userStakeATA)

    const transaction = new Transaction()

    if (!account) {
    transaction.add(
    createAssociatedTokenAccountInstruction(
    walletAdapter.publicKey,
    userStakeATA,
    walletAdapter.publicKey,
    STAKE_MINT
    )
    )
    }

    然后在transaction.add内部去掉createUnstakeInstruction,并用以下代码替换:

    transaction.add(
    await workspace.program.methods
    .unstake()
    .accounts({
    nftTokenAccount: nftTokenAccount,
    nftMint: nftData.mint.address,
    nftEdition: nftData.edition.address,
    metadataProgram: METADATA_PROGRAM_ID,
    stakeMint: STAKE_MINT,
    userStakeAta: userStakeATA,
    })
    .instruction()
    )

    你会注意到这些账户与handleStake中的相同,只是多了一些用于股份铸币和用户ATA的账户。

    最后,转到handleClaim,按照相同的模式进行删除,新的transaction.add应该如下所示:

    transaction.add(
    await workspace.program.methods
    .redeem()
    .accounts({
    nftTokenAccount: nftTokenAccount,
    stakeMint: STAKE_MINT,
    userStakeAta: userStakeATA,
    })
    .instruction()
    )

    现在你可以直接删除整个instructions.ts文件。太棒了!!! :)

    你可以自由地清理未使用的导入,整理你的文件。

    还有一件事需要我们注意,在令牌目录中,我们已经创建了奖励令牌,现在需要使用新的程序ID对其进行重新初始化。在bld/index.ts文件中,当调用await createBldToken时,需要将其替换为新的程序ID。然后重新运行npm run create-bld-token脚本。如果我们不这样做,我们的兑换将无法正常工作。

    这将创建一个新的Mint程序ID,你需要将其添加到你的环境变量中。

    就这样,我们的前端功能已经有一些正在运作了。下周,我们将更深入地使用Anchor进行开发,目前我们只是想展示一下使用Anchor有多么容易,并让基本功能开始运行。

    - +
    Skip to main content

    🏬 前端开发

    既然程序已经运行起来了,现在我们来进入前端代码的部分,为Anchor做适当的调整。整个设置过程只需一分钟,稍作等待,我们还会有一些修改要做。

    首先,我们需要从程序中引入IDL文件。你可以直接将整个文件复制并粘贴到utils文件夹中,包括JSONTypeScript格式。

    然后,创建一个名为WorkspaceProvider.ts的新组件文件。为了节省时间,我们可以直接从我们之前构建的电影评论前端中复制粘贴这段代码,然后将所有的"电影评论"实例替换为"Anchor NFT质押"。你会注意到我们正在从常量文件夹中导入PROGRAM_IDs,所以请进入该文件夹并确保程序ID是我们Anchor NFT质押程序的新ID(而非我们Solana原生程序的ID)。

    import { createContext, useContext } from "react"
    import {
    Program,
    AnchorProvider,
    Idl,
    setProvider,
    } from "@project-serum/anchor"
    import { AnchorNftStaking, IDL } from "../utils/anchor_nft_staking"
    import { Connection } from "@solana/web3.js"
    import { useAnchorWallet, useConnection } from "@solana/wallet-adapter-react"
    import { PROGRAM_ID } from "../utils/constants"

    const WorkspaceContext = createContext({})
    const programId = PROGRAM_ID

    interface Workspace {
    connection?: Connection
    provider?: AnchorProvider
    program?: Program<AnchorNftStaking>
    }

    const WorkspaceProvider = ({ children }: any) => {
    const wallet = useAnchorWallet() || MockWallet
    const { connection } = useConnection()

    const provider = new AnchorProvider(connection, wallet, {})
    setProvider(provider)

    const program = new Program(IDL as Idl, programId)
    const workspace = {
    connection,
    provider,
    program,
    }

    return (
    <WorkspaceContext.Provider value={workspace}>
    {children}
    </WorkspaceContext.Provider>
    )
    }

    const useWorkspace = (): Workspace => {
    return useContext(WorkspaceContext)
    }

    import { Keypair } from "@solana/web3.js"

    const MockWallet = {
    publicKey: Keypair.generate().publicKey,
    signTransaction: () => Promise.reject(),
    signAllTransactions: () => Promise.reject(),
    }

    export { WorkspaceProvider, useWorkspace }

    另外,请从电影评论项目中复制模拟钱包文件,或者创建一个名为MockWallet.ts的新组件,并粘贴下面的代码。

    import { Keypair } from "@solana/web3.js"

    const MockWallet = {
    publicKey: Keypair.generate().publicKey,
    signTransaction: () => Promise.reject(),
    signAllTransactions: () => Promise.reject(),
    }

    export default MockWallet

    确保已经安装了项目serum,可以通过运行npm install @project-serum/anchor来安装。

    现在执行npm run dev,打开本地主机看看是否一切正常。如果没问题,我们就继续进行下去。

    既然进口和额外组件已经准备好了,我们来仔细检查文件,找出我们在使用Anchor时可以进一步简化的地方。

    请跳转到文件(/pages/_app.tsx),并添加我们的新WorkspaceProvider组件,同时确保已经正确导入。

    function MyApp({ Component, pageProps }: AppProps) {
    return (
    <ChakraProvider theme={theme}>
    <WalletContextProvider>
    <WorkspaceProvider>
    <Component {...pageProps} />
    </WorkspaceProvider>
    </WalletContextProvider>
    </ChakraProvider>
    )
    }

    跳转到组件文件夹中的StakeOptionsDisplay.ts文件。

    首先,我们导入Anchor

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

    在声明两个状态变量之后,我们来定义工作空间。

    let workspace = useWorkspace()

    接下来,在checkStakingStatus函数里添加一个额外的检查,连同我们的其他检查一起,确保!workspace.program的存在。

    if (
    !walletAdapter.connected ||
    !walletAdapter.publicKey ||
    !nftTokenAccount ||
    !workspace.program
    )

    现在,跳转到/utils/accounts.ts文件。你可以删除所有的borsh代码,并将getStakeAccount代码替换为以下代码。这就是使用Anchor工作的美妙之处之一,我们不需要担心序列化和反序列化的问题。

    export async function getStakeAccount(
    program: any,
    user: PublicKey,
    tokenAccount: PublicKey
    ): Promise<StakeAccount> {
    const [pda] = PublicKey.findProgramAddressSync(
    [user.toBuffer(), tokenAccount.toBuffer()],
    program.programId
    )

    const account = await program.account.userStakeInfo.fetch(pda)
    return account
    }

    现在,一切都已经比以前简单得多了,不是吗?

    回到StakeOptionsDisplay文件中的checkStakingStatus函数,在被称为getStakeAccount的地方,将第一个参数从connection更改为workspace.program

    打开浏览器,确保本地主机上的所有功能正常运行。

    再回到StakeOptionsDisplay文件,向下滚动到handleStake函数。

    再次,首先添加一个检查!workspace.program的步骤。很快,我们也将其添加到handleUnstakehandleClaim函数中。

    你现在可以放心地从我们之前的工作中删除所有这些代码。

    const account = await connection.getAccountInfo(stakeAccount)
    if (!account) {
    transaction.add(
    createInitializeStakeAccountInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    PROGRAM_ID
    )
    )
    }

    const stakeInstruction = createStakingInstruction(
    walletAdapter.publicKey,
    nftTokenAccount,
    nftData.mint.address,
    nftData.edition.address,
    TOKEN_PROGRAM_ID,
    METADATA_PROGRAM_ID,
    PROGRAM_ID
    )

    ... 简单地用以下内容替换它:

    transaction.add(
    await workspace.program.methods
    .stake()
    .accounts({
    nftTokenAccount: nftTokenAccount,
    nftMint: nftData.mint.address,
    nftEdition: nftData.edition.address,
    metadataProgram: METADATA_PROGRAM_ID,
    })
    .instruction()
    )

    这也意味着我们在instructions.ts文件中创建的一大堆代码现在已经不再需要了。再次返回浏览器进行测试。

    假如一切都运行正常,我们接下来将处理handleUnstake代码部分。

    由于现在程序已经处理了所有的事情,我们将放弃下面这段代码:

    const account = await connection.getAccountInfo(userStakeATA)

    const transaction = new Transaction()

    if (!account) {
    transaction.add(
    createAssociatedTokenAccountInstruction(
    walletAdapter.publicKey,
    userStakeATA,
    walletAdapter.publicKey,
    STAKE_MINT
    )
    )
    }

    然后在transaction.add内部去掉createUnstakeInstruction,并用以下代码替换:

    transaction.add(
    await workspace.program.methods
    .unstake()
    .accounts({
    nftTokenAccount: nftTokenAccount,
    nftMint: nftData.mint.address,
    nftEdition: nftData.edition.address,
    metadataProgram: METADATA_PROGRAM_ID,
    stakeMint: STAKE_MINT,
    userStakeAta: userStakeATA,
    })
    .instruction()
    )

    你会注意到这些账户与handleStake中的相同,只是多了一些用于股份铸币和用户ATA的账户。

    最后,转到handleClaim,按照相同的模式进行删除,新的transaction.add应该如下所示:

    transaction.add(
    await workspace.program.methods
    .redeem()
    .accounts({
    nftTokenAccount: nftTokenAccount,
    stakeMint: STAKE_MINT,
    userStakeAta: userStakeATA,
    })
    .instruction()
    )

    现在你可以直接删除整个instructions.ts文件。太棒了!!! :)

    你可以自由地清理未使用的导入,整理你的文件。

    还有一件事需要我们注意,在令牌目录中,我们已经创建了奖励令牌,现在需要使用新的程序ID对其进行重新初始化。在bld/index.ts文件中,当调用await createBldToken时,需要将其替换为新的程序ID。然后重新运行npm run create-bld-token脚本。如果我们不这样做,我们的兑换将无法正常工作。

    这将创建一个新的Mint程序ID,你需要将其添加到你的环境变量中。

    就这样,我们的前端功能已经有一些正在运作了。下周,我们将更深入地使用Anchor进行开发,目前我们只是想展示一下使用Anchor有多么容易,并让基本功能开始运行。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/a-full-stack-anchor-app/index.html b/Solana-Co-Learn/module5/a-full-stack-anchor-app/index.html index 360e073bc..3c254f1cf 100644 --- a/Solana-Co-Learn/module5/a-full-stack-anchor-app/index.html +++ b/Solana-Co-Learn/module5/a-full-stack-anchor-app/index.html @@ -5,13 +5,13 @@ 一个全栈的Anchor应用程序 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/a-full-stack-anchor-app/redeeming-with-anchor/index.html b/Solana-Co-Learn/module5/a-full-stack-anchor-app/redeeming-with-anchor/index.html index 4c4d08a17..47dd44be1 100644 --- a/Solana-Co-Learn/module5/a-full-stack-anchor-app/redeeming-with-anchor/index.html +++ b/Solana-Co-Learn/module5/a-full-stack-anchor-app/redeeming-with-anchor/index.html @@ -5,13 +5,13 @@ 💸 使用Anchor赎回 | All in One Solana - +
    -
    Skip to main content

    💸 使用Anchor赎回

    lib.rs文件中找到Redeem结构体。由于它与Stake非常相似,我们可以直接粘贴该代码,并根据需要进行调整。

    我们不需要的是nft_mintnft_editionprogram_authority。我们要更改nft_token_account的约束条件,将令牌授权改为'user',因为我们并没有传入mint

    对于stake_state账户,由于不再需要初始化,所以我们只要设定种子和bump,并使其可变化。我们还可以为其增加一些手动约束。

    constraint = *user.key == stake_state.user_pubkey,
    constraint = nft_token_account.key() == stake_state.token_account

    接下来,我们要添加几个账户。其中一个是stake_mint,它需要可变。这是奖励铸币的账户。

    #[account(mut)]
    pub stake_mint: Account<'info, Mint>,

    另一个是stake_authority,它将是另一个未经检查的账户,所以让我们添加这个检查。

    #[account(seeds = ["mint".as_bytes().as_ref()], bump)]

    用户的user_stake_ata是一个TokenAccount,具有以下限制条件。

    #[account(
    init_if_needed,
    payer=user,
    associated_token::mint=stake_mint,
    associated_token::authority=user
    )]
    pub user_stake_ata: Account<'info, TokenAccount>,

    关联的 associated_token_program 是一个 AssociatedToken

    pub associated_token_program: Program<'info, AssociatedToken>,

    最后,将metadata_program替换为rent

    pub rent: Sysvar<'info, Rent>,

    然后,将我们的账户总数增加到10个。以下是所有代码的片段。

    #[derive(Accounts)]
    pub struct Redeem<'info> {
    #[account(mut)]
    pub user: Signer<'info>,
    #[account(
    mut,
    token::authority=user
    )]
    pub nft_token_account: Account<'info, TokenAccount>,
    #[account(
    mut,
    seeds = [user.key().as_ref(), nft_token_account.key().as_ref()],
    bump,
    constraint = *user.key == stake_state.user_pubkey,
    constraint = nft_token_account.key() == stake_state.token_account
    )]
    pub stake_state: Account<'info, UserStakeInfo>,
    #[account(mut)]
    pub stake_mint: Account<'info, Mint>,
    /// CHECK: manual check
    #[account(seeds = ["mint".as_bytes().as_ref()], bump)]
    pub stake_authority: UncheckedAccount<'info>,
    #[account(
    init_if_needed,
    payer=user,
    associated_token::mint=stake_mint,
    associated_token::authority=user
    )]
    pub user_stake_ata: Account<'info, TokenAccount>,
    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub system_program: Program<'info, System>,
    pub rent: Sysvar<'info, Rent>,
    }

    回到测试文件中,编写一个简单的测试以确保函数被触发。

    it("Redeems", async () => {
    await program.methods
    .redeem()
    .accounts({
    nftTokenAccount: nft.tokenAddress,
    stakeMint: mint,
    userStakeAta: tokenAddress,
    })
    .rpc()

    ...然后运行 anchor test ,如果一切正常并且两个测试通过,我们就进入函数并编写赎回逻辑。

    接下来,让我们进行一些检查,确认它是否已初始化,以及确保它已经抵押。我们需要在文件底部为这两种情况增加自定义错误。

    require!(
    ctx.accounts.stake_state.is_initialized,
    StakeError::UninitializedAccount
    );

    require!(
    ctx.accounts.stake_state.stake_state == StakeState::Staked,
    StakeError::InvalidStakeState
    );

    ...

    #[msg("State account is uninitialized")]
    UninitializedAccount,

    #[msg("Stake state is invalid")]
    InvalidStakeState,

    之后,让我们获取时钟。

    let clock = Clock::get()?;

    现在,我们可以添加一些消息来跟踪事物的进展,并声明我们的时间和兑换金额。

    msg!(
    "Stake last redeem: {:?}",
    ctx.accounts.stake_state.last_stake_redeem
    );

    msg!("Current time: {:?}", clock.unix_timestamp);
    let unix_time = clock.unix_timestamp - ctx.accounts.stake_state.last_stake_redeem;
    msg!("Seconds since last redeem: {}", unix_time);
    let redeem_amount = (10 * i64::pow(10, 2) * unix_time) / (24 * 60 * 60);
    msg!("Elligible redeem amount: {}", redeem_amount);

    好了,现在我们将实际铸造奖励。首先,我们要使用我们的程序创建CpiContext,然后在MintTo对象中传递账户信息。最后,添加种子和金额。

    msg!("Minting staking rewards");
    token::mint_to(
    CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    MintTo {
    mint: ctx.accounts.stake_mint.to_account_info(),
    to: ctx.accounts.user_stake_ata.to_account_info(),
    authority: ctx.accounts.stake_authority.to_account_info(),
    },
    &[&[
    b"mint".as_ref(),
    &[*ctx.bumps.get("stake_authority").unwrap()],
    ]],
    ),
    redeem_amount.try_into().unwrap(),
    )?;

    一切准备就绪后,我们需要设置最后的赎回时间。如果不设置,用户可能会获得比实际应得的更多奖励。

    ctx.accounts.stake_state.last_stake_redeem = clock.unix_timestamp;
    msg!(
    "Updated last stake redeem time: {:?}",
    ctx.accounts.stake_state.last_stake_redeem
    );

    重新进入兑换测试,并添加以下内容。

    const account = await program.account.userStakeInfo.fetch(stakeStatePda)
    expect(account.stakeState === "Unstaked")
    const tokenAccount = await getAccount(provider.connection, tokenAddress)

    你可以继续添加更多的测试来确保其稳定性。目前我们只想先确保基本功能的实现和测试。假如一切顺利,我们可以继续进行解除质押的指令。

    - +
    Skip to main content

    💸 使用Anchor赎回

    lib.rs文件中找到Redeem结构体。由于它与Stake非常相似,我们可以直接粘贴该代码,并根据需要进行调整。

    我们不需要的是nft_mintnft_editionprogram_authority。我们要更改nft_token_account的约束条件,将令牌授权改为'user',因为我们并没有传入mint

    对于stake_state账户,由于不再需要初始化,所以我们只要设定种子和bump,并使其可变化。我们还可以为其增加一些手动约束。

    constraint = *user.key == stake_state.user_pubkey,
    constraint = nft_token_account.key() == stake_state.token_account

    接下来,我们要添加几个账户。其中一个是stake_mint,它需要可变。这是奖励铸币的账户。

    #[account(mut)]
    pub stake_mint: Account<'info, Mint>,

    另一个是stake_authority,它将是另一个未经检查的账户,所以让我们添加这个检查。

    #[account(seeds = ["mint".as_bytes().as_ref()], bump)]

    用户的user_stake_ata是一个TokenAccount,具有以下限制条件。

    #[account(
    init_if_needed,
    payer=user,
    associated_token::mint=stake_mint,
    associated_token::authority=user
    )]
    pub user_stake_ata: Account<'info, TokenAccount>,

    关联的 associated_token_program 是一个 AssociatedToken

    pub associated_token_program: Program<'info, AssociatedToken>,

    最后,将metadata_program替换为rent

    pub rent: Sysvar<'info, Rent>,

    然后,将我们的账户总数增加到10个。以下是所有代码的片段。

    #[derive(Accounts)]
    pub struct Redeem<'info> {
    #[account(mut)]
    pub user: Signer<'info>,
    #[account(
    mut,
    token::authority=user
    )]
    pub nft_token_account: Account<'info, TokenAccount>,
    #[account(
    mut,
    seeds = [user.key().as_ref(), nft_token_account.key().as_ref()],
    bump,
    constraint = *user.key == stake_state.user_pubkey,
    constraint = nft_token_account.key() == stake_state.token_account
    )]
    pub stake_state: Account<'info, UserStakeInfo>,
    #[account(mut)]
    pub stake_mint: Account<'info, Mint>,
    /// CHECK: manual check
    #[account(seeds = ["mint".as_bytes().as_ref()], bump)]
    pub stake_authority: UncheckedAccount<'info>,
    #[account(
    init_if_needed,
    payer=user,
    associated_token::mint=stake_mint,
    associated_token::authority=user
    )]
    pub user_stake_ata: Account<'info, TokenAccount>,
    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub system_program: Program<'info, System>,
    pub rent: Sysvar<'info, Rent>,
    }

    回到测试文件中,编写一个简单的测试以确保函数被触发。

    it("Redeems", async () => {
    await program.methods
    .redeem()
    .accounts({
    nftTokenAccount: nft.tokenAddress,
    stakeMint: mint,
    userStakeAta: tokenAddress,
    })
    .rpc()

    ...然后运行 anchor test ,如果一切正常并且两个测试通过,我们就进入函数并编写赎回逻辑。

    接下来,让我们进行一些检查,确认它是否已初始化,以及确保它已经抵押。我们需要在文件底部为这两种情况增加自定义错误。

    require!(
    ctx.accounts.stake_state.is_initialized,
    StakeError::UninitializedAccount
    );

    require!(
    ctx.accounts.stake_state.stake_state == StakeState::Staked,
    StakeError::InvalidStakeState
    );

    ...

    #[msg("State account is uninitialized")]
    UninitializedAccount,

    #[msg("Stake state is invalid")]
    InvalidStakeState,

    之后,让我们获取时钟。

    let clock = Clock::get()?;

    现在,我们可以添加一些消息来跟踪事物的进展,并声明我们的时间和兑换金额。

    msg!(
    "Stake last redeem: {:?}",
    ctx.accounts.stake_state.last_stake_redeem
    );

    msg!("Current time: {:?}", clock.unix_timestamp);
    let unix_time = clock.unix_timestamp - ctx.accounts.stake_state.last_stake_redeem;
    msg!("Seconds since last redeem: {}", unix_time);
    let redeem_amount = (10 * i64::pow(10, 2) * unix_time) / (24 * 60 * 60);
    msg!("Elligible redeem amount: {}", redeem_amount);

    好了,现在我们将实际铸造奖励。首先,我们要使用我们的程序创建CpiContext,然后在MintTo对象中传递账户信息。最后,添加种子和金额。

    msg!("Minting staking rewards");
    token::mint_to(
    CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    MintTo {
    mint: ctx.accounts.stake_mint.to_account_info(),
    to: ctx.accounts.user_stake_ata.to_account_info(),
    authority: ctx.accounts.stake_authority.to_account_info(),
    },
    &[&[
    b"mint".as_ref(),
    &[*ctx.bumps.get("stake_authority").unwrap()],
    ]],
    ),
    redeem_amount.try_into().unwrap(),
    )?;

    一切准备就绪后,我们需要设置最后的赎回时间。如果不设置,用户可能会获得比实际应得的更多奖励。

    ctx.accounts.stake_state.last_stake_redeem = clock.unix_timestamp;
    msg!(
    "Updated last stake redeem time: {:?}",
    ctx.accounts.stake_state.last_stake_redeem
    );

    重新进入兑换测试,并添加以下内容。

    const account = await program.account.userStakeInfo.fetch(stakeStatePda)
    expect(account.stakeState === "Unstaked")
    const tokenAccount = await getAccount(provider.connection, tokenAddress)

    你可以继续添加更多的测试来确保其稳定性。目前我们只想先确保基本功能的实现和测试。假如一切顺利,我们可以继续进行解除质押的指令。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/a-full-stack-anchor-app/staking-with-anchor/index.html b/Solana-Co-Learn/module5/a-full-stack-anchor-app/staking-with-anchor/index.html index bc3369938..1142b9d2d 100644 --- a/Solana-Co-Learn/module5/a-full-stack-anchor-app/staking-with-anchor/index.html +++ b/Solana-Co-Learn/module5/a-full-stack-anchor-app/staking-with-anchor/index.html @@ -5,13 +5,13 @@ 🥩 使用Anchor进行NFT的质押 | All in One Solana - +
    -
    Skip to main content

    🥩 使用Anchor进行NFT的质押

    现在是时候将你的NFT质押计划及用户界面迁移到Anchor上了!你一直辛苦开发的buildoor项目已经相当出色,但将其迁移到Anchor上将使未来的工作变得更加简洁。请利用你所掌握的知识,完成下述任务:

    • 使用Anchor从头开始重新编写代码。
    • 增加一些可靠的测试覆盖,以确保你能够严密捕捉任何安全风险。
    • Anchor的方法构建器来替换复杂的UI代码。

    这项任务可能有些复杂,需要你投入一些时间独立进行尝试。如果几个小时后你感到困惑,随时可以观看我们提供的视频演示解决方案。

    我们来共同完成这个任务,并查看我们的成果。我们不是在增加新功能,而是要完全用Anchor替换我们一直在努力开发的质押计划。

    首先,通过运行 anchor init anchor-nft-staking 创建一个新项目,或者可以选择自己的名字。然后打开 Anchor.toml 文件,将种子设置为 true,集群设置为 devnet

    接下来,跳转到 /programs/anchor-nft-staking/Cargo.toml,并添加以下依赖项。

    anchor-lang = { version="0.25.0", features = ["init-if-needed"] }
    anchor-spl = "0.25.0"
    mpl-token-metadata = { version="1.4.1", features=["no-entrypoint"] }

    好的,打开 lib.rs 文件,我们来构建基本的框架。

    我们需要添加以下导入。随着我们的工作进展,每个导入的必要性将逐渐显现。

    use anchor_lang::solana_program::program::invoke_signed;
    use anchor_spl::token;
    use anchor_spl::{
    associated_token::AssociatedToken,
    token::{Approve, Mint, MintTo, Revoke, Token, TokenAccount},
    };
    use mpl_token_metadata::{
    instruction::{freeze_delegated_account, thaw_delegated_account},
    ID as MetadataTokenId,
    };

    首先,我们将默认函数的名称更改为 stake,并更改其相关上下文为类型Stake

    然后添加名为 redeem 的函数,上下文类型为 Redeem

    最后,对于 unstake,使用上下文类型 Unstake 进行相同操作。

    接下来我们要构建的是Stake的结构。我们需要一个PDA来存储UserStakeInfo,并且需要一个StakeState枚举来表示PDA的其中一个字段。

    #[account]
    pub struct UserStakeInfo {
    pub token_account: Pubkey,
    pub stake_start_time: i64,
    pub last_stake_redeem: i64,
    pub user_pubkey: Pubkey,
    pub stake_state: StakeState,
    pub is_initialized: bool,
    }

    #[derive(Debug, PartialEq, AnchorDeserialize, AnchorSerialize, Clone)]
    pub enum StakeState {
    Unstaked,
    Staked,
    }

    StakeState添加一个默认值,设为未抵押状态。

    由于我们将使用的元数据程序相对较新,锚定程序中还没有相应的类型。为了像其他程序(例如系统程序、令牌程序等)一样使用它,我们将为其创建一个结构体,并添加一个名为 id 的实现,返回一个 Pubkey,它对应于 MetadataTokenId

    #[derive(Clone)]
    pub struct Metadata;

    impl anchor_lang::Id for Metadata {
    fn id() -> Pubkey {
    MetadataTokenId
    }
    }

    好的,现在我们可以开始处理质押部分。下面是结构体所需的九个账户,以及一些值得注意的事项。

    首先,你会看到 nft_edition 是一个 Unchecked 账户,这是因为系统中还未为这种类型的账户创建。所有未经核实的账户都需附带一条备注,以便系统知道你将进行手动安全检查。你会在下方看到 CHECK: Manual validation

    需要提醒的是,每个账户上的属性都是一种安全检查,以确保账户是正确的类型并能执行特定功能。由于用户需要付费,并且NFT代币账户将被修改,所以两者都具有mut属性。某些账户还需要种子,如下所示。

    至于其他没有任何属性的账户,它们在Anchor中都有自己必需的安全检查,所以我们不需要添加任何属性。

    #[derive(Accounts)]
    pub struct Stake<'info> {
    #[account(mut)]
    pub user: Signer<'info>,
    #[account(
    mut,
    associated_token::mint=nft_mint,
    associated_token::authority=user
    )]
    pub nft_token_account: Account<'info, TokenAccount>,
    pub nft_mint: Account<'info, Mint>,
    /// CHECK: Manual validation
    #[account(owner=MetadataTokenId)]
    pub nft_edition: UncheckedAccount<'info>,
    #[account(
    init_if_needed,
    payer=user,
    space = std::mem::size_of::<UserStakeInfo>() + 8,
    seeds = [user.key().as_ref(), nft_token_account.key().as_ref()],
    bump
    )]
    pub stake_state: Account<'info, UserStakeInfo>,
    /// CHECK: Manual validation
    #[account(mut, seeds=["authority".as_bytes().as_ref()], bump)]
    pub program_authority: UncheckedAccount<'info>,
    pub token_program: Program<'info, Token>,
    pub system_program: Program<'info, System>,
    pub metadata_program: Program<'info, Metadata>,
    }

    在继续操作之前,先运行anchor build,这样我们的第一个构建就可以开始了。请记住,这是我们的第一次构建,它会生成我们的程序ID

    在构建的同时,在tests目录中创建一个名为utils的新文件夹。在其中创建一个名为setupNft.ts的文件,并将下面的代码粘贴进去。

    import {
    bundlrStorage,
    keypairIdentity,
    Metaplex,
    } from "@metaplex-foundation/js"
    import { createMint, getAssociatedTokenAddress } from "@solana/spl-token"
    import * as anchor from "@project-serum/anchor"

    export const setupNft = async (program, payer) => {
    const metaplex = Metaplex.make(program.provider.connection)
    .use(keypairIdentity(payer))
    .use(bundlrStorage())

    const nft = await metaplex
    .nfts()
    .create({
    uri: "",
    name: "Test nft",
    sellerFeeBasisPoints: 0,
    })

    console.log("nft metadata pubkey: ", nft.metadataAddress.toBase58())
    console.log("nft token address: ", nft.tokenAddress.toBase58())
    const [delegatedAuthPda] = await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("authority")],
    program.programId
    )
    const [stakeStatePda] = await anchor.web3.PublicKey.findProgramAddress(
    [payer.publicKey.toBuffer(), nft.tokenAddress.toBuffer()],
    program.programId
    )

    console.log("delegated authority pda: ", delegatedAuthPda.toBase58())
    console.log("stake state pda: ", stakeStatePda.toBase58())
    const [mintAuth] = await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("mint")],
    program.programId
    )

    const mint = await createMint(
    program.provider.connection,
    payer,
    mintAuth,
    null,
    2
    )
    console.log("Mint pubkey: ", mint.toBase58())

    const tokenAddress = await getAssociatedTokenAddress(mint, payer.publicKey)

    return {
    nft: nft,
    delegatedAuthPda: delegatedAuthPda,
    stakeStatePda: stakeStatePda,
    mint: mint,
    mintAuth: mintAuth,
    tokenAddress: tokenAddress,
    }
    }

    然后,运行npm install @metaplex-foundation/js

    最后,转到anchor-nft-staking.ts目录。这是Anchor创建的默认文件。

    你需要将提供者的默认行分为两部分,以便在以后需要时能够访问提供者。

    const provider = anchor.AnchorProvider.env();
    anchor.setProvider(provider);

    让我们引入钱包,这将使我们能够公开付款人为交易签名。

    const wallet = anchor.workspace.AnchorNftStaking.provider.wallet;

    检查你的编译情况,如果一切顺利,请运行 anchor deploy。如果出现问题,你可能需要为自己空投一些SOL。

    编译完成后,运行 anchor keys list 并获取程序ID,然后将其放入 lib.rsAnchor.toml 文件中。如果编译花费一些时间,你可能需要回到这一步。

    回到测试文件。

    让我们定义一些测试中需要使用的变量类型。

    let delegatedAuthPda: anchor.web3.PublicKey;
    let stakeStatePda: anchor.web3.PublicKey;
    let nft: any;
    let mintAuth: anchor.web3.PublicKey;
    let mint: anchor.web3.PublicKey;
    let tokenAddress: anchor.web3.PublicKey;

    现在,我们添加一个 before 函数,该函数会在测试运行之前被调用。注意";"语法,它会解构返回值并为所有这些值进行设置。

    before(async () => {
    ;({ nft, delegatedAuthPda, stakeStatePda, mint, mintAuth, tokenAddress } =
    await setupNft(program, wallet.payer));
    });

    转到默认测试,将其更改为 it("Stakes"。首先,我们只是确认函数被成功调用。我们还没有构建实际的抵押函数,所以暂时不会进行任何逻辑测试。

    it("Stakes", async () => {
    // 在此添加你的测试。
    await program.methods
    .stake()
    .accounts({
    nftTokenAccount: nft.tokenAddress,
    nftMint: nft.mintAddress,
    nftEdition: nft.masterEditionAddress,
    metadataProgram: METADATA_PROGRAM_ID,
    })
    .rpc();
    });

    现在,运行 anchor test。如果它通过了,这意味着我们通过了在Stake结构中创建账户的验证。

    回到逻辑部分,下面是抵押工作所需的逐步操作。我们需要获取时钟访问权限,确保抵押状态已初始化,并确认尚未抵押。

    stake函数中,我们首先获取时钟。

    let clock = Clock::get().unwrap();

    接下来,我们创建一个CPI来委托该程序作为冻结或解冻我们的NFT的权限。首先,我们设置CPI,然后确定我们要使用的账户,最后设定权限。

    msg!("Approving delegate");

    let cpi_approve_program = ctx.accounts.token_program.to_account_info();
    let cpi_approve_accounts = Approve {
    to: ctx.accounts.nft_token_account.to_account_info(),
    delegate: ctx.accounts.program_authority.to_account_info(),
    authority: ctx.accounts.user.to_account_info(),
    };

    let cpi_approve_ctx = CpiContext::new(cpi_approve_program, cpi_approve_accounts);
    token::approve(cpi_approve_ctx, 1)?;

    然后我们开始冻结代币。首先设置权限提升,然后调用invoke_signed函数,传入所有必要的账户和账户信息数组,最后是种子和提升值。

    msg!("Freezing token account");
    let authority_bump = *ctx.bumps.get("program_authority").unwrap();
    invoke_signed(
    &freeze_delegated_account(
    ctx.accounts.metadata_program.key(),
    ctx.accounts.program_authority.key(),
    ctx.accounts.nft_token_account.key(),
    ctx.accounts.nft_edition.key(),
    ctx.accounts.nft_mint.key(),
    ),
    &[
    ctx.accounts.program_authority.to_account_info(),
    ctx.accounts.nft_token_account.to_account_info(),
    ctx.accounts.nft_edition.to_account_info(),
    ctx.accounts.nft_mint.to_account_info(),
    ctx.accounts.metadata_program.to_account_info(),
    ],
    &[&[b"authority", &[authority_bump]]],
    )?;

    现在,我们在股权账户上设置数据。

    ctx.accounts.stake_state.token_account = ctx.accounts.nft_token_account.key();
    ctx.accounts.stake_state.user_pubkey = ctx.accounts.user.key();
    ctx.accounts.stake_state.stake_state = StakeState::Staked;
    ctx.accounts.stake_state.stake_start_time = clock.unix_timestamp;
    ctx.accounts.stake_state.last_stake_redeem = clock.unix_timestamp;
    ctx.accounts.stake_state.is_initialized = true;

    哎呀,让我们跳到文件开始部分并添加一个安全检查,我们还需要一个自定义错误。下面是两段代码,但是将自定义错误代码放在文件底部,这样不会影响逻辑和结构的阅读。

    require!(
    ctx.accounts.stake_state.stake_state == StakeState::Unstaked,
    StakeError::AlreadyStaked
    );
    #[error_code]
    pub enum StakeError {
    #[msg("NFT already staked")]
    AlreadyStaked,
    }

    在再次测试之前,不要忘记充实你的SOL余额。

    好的,就这样,让我们回到测试中,为我们的质押测试添加一些功能,以检查质押状态是否正确。

    const account = await program.account.userStakeInfo.fetch(stakeStatePda);
    expect(account.stakeState === "Staked");

    再次运行测试,希望一切都顺利!🤞

    就这样,我们的第一个指令已经落地生效。在接下来的部分,我们将处理其余两个指令,然后终于开始处理客户端交易的事宜。

    - +
    Skip to main content

    🥩 使用Anchor进行NFT的质押

    现在是时候将你的NFT质押计划及用户界面迁移到Anchor上了!你一直辛苦开发的buildoor项目已经相当出色,但将其迁移到Anchor上将使未来的工作变得更加简洁。请利用你所掌握的知识,完成下述任务:

    • 使用Anchor从头开始重新编写代码。
    • 增加一些可靠的测试覆盖,以确保你能够严密捕捉任何安全风险。
    • Anchor的方法构建器来替换复杂的UI代码。

    这项任务可能有些复杂,需要你投入一些时间独立进行尝试。如果几个小时后你感到困惑,随时可以观看我们提供的视频演示解决方案。

    我们来共同完成这个任务,并查看我们的成果。我们不是在增加新功能,而是要完全用Anchor替换我们一直在努力开发的质押计划。

    首先,通过运行 anchor init anchor-nft-staking 创建一个新项目,或者可以选择自己的名字。然后打开 Anchor.toml 文件,将种子设置为 true,集群设置为 devnet

    接下来,跳转到 /programs/anchor-nft-staking/Cargo.toml,并添加以下依赖项。

    anchor-lang = { version="0.25.0", features = ["init-if-needed"] }
    anchor-spl = "0.25.0"
    mpl-token-metadata = { version="1.4.1", features=["no-entrypoint"] }

    好的,打开 lib.rs 文件,我们来构建基本的框架。

    我们需要添加以下导入。随着我们的工作进展,每个导入的必要性将逐渐显现。

    use anchor_lang::solana_program::program::invoke_signed;
    use anchor_spl::token;
    use anchor_spl::{
    associated_token::AssociatedToken,
    token::{Approve, Mint, MintTo, Revoke, Token, TokenAccount},
    };
    use mpl_token_metadata::{
    instruction::{freeze_delegated_account, thaw_delegated_account},
    ID as MetadataTokenId,
    };

    首先,我们将默认函数的名称更改为 stake,并更改其相关上下文为类型Stake

    然后添加名为 redeem 的函数,上下文类型为 Redeem

    最后,对于 unstake,使用上下文类型 Unstake 进行相同操作。

    接下来我们要构建的是Stake的结构。我们需要一个PDA来存储UserStakeInfo,并且需要一个StakeState枚举来表示PDA的其中一个字段。

    #[account]
    pub struct UserStakeInfo {
    pub token_account: Pubkey,
    pub stake_start_time: i64,
    pub last_stake_redeem: i64,
    pub user_pubkey: Pubkey,
    pub stake_state: StakeState,
    pub is_initialized: bool,
    }

    #[derive(Debug, PartialEq, AnchorDeserialize, AnchorSerialize, Clone)]
    pub enum StakeState {
    Unstaked,
    Staked,
    }

    StakeState添加一个默认值,设为未抵押状态。

    由于我们将使用的元数据程序相对较新,锚定程序中还没有相应的类型。为了像其他程序(例如系统程序、令牌程序等)一样使用它,我们将为其创建一个结构体,并添加一个名为 id 的实现,返回一个 Pubkey,它对应于 MetadataTokenId

    #[derive(Clone)]
    pub struct Metadata;

    impl anchor_lang::Id for Metadata {
    fn id() -> Pubkey {
    MetadataTokenId
    }
    }

    好的,现在我们可以开始处理质押部分。下面是结构体所需的九个账户,以及一些值得注意的事项。

    首先,你会看到 nft_edition 是一个 Unchecked 账户,这是因为系统中还未为这种类型的账户创建。所有未经核实的账户都需附带一条备注,以便系统知道你将进行手动安全检查。你会在下方看到 CHECK: Manual validation

    需要提醒的是,每个账户上的属性都是一种安全检查,以确保账户是正确的类型并能执行特定功能。由于用户需要付费,并且NFT代币账户将被修改,所以两者都具有mut属性。某些账户还需要种子,如下所示。

    至于其他没有任何属性的账户,它们在Anchor中都有自己必需的安全检查,所以我们不需要添加任何属性。

    #[derive(Accounts)]
    pub struct Stake<'info> {
    #[account(mut)]
    pub user: Signer<'info>,
    #[account(
    mut,
    associated_token::mint=nft_mint,
    associated_token::authority=user
    )]
    pub nft_token_account: Account<'info, TokenAccount>,
    pub nft_mint: Account<'info, Mint>,
    /// CHECK: Manual validation
    #[account(owner=MetadataTokenId)]
    pub nft_edition: UncheckedAccount<'info>,
    #[account(
    init_if_needed,
    payer=user,
    space = std::mem::size_of::<UserStakeInfo>() + 8,
    seeds = [user.key().as_ref(), nft_token_account.key().as_ref()],
    bump
    )]
    pub stake_state: Account<'info, UserStakeInfo>,
    /// CHECK: Manual validation
    #[account(mut, seeds=["authority".as_bytes().as_ref()], bump)]
    pub program_authority: UncheckedAccount<'info>,
    pub token_program: Program<'info, Token>,
    pub system_program: Program<'info, System>,
    pub metadata_program: Program<'info, Metadata>,
    }

    在继续操作之前,先运行anchor build,这样我们的第一个构建就可以开始了。请记住,这是我们的第一次构建,它会生成我们的程序ID

    在构建的同时,在tests目录中创建一个名为utils的新文件夹。在其中创建一个名为setupNft.ts的文件,并将下面的代码粘贴进去。

    import {
    bundlrStorage,
    keypairIdentity,
    Metaplex,
    } from "@metaplex-foundation/js"
    import { createMint, getAssociatedTokenAddress } from "@solana/spl-token"
    import * as anchor from "@project-serum/anchor"

    export const setupNft = async (program, payer) => {
    const metaplex = Metaplex.make(program.provider.connection)
    .use(keypairIdentity(payer))
    .use(bundlrStorage())

    const nft = await metaplex
    .nfts()
    .create({
    uri: "",
    name: "Test nft",
    sellerFeeBasisPoints: 0,
    })

    console.log("nft metadata pubkey: ", nft.metadataAddress.toBase58())
    console.log("nft token address: ", nft.tokenAddress.toBase58())
    const [delegatedAuthPda] = await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("authority")],
    program.programId
    )
    const [stakeStatePda] = await anchor.web3.PublicKey.findProgramAddress(
    [payer.publicKey.toBuffer(), nft.tokenAddress.toBuffer()],
    program.programId
    )

    console.log("delegated authority pda: ", delegatedAuthPda.toBase58())
    console.log("stake state pda: ", stakeStatePda.toBase58())
    const [mintAuth] = await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("mint")],
    program.programId
    )

    const mint = await createMint(
    program.provider.connection,
    payer,
    mintAuth,
    null,
    2
    )
    console.log("Mint pubkey: ", mint.toBase58())

    const tokenAddress = await getAssociatedTokenAddress(mint, payer.publicKey)

    return {
    nft: nft,
    delegatedAuthPda: delegatedAuthPda,
    stakeStatePda: stakeStatePda,
    mint: mint,
    mintAuth: mintAuth,
    tokenAddress: tokenAddress,
    }
    }

    然后,运行npm install @metaplex-foundation/js

    最后,转到anchor-nft-staking.ts目录。这是Anchor创建的默认文件。

    你需要将提供者的默认行分为两部分,以便在以后需要时能够访问提供者。

    const provider = anchor.AnchorProvider.env();
    anchor.setProvider(provider);

    让我们引入钱包,这将使我们能够公开付款人为交易签名。

    const wallet = anchor.workspace.AnchorNftStaking.provider.wallet;

    检查你的编译情况,如果一切顺利,请运行 anchor deploy。如果出现问题,你可能需要为自己空投一些SOL。

    编译完成后,运行 anchor keys list 并获取程序ID,然后将其放入 lib.rsAnchor.toml 文件中。如果编译花费一些时间,你可能需要回到这一步。

    回到测试文件。

    让我们定义一些测试中需要使用的变量类型。

    let delegatedAuthPda: anchor.web3.PublicKey;
    let stakeStatePda: anchor.web3.PublicKey;
    let nft: any;
    let mintAuth: anchor.web3.PublicKey;
    let mint: anchor.web3.PublicKey;
    let tokenAddress: anchor.web3.PublicKey;

    现在,我们添加一个 before 函数,该函数会在测试运行之前被调用。注意";"语法,它会解构返回值并为所有这些值进行设置。

    before(async () => {
    ;({ nft, delegatedAuthPda, stakeStatePda, mint, mintAuth, tokenAddress } =
    await setupNft(program, wallet.payer));
    });

    转到默认测试,将其更改为 it("Stakes"。首先,我们只是确认函数被成功调用。我们还没有构建实际的抵押函数,所以暂时不会进行任何逻辑测试。

    it("Stakes", async () => {
    // 在此添加你的测试。
    await program.methods
    .stake()
    .accounts({
    nftTokenAccount: nft.tokenAddress,
    nftMint: nft.mintAddress,
    nftEdition: nft.masterEditionAddress,
    metadataProgram: METADATA_PROGRAM_ID,
    })
    .rpc();
    });

    现在,运行 anchor test。如果它通过了,这意味着我们通过了在Stake结构中创建账户的验证。

    回到逻辑部分,下面是抵押工作所需的逐步操作。我们需要获取时钟访问权限,确保抵押状态已初始化,并确认尚未抵押。

    stake函数中,我们首先获取时钟。

    let clock = Clock::get().unwrap();

    接下来,我们创建一个CPI来委托该程序作为冻结或解冻我们的NFT的权限。首先,我们设置CPI,然后确定我们要使用的账户,最后设定权限。

    msg!("Approving delegate");

    let cpi_approve_program = ctx.accounts.token_program.to_account_info();
    let cpi_approve_accounts = Approve {
    to: ctx.accounts.nft_token_account.to_account_info(),
    delegate: ctx.accounts.program_authority.to_account_info(),
    authority: ctx.accounts.user.to_account_info(),
    };

    let cpi_approve_ctx = CpiContext::new(cpi_approve_program, cpi_approve_accounts);
    token::approve(cpi_approve_ctx, 1)?;

    然后我们开始冻结代币。首先设置权限提升,然后调用invoke_signed函数,传入所有必要的账户和账户信息数组,最后是种子和提升值。

    msg!("Freezing token account");
    let authority_bump = *ctx.bumps.get("program_authority").unwrap();
    invoke_signed(
    &freeze_delegated_account(
    ctx.accounts.metadata_program.key(),
    ctx.accounts.program_authority.key(),
    ctx.accounts.nft_token_account.key(),
    ctx.accounts.nft_edition.key(),
    ctx.accounts.nft_mint.key(),
    ),
    &[
    ctx.accounts.program_authority.to_account_info(),
    ctx.accounts.nft_token_account.to_account_info(),
    ctx.accounts.nft_edition.to_account_info(),
    ctx.accounts.nft_mint.to_account_info(),
    ctx.accounts.metadata_program.to_account_info(),
    ],
    &[&[b"authority", &[authority_bump]]],
    )?;

    现在,我们在股权账户上设置数据。

    ctx.accounts.stake_state.token_account = ctx.accounts.nft_token_account.key();
    ctx.accounts.stake_state.user_pubkey = ctx.accounts.user.key();
    ctx.accounts.stake_state.stake_state = StakeState::Staked;
    ctx.accounts.stake_state.stake_start_time = clock.unix_timestamp;
    ctx.accounts.stake_state.last_stake_redeem = clock.unix_timestamp;
    ctx.accounts.stake_state.is_initialized = true;

    哎呀,让我们跳到文件开始部分并添加一个安全检查,我们还需要一个自定义错误。下面是两段代码,但是将自定义错误代码放在文件底部,这样不会影响逻辑和结构的阅读。

    require!(
    ctx.accounts.stake_state.stake_state == StakeState::Unstaked,
    StakeError::AlreadyStaked
    );
    #[error_code]
    pub enum StakeError {
    #[msg("NFT already staked")]
    AlreadyStaked,
    }

    在再次测试之前,不要忘记充实你的SOL余额。

    好的,就这样,让我们回到测试中,为我们的质押测试添加一些功能,以检查质押状态是否正确。

    const account = await program.account.userStakeInfo.fetch(stakeStatePda);
    expect(account.stakeState === "Staked");

    再次运行测试,希望一切都顺利!🤞

    就这样,我们的第一个指令已经落地生效。在接下来的部分,我们将处理其余两个指令,然后终于开始处理客户端交易的事宜。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/a-full-stack-anchor-app/unstaking-with-anchor/index.html b/Solana-Co-Learn/module5/a-full-stack-anchor-app/unstaking-with-anchor/index.html index 4199ac2ca..875591eba 100644 --- a/Solana-Co-Learn/module5/a-full-stack-anchor-app/unstaking-with-anchor/index.html +++ b/Solana-Co-Learn/module5/a-full-stack-anchor-app/unstaking-with-anchor/index.html @@ -5,13 +5,13 @@ 🍖 解除与Anchor的质押 | All in One Solana - +
    -
    Skip to main content

    🍖 解除与Anchor的质押

    现在赎回和质押都已完成,让我们开始解除质押。解除质押账户结构包括了总共14个账户,这些是赎回和质押组合在一起的结果,具体如下所示。请确保顺序相同。

    #[derive(Accounts)]
    pub struct Unstake<'info> {
    #[account(mut)]
    pub user: Signer<'info>,
    #[account(
    mut,
    token::authority=user
    )]
    pub nft_token_account: Account<'info, TokenAccount>,
    pub nft_mint: Account<'info, Mint>,
    /// CHECK: Manual validation
    #[account(owner=MetadataTokenId)]
    pub nft_edition: UncheckedAccount<'info>,
    #[account(
    mut,
    seeds = [user.key().as_ref(), nft_token_account.key().as_ref()],
    bump,
    constraint = *user.key == stake_state.user_pubkey,
    constraint = nft_token_account.key() == stake_state.token_account
    )]
    pub stake_state: Account<'info, UserStakeInfo>,
    /// CHECK: manual check
    #[account(mut, seeds=["authority".as_bytes().as_ref()], bump)]
    pub program_authority: UncheckedAccount<'info>,
    #[account(mut)]
    pub stake_mint: Account<'info, Mint>,
    /// CHECK: manual check
    #[account(seeds = ["mint".as_bytes().as_ref()], bump)]
    pub stake_authority: UncheckedAccount<'info>,
    #[account(
    init_if_needed,
    payer=user,
    associated_token::mint=stake_mint,
    associated_token::authority=user
    )]
    pub user_stake_ata: Account<'info, TokenAccount>,
    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub system_program: Program<'info, System>,
    pub rent: Sysvar<'info, Rent>,
    pub metadata_program: Program<'info, Metadata>,
    }

    这个过程相当简单,我们来编写一些基础测试,以确保其正常工作。我们需要添加那六个不会自动推断的账户。

    it("Unstakes", async () => {
    await program.methods
    .unstake()
    .accounts({
    nftTokenAccount: nft.tokenAddress,
    nftMint: nft.mintAddress,
    nftEdition: nft.masterEditionAddress,
    metadataProgram: METADATA_PROGRAM_ID,
    stakeMint: mint,
    userStakeAta: tokenAddress,
    })
    .rpc()
    });

    运行 anchor test 来确保我们的账户验证设置正确。

    回到实际功能本身,这个功能会比前两个稍微复杂一些。它与兑换过程非常相似,您可以先粘贴兑换的代码,从而节省一些敲键的时间。

    我们将从相同的两个require语句开始。在这两个语句之后,我们需要“解冻”我们的账户。这段代码与冻结账户的invoke_signed非常相似,我们只需要反向执行几个步骤。

    假如您已经粘贴了兑换的代码,在声明时钟之前,可以加入以下内容。您会注意到它几乎完全相同,但我们显然是在调用解冻函数。

    msg!("Thawing token account");
    let authority_bump = *ctx.bumps.get("program_authority").unwrap();
    invoke_signed(
    &thaw_delegated_account(
    ctx.accounts.metadata_program.key(),
    ctx.accounts.program_authority.key(),
    ctx.accounts.nft_token_account.key(),
    ctx.accounts.nft_edition.key(),
    ctx.accounts.nft_mint.key(),
    ),
    &[
    ctx.accounts.program_authority.to_account_info(),
    ctx.accounts.nft_token_account.to_account_info(),
    ctx.accounts.nft_edition.to_account_info(),
    ctx.accounts.nft_mint.to_account_info(),
    ctx.accounts.metadata_program.to_account_info(),
    ],
    &[&[b"authority", &[authority_bump]]],
    )?;

    接下来我们需要撤销委托。这里同样可以复制之前批准委托时的代码,只需将方法从approve改为revoke,并更改对象。确保还要更改变量名。看一下下方的代码,基本上我们只是将approve替换为revoke

    msg!("Revoking delegate");

    let cpi_revoke_program = ctx.accounts.token_program.to_account_info();
    let cpi_revoke_accounts = Revoke {
    source: ctx.accounts.nft_token_account.to_account_info(),
    authority: ctx.accounts.user.to_account_info(),
    };

    let cpi_revoke_ctx = CpiContext::new(cpi_revoke_program, cpi_revoke_accounts);
    token::revoke(cpi_revoke_ctx)?;

    剩下的代码与兑换函数保持一致(即刚刚粘贴的部分),所以所有的兑换都将执行。接下来,我们需要更改质押状态,在底部添加以下代码行。

    ctx.accounts.stake_state.stake_state = StakeState::Unstaked;

    测试部分已经完成,我们可以通过添加以下检查来确认功能正常运行。

    const account = await program.account.userStakeInfo.fetch(stakeStatePda)
    expect(account.stakeState === "Unstaked")

    再次提醒,我们可以增加更多测试以确保一切按照预期进行。这部分我会留给您来处理。

    至此,我们的教程就到此为止了。希望您现在能明白为什么与Anchor合作会更加方便,也能节省许多时间。下一步是进入前端开发阶段!

    - +
    Skip to main content

    🍖 解除与Anchor的质押

    现在赎回和质押都已完成,让我们开始解除质押。解除质押账户结构包括了总共14个账户,这些是赎回和质押组合在一起的结果,具体如下所示。请确保顺序相同。

    #[derive(Accounts)]
    pub struct Unstake<'info> {
    #[account(mut)]
    pub user: Signer<'info>,
    #[account(
    mut,
    token::authority=user
    )]
    pub nft_token_account: Account<'info, TokenAccount>,
    pub nft_mint: Account<'info, Mint>,
    /// CHECK: Manual validation
    #[account(owner=MetadataTokenId)]
    pub nft_edition: UncheckedAccount<'info>,
    #[account(
    mut,
    seeds = [user.key().as_ref(), nft_token_account.key().as_ref()],
    bump,
    constraint = *user.key == stake_state.user_pubkey,
    constraint = nft_token_account.key() == stake_state.token_account
    )]
    pub stake_state: Account<'info, UserStakeInfo>,
    /// CHECK: manual check
    #[account(mut, seeds=["authority".as_bytes().as_ref()], bump)]
    pub program_authority: UncheckedAccount<'info>,
    #[account(mut)]
    pub stake_mint: Account<'info, Mint>,
    /// CHECK: manual check
    #[account(seeds = ["mint".as_bytes().as_ref()], bump)]
    pub stake_authority: UncheckedAccount<'info>,
    #[account(
    init_if_needed,
    payer=user,
    associated_token::mint=stake_mint,
    associated_token::authority=user
    )]
    pub user_stake_ata: Account<'info, TokenAccount>,
    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub system_program: Program<'info, System>,
    pub rent: Sysvar<'info, Rent>,
    pub metadata_program: Program<'info, Metadata>,
    }

    这个过程相当简单,我们来编写一些基础测试,以确保其正常工作。我们需要添加那六个不会自动推断的账户。

    it("Unstakes", async () => {
    await program.methods
    .unstake()
    .accounts({
    nftTokenAccount: nft.tokenAddress,
    nftMint: nft.mintAddress,
    nftEdition: nft.masterEditionAddress,
    metadataProgram: METADATA_PROGRAM_ID,
    stakeMint: mint,
    userStakeAta: tokenAddress,
    })
    .rpc()
    });

    运行 anchor test 来确保我们的账户验证设置正确。

    回到实际功能本身,这个功能会比前两个稍微复杂一些。它与兑换过程非常相似,您可以先粘贴兑换的代码,从而节省一些敲键的时间。

    我们将从相同的两个require语句开始。在这两个语句之后,我们需要“解冻”我们的账户。这段代码与冻结账户的invoke_signed非常相似,我们只需要反向执行几个步骤。

    假如您已经粘贴了兑换的代码,在声明时钟之前,可以加入以下内容。您会注意到它几乎完全相同,但我们显然是在调用解冻函数。

    msg!("Thawing token account");
    let authority_bump = *ctx.bumps.get("program_authority").unwrap();
    invoke_signed(
    &thaw_delegated_account(
    ctx.accounts.metadata_program.key(),
    ctx.accounts.program_authority.key(),
    ctx.accounts.nft_token_account.key(),
    ctx.accounts.nft_edition.key(),
    ctx.accounts.nft_mint.key(),
    ),
    &[
    ctx.accounts.program_authority.to_account_info(),
    ctx.accounts.nft_token_account.to_account_info(),
    ctx.accounts.nft_edition.to_account_info(),
    ctx.accounts.nft_mint.to_account_info(),
    ctx.accounts.metadata_program.to_account_info(),
    ],
    &[&[b"authority", &[authority_bump]]],
    )?;

    接下来我们需要撤销委托。这里同样可以复制之前批准委托时的代码,只需将方法从approve改为revoke,并更改对象。确保还要更改变量名。看一下下方的代码,基本上我们只是将approve替换为revoke

    msg!("Revoking delegate");

    let cpi_revoke_program = ctx.accounts.token_program.to_account_info();
    let cpi_revoke_accounts = Revoke {
    source: ctx.accounts.nft_token_account.to_account_info(),
    authority: ctx.accounts.user.to_account_info(),
    };

    let cpi_revoke_ctx = CpiContext::new(cpi_revoke_program, cpi_revoke_accounts);
    token::revoke(cpi_revoke_ctx)?;

    剩下的代码与兑换函数保持一致(即刚刚粘贴的部分),所以所有的兑换都将执行。接下来,我们需要更改质押状态,在底部添加以下代码行。

    ctx.accounts.stake_state.stake_state = StakeState::Unstaked;

    测试部分已经完成,我们可以通过添加以下检查来确认功能正常运行。

    const account = await program.account.userStakeInfo.fetch(stakeStatePda)
    expect(account.stakeState === "Unstaked")

    再次提醒,我们可以增加更多测试以确保一切按照预期进行。这部分我会留给您来处理。

    至此,我们的教程就到此为止了。希望您现在能明白为什么与Anchor合作会更加方便,也能节省许多时间。下一步是进入前端开发阶段!

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/anchor-on-the-front-end/anchor-into-typescript/index.html b/Solana-Co-Learn/module5/anchor-on-the-front-end/anchor-into-typescript/index.html index fe3e2b887..6fd3957f6 100644 --- a/Solana-Co-Learn/module5/anchor-on-the-front-end/anchor-into-typescript/index.html +++ b/Solana-Co-Learn/module5/anchor-on-the-front-end/anchor-into-typescript/index.html @@ -5,13 +5,13 @@ 🐹 Anchor 到 Typescript | All in One Solana - +
    -
    Skip to main content

    🐹 Anchor 到 Typescript

    要使用前端与程序进行交互,我们需要创建一个 Anchor Program 对象。

    Program 对象提供了一个自定义的 API,通过结合程序 IDLProvider 来与特定程序进行交互。

    创建 Program 对象,我们需要以下内容:

    • Connection - 集群连接
    • Wallet - 用于支付和签署交易的默认密钥对
    • Provider - 将 ConnectionWallet 封装到一个 Solana 集群中
    • IDL - 表示程序结构的文件

    接下来,让我们逐项审视,以更好地理解所有事物之间的联系。

    IDL(接口描述语言)

    当构建一个 Anchor 程序时,Anchor 会生成一个名为 IDL 的 JSON 文件。

    IDL 文件包含程序的结构,并由客户端用于了解如何与特定程序进行交互。

    以下是使用 IDL 编写计数器程序的示例:

    {
    "version": "0.1.0",
    "name": "counter",
    "instructions": [
    {
    "name": "initialize",
    "accounts": [
    { "name": "counter", "isMut": true, "isSigner": true },
    { "name": "user", "isMut": true, "isSigner": true },
    { "name": "systemProgram", "isMut": false, "isSigner": false }
    ],
    "args": []
    },
    {
    "name": "increment",
    "accounts": [
    { "name": "counter", "isMut": true, "isSigner": false },
    { "name": "user", "isMut": false, "isSigner": true }
    ],
    "args": []
    }
    ],
    "accounts": [
    {
    "name": "Counter",
    "type": {
    "kind": "struct",
    "fields": [{ "name": "count", "type": "u64" }]
    }
    }
    ]
    }

    Provider 供应商

    在使用 IDL 创建 Program 对象之前,我们首先需要创建一个 AnchorProvider 对象。

    Provider 对象代表了两个主要部分的结合:

    • Connection - 连接到 Solana 集群(例如 localhostdevnetmainnet
    • Wallet - 用于支付和签署交易的指定地址

    接着,Provider 就能够代表 WalletSolana 区块链发送交易,并在发送的交易中加入钱包的签名。

    当使用 Solana 钱包提供商的前端时,所有的外部交易仍然需要通过提示用户进行批准。

    AnchorProvider 构造函数接受三个参数:

    • connection - 连接到 Solana 集群的 Connection
    • wallet - Wallet 对象
    • opts - 可选参数,用于指定确认选项,如果未提供,则使用默认设置
    /**
    * 用于发送由供应商支付和签署的交易的网络和钱包上下文。
    */
    export class AnchorProvider implements Provider {
    readonly publicKey: PublicKey;

    /**
    * @param connection 程序部署的集群连接。
    * @param wallet 用于支付和签署所有交易的钱包。
    * @param opts 默认使用的交易确认选项。
    */
    constructor(
    readonly connection: Connection,
    readonly wallet: Wallet,
    readonly opts: ConfirmOptions
    ) {
    this.publicKey = wallet.publicKey;
    }
    ...
    }
    caution

    请注意,来自 @solana/wallet-adapter-reactuseWallet 钩子提供的 Wallet 对象与 Anchor Provider 期望的 Wallet 对象不兼容。

    因此,让我们来比较一下来自 useAnchorWalletAnchorWallet 和来自 useWalletWalletContextState

    WalletContextState 提供了更多的功能,但是我们需要使用 AnchorWallet 来设置 Provider 对象。

    export interface AnchorWallet {
    publicKey: PublicKey;
    signTransaction(transaction: Transaction): Promise<Transaction>;
    signAllTransactions(transactions: Transaction[]): Promise<Transaction[]>;
    }
    export interface WalletContextState {
    autoConnect: boolean;
    wallets: Wallet[];
    wallet: Wallet | null;
    publicKey: PublicKey | null;
    connecting: boolean;
    connected: boolean;
    disconnecting: boolean;
    select(walletName: WalletName): void;
    connect(): Promise<void>;
    disconnect(): Promise<void>;
    sendTransaction(transaction: Transaction, connection: Connection, options?: SendTransactionOptions): Promise<TransactionSignature>;
    signTransaction: SignerWalletAdapterProps['signTransaction'] | undefined;
    signAllTransactions: SignerWalletAdapterProps['signAllTransactions'] | undefined;
    signMessage: MessageSignerWalletAdapterProps['signMessage'] | undefined;
    }

    此外,您可以使用以下方式:

    • 使用 useAnchorWallet 钩子来获取兼容的 AnchorWallet
    • 使用 useConnection 钩子连接到 Solana 集群
    • 通过 AnchorProvider 对象的构造函数创建 Provider
    • 使用 setProvider 来设置客户端的默认提供程序
    import { useAnchorWallet, useConnection } from "@solana/wallet-adapter-react"
    import { AnchorProvider, setProvider } from "@project-serum/anchor"

    const { connection } = useConnection()
    const wallet = useAnchorWallet()

    const provider = new AnchorProvider(connection, wallet, {})
    setProvider(provider)

    程序

    最后一步是创建一个 Program 对象,代表了以下两个事物的组合:

    • IDL:展示了程序的结构。
    • Provider:负责与集群建立连接并签署 WalletConnection

    首先,你需要导入程序的 IDL,并明确指定programId,这个programId通常会包含在IDL中,当然也可以单独声明。

    在创建程序对象时,如果没有特定地指定提供程序,系统将会使用默认提供程序。

    程序的最终设置应该如下:

    import idl from "./idl.json";
    import { useAnchorWallet, useConnection } from "@solana/wallet-adapter-react";
    import { Program, Idl, AnchorProvider, setProvider } from "@project-serum/anchor";

    const { connection } = useConnection();
    const wallet = useAnchorWallet();

    const provider = new AnchorProvider(connection, wallet, {});
    setProvider(provider);

    const programId = new PublicKey(idl.metadata.address);
    const program = new Program(idl as Idl, programId);

    摘要

    让我们简要总结一下步骤:

    • 导入程序的 IDL
    • 使用 useConnection 钩子与集群建立连接。
    • 使用 useAnchorWallet 钩子获取兼容的 AnchorWallet
    • 通过 AnchorProvider 构造函数创建 Provider 对象。
    • 使用 setProvider 设置默认的 Provider
    • 指定 programId,可以从 IDL 中选择,也可以直接指定。
    • 使用 Program 构造函数创建 Program 对象。

    Anchor MethodsBuilder 使用

    一旦 Program 对象设置完成,我们就可以利用 AnchorMethodsBuilder 来根据程序中的指令构建交易。

    MethodsBuilder 利用 IDL,为调用程序指令提供了一种简化格式,基本格式如下:

    • program:由 programId 指定的被调用程序,来自 Program 对象。
    • methods:包括 IDL 的所有指令,用于构建程序中所有的 API
    • instructionName:从 IDL 中调用的特定指令的名称。
    • args:传递给指令的参数,包括在指令名称后的括号中所需的任何指令数据。
    • accounts:需要作为输入提供的一份指令所需的账户列表。
    • signers:任何需要输入的额外签署人信息。
    • rpc:创建并发送带有指定指令的已签名交易,并返回一个 TransactionSignature

    如果指示中没有除使用 Wallet 指定的 Provider 之外的其他签署人,你可以省略 .signer([]) 行。

    // 发送交易
    const transactionSignature = await program.methods
    .instructionName(instructionDataInputs)
    .accounts({})
    .signers([])
    .rpc();

    你还可以通过将 .rpc() 更改为 .transaction() 来直接构建交易,以及通过以下方式创建 Transaction 对象:

    // 创建交易
    const transaction = await program.methods
    .instructionName(instructionDataInputs)
    .accounts({})
    .transaction();

    // 发送交易
    await sendTransaction(transaction, connection);

    同样,你还可以使用相同的格式来构建一个使用 .instruction 的指令,然后手动将指令添加到新的交易中。

    // 创建第一条指令
    const instructionOne = await program.methods
    .instructionOneName(instructionOneDataInputs)
    .accounts({})
    .instruction();

    // 创建第二条指令
    const instructionTwo = await program.methods
    .instructionTwoName(instructionTwoDataInputs)
    .accounts({})
    .instruction();

    // 将两个指令添加到一个交易中
    const transaction = new Transaction().add(instructionOne, instructionTwo);

    // 发送交易
    await sendTransaction(transaction, connection);

    总的来说,Anchor MethodsBuilder 为与链上程序交互提供了一种更简洁且灵活的方式。你可以构建指令、交易,或者使用相同的格式构建和发送交易,无需手动序列化或反序列化账户或指令数据。

    发送交易

    可以使用由 @solana/wallet-adapter-react 提供的 useWallet() 钩子中的 sendTransaction 方法,通过钱包适配器发送交易。

    sendTransaction 方法会在发送之前提示连接的钱包批准和签署交易。你还可以通过包括 { signers: [] } 来添加额外的签名:

    import { useWallet } from "@solana/wallet-adapter-react";

    const { sendTransaction } = useWallet();

    ...

    sendTransaction(transaction, connection);

    或者:

    sendTransaction(transaction, connection, { signers: [] });

    获取程序账户

    你还可以使用 program 对象来获取程序账户类型。通过 fetch() 来获取单个账户,通过 all() 来获取指定类型的所有账户,或者使用 memcmp 来筛选要获取的账户。

    const account = await program.account.accountType.fetch(publickey);

    const accounts = (await program.account.accountType.all());

    const accounts =
    (await program.account.accountType.all([
    {
    memcmp: {
    offset: 8,
    bytes: publicKey.toBase58(),
    },
    },
    ]));

    示例摘要

    创建一个计数器账户,并在单个事务中递增它。此外,还可以获取计数器账户。

    const counter = Keypair.generate();
    const transaction = new anchor.web3.Transaction();

    const initializeInstruction = await program.methods
    .initialize()
    .accounts({
    counter: counter.publicKey,
    })
    .instruction();

    const incrementInstruction = await program.methods
    .increment()
    .accounts({
    counter: counter.publicKey
    })
    .instruction();

    transaction.add(initializeInstruction, incrementInstruction);

    const transactionSignature = await sendTransaction(
    transaction,
    connection,
    {
    signers: [counter],
    }
    ).then((transactionSignature) => {
    return transactionSignature
    })

    const latestBlockHash = await connection.getLatestBlockhash()
    await connection.confirmTransaction({
    blockhash: latestBlockHash.blockhash,
    lastValidBlockHeight: latestBlockHash.lastValidBlockHeight,
    signature: transactionSignature,
    })

    const counterAccount = await program.account.counter.fetch(counter.publicKey)
    - +
    Skip to main content

    🐹 Anchor 到 Typescript

    要使用前端与程序进行交互,我们需要创建一个 Anchor Program 对象。

    Program 对象提供了一个自定义的 API,通过结合程序 IDLProvider 来与特定程序进行交互。

    创建 Program 对象,我们需要以下内容:

    • Connection - 集群连接
    • Wallet - 用于支付和签署交易的默认密钥对
    • Provider - 将 ConnectionWallet 封装到一个 Solana 集群中
    • IDL - 表示程序结构的文件

    接下来,让我们逐项审视,以更好地理解所有事物之间的联系。

    IDL(接口描述语言)

    当构建一个 Anchor 程序时,Anchor 会生成一个名为 IDL 的 JSON 文件。

    IDL 文件包含程序的结构,并由客户端用于了解如何与特定程序进行交互。

    以下是使用 IDL 编写计数器程序的示例:

    {
    "version": "0.1.0",
    "name": "counter",
    "instructions": [
    {
    "name": "initialize",
    "accounts": [
    { "name": "counter", "isMut": true, "isSigner": true },
    { "name": "user", "isMut": true, "isSigner": true },
    { "name": "systemProgram", "isMut": false, "isSigner": false }
    ],
    "args": []
    },
    {
    "name": "increment",
    "accounts": [
    { "name": "counter", "isMut": true, "isSigner": false },
    { "name": "user", "isMut": false, "isSigner": true }
    ],
    "args": []
    }
    ],
    "accounts": [
    {
    "name": "Counter",
    "type": {
    "kind": "struct",
    "fields": [{ "name": "count", "type": "u64" }]
    }
    }
    ]
    }

    Provider 供应商

    在使用 IDL 创建 Program 对象之前,我们首先需要创建一个 AnchorProvider 对象。

    Provider 对象代表了两个主要部分的结合:

    • Connection - 连接到 Solana 集群(例如 localhostdevnetmainnet
    • Wallet - 用于支付和签署交易的指定地址

    接着,Provider 就能够代表 WalletSolana 区块链发送交易,并在发送的交易中加入钱包的签名。

    当使用 Solana 钱包提供商的前端时,所有的外部交易仍然需要通过提示用户进行批准。

    AnchorProvider 构造函数接受三个参数:

    • connection - 连接到 Solana 集群的 Connection
    • wallet - Wallet 对象
    • opts - 可选参数,用于指定确认选项,如果未提供,则使用默认设置
    /**
    * 用于发送由供应商支付和签署的交易的网络和钱包上下文。
    */
    export class AnchorProvider implements Provider {
    readonly publicKey: PublicKey;

    /**
    * @param connection 程序部署的集群连接。
    * @param wallet 用于支付和签署所有交易的钱包。
    * @param opts 默认使用的交易确认选项。
    */
    constructor(
    readonly connection: Connection,
    readonly wallet: Wallet,
    readonly opts: ConfirmOptions
    ) {
    this.publicKey = wallet.publicKey;
    }
    ...
    }
    caution

    请注意,来自 @solana/wallet-adapter-reactuseWallet 钩子提供的 Wallet 对象与 Anchor Provider 期望的 Wallet 对象不兼容。

    因此,让我们来比较一下来自 useAnchorWalletAnchorWallet 和来自 useWalletWalletContextState

    WalletContextState 提供了更多的功能,但是我们需要使用 AnchorWallet 来设置 Provider 对象。

    export interface AnchorWallet {
    publicKey: PublicKey;
    signTransaction(transaction: Transaction): Promise<Transaction>;
    signAllTransactions(transactions: Transaction[]): Promise<Transaction[]>;
    }
    export interface WalletContextState {
    autoConnect: boolean;
    wallets: Wallet[];
    wallet: Wallet | null;
    publicKey: PublicKey | null;
    connecting: boolean;
    connected: boolean;
    disconnecting: boolean;
    select(walletName: WalletName): void;
    connect(): Promise<void>;
    disconnect(): Promise<void>;
    sendTransaction(transaction: Transaction, connection: Connection, options?: SendTransactionOptions): Promise<TransactionSignature>;
    signTransaction: SignerWalletAdapterProps['signTransaction'] | undefined;
    signAllTransactions: SignerWalletAdapterProps['signAllTransactions'] | undefined;
    signMessage: MessageSignerWalletAdapterProps['signMessage'] | undefined;
    }

    此外,您可以使用以下方式:

    • 使用 useAnchorWallet 钩子来获取兼容的 AnchorWallet
    • 使用 useConnection 钩子连接到 Solana 集群
    • 通过 AnchorProvider 对象的构造函数创建 Provider
    • 使用 setProvider 来设置客户端的默认提供程序
    import { useAnchorWallet, useConnection } from "@solana/wallet-adapter-react"
    import { AnchorProvider, setProvider } from "@project-serum/anchor"

    const { connection } = useConnection()
    const wallet = useAnchorWallet()

    const provider = new AnchorProvider(connection, wallet, {})
    setProvider(provider)

    程序

    最后一步是创建一个 Program 对象,代表了以下两个事物的组合:

    • IDL:展示了程序的结构。
    • Provider:负责与集群建立连接并签署 WalletConnection

    首先,你需要导入程序的 IDL,并明确指定programId,这个programId通常会包含在IDL中,当然也可以单独声明。

    在创建程序对象时,如果没有特定地指定提供程序,系统将会使用默认提供程序。

    程序的最终设置应该如下:

    import idl from "./idl.json";
    import { useAnchorWallet, useConnection } from "@solana/wallet-adapter-react";
    import { Program, Idl, AnchorProvider, setProvider } from "@project-serum/anchor";

    const { connection } = useConnection();
    const wallet = useAnchorWallet();

    const provider = new AnchorProvider(connection, wallet, {});
    setProvider(provider);

    const programId = new PublicKey(idl.metadata.address);
    const program = new Program(idl as Idl, programId);

    摘要

    让我们简要总结一下步骤:

    • 导入程序的 IDL
    • 使用 useConnection 钩子与集群建立连接。
    • 使用 useAnchorWallet 钩子获取兼容的 AnchorWallet
    • 通过 AnchorProvider 构造函数创建 Provider 对象。
    • 使用 setProvider 设置默认的 Provider
    • 指定 programId,可以从 IDL 中选择,也可以直接指定。
    • 使用 Program 构造函数创建 Program 对象。

    Anchor MethodsBuilder 使用

    一旦 Program 对象设置完成,我们就可以利用 AnchorMethodsBuilder 来根据程序中的指令构建交易。

    MethodsBuilder 利用 IDL,为调用程序指令提供了一种简化格式,基本格式如下:

    • program:由 programId 指定的被调用程序,来自 Program 对象。
    • methods:包括 IDL 的所有指令,用于构建程序中所有的 API
    • instructionName:从 IDL 中调用的特定指令的名称。
    • args:传递给指令的参数,包括在指令名称后的括号中所需的任何指令数据。
    • accounts:需要作为输入提供的一份指令所需的账户列表。
    • signers:任何需要输入的额外签署人信息。
    • rpc:创建并发送带有指定指令的已签名交易,并返回一个 TransactionSignature

    如果指示中没有除使用 Wallet 指定的 Provider 之外的其他签署人,你可以省略 .signer([]) 行。

    // 发送交易
    const transactionSignature = await program.methods
    .instructionName(instructionDataInputs)
    .accounts({})
    .signers([])
    .rpc();

    你还可以通过将 .rpc() 更改为 .transaction() 来直接构建交易,以及通过以下方式创建 Transaction 对象:

    // 创建交易
    const transaction = await program.methods
    .instructionName(instructionDataInputs)
    .accounts({})
    .transaction();

    // 发送交易
    await sendTransaction(transaction, connection);

    同样,你还可以使用相同的格式来构建一个使用 .instruction 的指令,然后手动将指令添加到新的交易中。

    // 创建第一条指令
    const instructionOne = await program.methods
    .instructionOneName(instructionOneDataInputs)
    .accounts({})
    .instruction();

    // 创建第二条指令
    const instructionTwo = await program.methods
    .instructionTwoName(instructionTwoDataInputs)
    .accounts({})
    .instruction();

    // 将两个指令添加到一个交易中
    const transaction = new Transaction().add(instructionOne, instructionTwo);

    // 发送交易
    await sendTransaction(transaction, connection);

    总的来说,Anchor MethodsBuilder 为与链上程序交互提供了一种更简洁且灵活的方式。你可以构建指令、交易,或者使用相同的格式构建和发送交易,无需手动序列化或反序列化账户或指令数据。

    发送交易

    可以使用由 @solana/wallet-adapter-react 提供的 useWallet() 钩子中的 sendTransaction 方法,通过钱包适配器发送交易。

    sendTransaction 方法会在发送之前提示连接的钱包批准和签署交易。你还可以通过包括 { signers: [] } 来添加额外的签名:

    import { useWallet } from "@solana/wallet-adapter-react";

    const { sendTransaction } = useWallet();

    ...

    sendTransaction(transaction, connection);

    或者:

    sendTransaction(transaction, connection, { signers: [] });

    获取程序账户

    你还可以使用 program 对象来获取程序账户类型。通过 fetch() 来获取单个账户,通过 all() 来获取指定类型的所有账户,或者使用 memcmp 来筛选要获取的账户。

    const account = await program.account.accountType.fetch(publickey);

    const accounts = (await program.account.accountType.all());

    const accounts =
    (await program.account.accountType.all([
    {
    memcmp: {
    offset: 8,
    bytes: publicKey.toBase58(),
    },
    },
    ]));

    示例摘要

    创建一个计数器账户,并在单个事务中递增它。此外,还可以获取计数器账户。

    const counter = Keypair.generate();
    const transaction = new anchor.web3.Transaction();

    const initializeInstruction = await program.methods
    .initialize()
    .accounts({
    counter: counter.publicKey,
    })
    .instruction();

    const incrementInstruction = await program.methods
    .increment()
    .accounts({
    counter: counter.publicKey
    })
    .instruction();

    transaction.add(initializeInstruction, incrementInstruction);

    const transactionSignature = await sendTransaction(
    transaction,
    connection,
    {
    signers: [counter],
    }
    ).then((transactionSignature) => {
    return transactionSignature
    })

    const latestBlockHash = await connection.getLatestBlockhash()
    await connection.confirmTransaction({
    blockhash: latestBlockHash.blockhash,
    lastValidBlockHeight: latestBlockHash.lastValidBlockHeight,
    signature: transactionSignature,
    })

    const counterAccount = await program.account.counter.fetch(counter.publicKey)
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/anchor-on-the-front-end/build-a-better-movie-review-program/index.html b/Solana-Co-Learn/module5/anchor-on-the-front-end/build-a-better-movie-review-program/index.html index c380cfc52..2f4563ed8 100644 --- a/Solana-Co-Learn/module5/anchor-on-the-front-end/build-a-better-movie-review-program/index.html +++ b/Solana-Co-Learn/module5/anchor-on-the-front-end/build-a-better-movie-review-program/index.html @@ -5,13 +5,13 @@ 🎥 打造一款优秀的电影评论程序 | All in One Solana - +
    -
    Skip to main content

    🎥 打造一款优秀的电影评论程序

    让我们开始行动,释放所有的魔力吧!

    我们将会将电影评论前端适配为使用Anchor IDL

    获取起始代码

    git clone https://github.com/buildspace/anchor-solana-movie-review-frontend
    cd anchor-solana-movie-review-frontend
    git checkout starter-add-tokens
    npm i
    • 请注意,起始代码在Anchor设置完成之前是无法运行的。
    • ./context/Anchor/MockWallet.ts 中,我们有一个临时的 AnchorWallet,在钱包连接之前可以使用。
    import { Keypair } from "@solana/web3.js"

    const MockWallet = {
    publicKey: Keypair.generate().publicKey,
    signTransaction: () => Promise.reject(),
    signAllTransactions: () => Promise.reject(),
    }

    export default MockWallet

    Anchor 的设置

    • 位于 ./context/Anchor/index.tsx 文件中。
    • 创建 WorkspaceProvider 的上下文,并提供一个名为 useWorkspace 的钩子。
      • 我们将使用 useWorkspace 钩子来访问我们组件中的 program 对象。
      • 这样做的好处是只需要进行一次设置。
    import { createContext, useContext } from "react"
    import {
    Program,
    AnchorProvider,
    Idl,
    setProvider,
    } from "@project-serum/anchor"
    import { MovieReview, IDL } from "./movie_review"
    import { Connection, PublicKey } from "@solana/web3.js"
    import { useAnchorWallet, useConnection } from "@solana/wallet-adapter-react"
    import MockWallet from "./MockWallet"
    const WorkspaceContext = createContext({})
    const programId = new PublicKey("BouTUP7a3MZLtXqMAm1NrkJSKwAjmid8abqiNjUyBJSr")

    interface WorkSpace {
    connection?: Connection
    provider?: AnchorProvider
    program?: Program<MovieReview>
    }

    const WorkspaceProvider = ({ children }: any) => {
    const wallet = useAnchorWallet() || MockWallet
    const { connection } = useConnection()

    const provider = new AnchorProvider(connection, wallet, {})

    setProvider(provider)
    const program = new Program(IDL as Idl, programId)
    const workspace = {
    connection,
    provider,
    program,
    }

    return (
    <WorkspaceContext.Provider value={workspace}>
    {children}
    </WorkspaceContext.Provider>
    )
    }

    const useWorkspace = (): WorkSpace => {
    return useContext(WorkspaceContext)
    }

    export { WorkspaceProvider, useWorkspace }
    • ..pages/_app.tsx 文件中。
    • 将整个应用程序包裹在 WorkspaceProvider 中。
    • 现在我们可以在不同的组件中使用 useWorkspace 钩子来访问 program 对象。
    import "../styles/globals.css"
    import type { AppProps } from "next/app"
    import { ChakraProvider } from "@chakra-ui/react"
    import WalletContextProvider from "../context/WalletContextProvider"
    import { WorkspaceProvider } from "../context/Anchor"

    function MyApp({ Component, pageProps }: AppProps) {
    return (
    <WalletContextProvider>
    <ChakraProvider>
    <WorkspaceProvider>
    <Component {...pageProps} />
    </WorkspaceProvider>
    </ChakraProvider>
    </WalletContextProvider>
    )
    }

    export default MyApp

    Form.tsx

    • handleSubmit 函数中:
      • 可以实现根据情况选择调用 addMovieReviewupdateMovieReview 指令。

    在使用Anchor时,利用IDL (Interface Description Language) 的特性可以推断PDA(程序派生地址)账户和其他账户(如系统程序或代币程序),因此无需显式传递这些信息。

    import { FC } from "react"
    import { useState } from "react"
    import {
    Box,
    Button,
    FormControl,
    FormLabel,
    Input,
    NumberDecrementStepper,
    NumberIncrementStepper,
    NumberInput,
    NumberInputField,
    NumberInputStepper,
    Textarea,
    Switch,
    } from "@chakra-ui/react"
    import * as anchor from "@project-serum/anchor"
    import { getAssociatedTokenAddress } from "@solana/spl-token"
    import { useConnection, useWallet } from "@solana/wallet-adapter-react"
    import { useWorkspace } from "../context/Anchor"

    export const Form: FC = () => {
    const [title, setTitle] = useState("")
    const [rating, setRating] = useState(0)
    const [description, setDescription] = useState("")
    const [toggle, setToggle] = useState(true)

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

    const workspace = useWorkspace()
    const program = workspace.program

    const handleSubmit = async (event: any) => {
    event.preventDefault()

    if (!publicKey || !program) {
    alert("Please connect your wallet!")
    return
    }

    const [mintPDA] = await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("mint")],
    program.programId
    )

    const tokenAddress = await getAssociatedTokenAddress(mintPDA, publicKey)

    const transaction = new anchor.web3.Transaction()

    if (toggle) {
    const instruction = await program.methods
    .addMovieReview(title, description, rating)
    .accounts({
    tokenAccount: tokenAddress,
    })
    .instruction()

    transaction.add(instruction)
    } else {
    const instruction = await program.methods
    .updateMovieReview(title, description, rating)
    .instruction()

    transaction.add(instruction)
    }

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

    return (
    <Box
    p={4}
    display={{ md: "flex" }}
    maxWidth="32rem"
    borderWidth={1}
    margin={2}
    justifyContent="center"
    >
    <form onSubmit={handleSubmit}>
    <FormControl isRequired>
    <FormLabel color="gray.200">Movie Title</FormLabel>
    <Input
    id="title"
    color="gray.400"
    onChange={(event) => setTitle(event.currentTarget.value)}
    />
    </FormControl>
    <FormControl isRequired>
    <FormLabel color="gray.200">Add your review</FormLabel>
    <Textarea
    id="review"
    color="gray.400"
    onChange={(event) => setDescription(event.currentTarget.value)}
    />
    </FormControl>
    <FormControl isRequired>
    <FormLabel color="gray.200">Rating</FormLabel>
    <NumberInput
    max={5}
    min={1}
    onChange={(valueString) => setRating(parseInt(valueString))}
    >
    <NumberInputField id="amount" color="gray.400" />
    <NumberInputStepper color="gray.400">
    <NumberIncrementStepper />
    <NumberDecrementStepper />
    </NumberInputStepper>
    </NumberInput>
    </FormControl>
    <FormControl display="center" alignItems="center">
    <FormLabel color="gray.100" mt={2}>
    Update
    </FormLabel>
    <Switch
    id="update"
    onChange={(event) => setToggle((prevCheck) => !prevCheck)}
    />
    </FormControl>
    <Button width="full" mt={4} type="submit">
    Submit Review
    </Button>
    </form>
    </Box>
    )
    }

    MovieList.tsx

    • fetchMyReviews
      • 为连接的钱包的评论实施 movieAccountState 账户过滤器
    • fetchAccounts
      • 执行获取所有账户
    • 实现评论的分页
    import { Card } from "./Card"
    import { FC, useEffect, useState } from "react"
    import {
    Button,
    Center,
    HStack,
    Input,
    Spacer,
    Heading,
    } from "@chakra-ui/react"
    import { useWorkspace } from "../context/Anchor"
    import { useWallet } from "@solana/wallet-adapter-react"
    import { useDisclosure } from "@chakra-ui/react"
    import { ReviewDetail } from "./ReviewDetail"

    export const MovieList: FC = () => {
    const { program } = useWorkspace()
    const [movies, setMovies] = useState<any | null>(null)
    const [page, setPage] = useState(1)
    const [search, setSearch] = useState("")
    const [result, setResult] = useState<any | null>(null)
    const [selectedMovie, setSelectedMovie] = useState<any | null>(null)
    const { isOpen, onOpen, onClose } = useDisclosure()
    const wallet = useWallet()

    useEffect(() => {
    const fetchAccounts = async () => {
    if (program) {
    const accounts = (await program.account.movieAccountState.all()) ?? []

    const sort = [...accounts].sort((a, b) =>
    a.account.title > b.account.title ? 1 : -1
    )
    setMovies(sort)
    }
    }
    fetchAccounts()
    }, [])

    useEffect(() => {
    if (movies && search != "") {
    const filtered = movies.filter((movie: any) => {
    return movie.account.title
    .toLowerCase()
    .startsWith(search.toLowerCase())
    })
    setResult(filtered)
    }
    }, [search])

    useEffect(() => {
    if (movies && search == "") {
    const filtered = movies.slice((page - 1) * 3, page * 3)
    setResult(filtered)
    }
    }, [page, movies, search])

    const fetchMyReviews = async () => {
    if (wallet.connected && program) {
    const accounts =
    (await program.account.movieAccountState.all([
    {
    memcmp: {
    offset: 8,
    bytes: wallet.publicKey!.toBase58(),
    },
    },
    ])) ?? []

    const sort = [...accounts].sort((a, b) =>
    a.account.title > b.account.title ? 1 : -1
    )
    setResult(sort)
    } else {
    alert("Please Connect Wallet")
    }
    }

    const handleReviewSelected = (data: any) => {
    setSelectedMovie(data)
    onOpen()
    }

    return (
    <div>
    <Center>
    <Input
    id="search"
    color="gray.400"
    onChange={(event) => setSearch(event.currentTarget.value)}
    placeholder="Search"
    w="97%"
    mt={2}
    mb={2}
    margin={2}
    />
    <Button onClick={fetchMyReviews}>My Reviews</Button>
    </Center>
    <Heading as="h1" size="l" color="white" ml={4} mt={8}>
    Select Review To Comment
    </Heading>
    {selectedMovie && (
    <ReviewDetail isOpen={isOpen} onClose={onClose} movie={selectedMovie} />
    )}
    {result && (
    <div>
    {Object.keys(result).map((key) => {
    const data = result[key as unknown as number]
    return (
    <Card
    key={key}
    movie={data}
    onClick={() => {
    handleReviewSelected(data)
    }}
    />
    )
    })}
    </div>
    )}
    <Center>
    {movies && (
    <HStack w="full" mt={2} mb={8} ml={4} mr={4}>
    {page > 1 && (
    <Button onClick={() => setPage(page - 1)}>Previous</Button>
    )}
    <Spacer />
    {movies.length > page * 3 && (
    <Button onClick={() => setPage(page + 1)}>Next</Button>
    )}
    </HStack>
    )}
    </Center>
    </div>
    )
    }

    ReviewDetail.tsx

    • handleSubmit
      • 实施 addComment

    请注意,Anchor可以使用IDL来推断PDA账户和其他账户(系统程序/代币程序),因此不需要显式传递

    import {
    Button,
    Input,
    Modal,
    ModalOverlay,
    ModalContent,
    ModalHeader,
    ModalCloseButton,
    ModalBody,
    Stack,
    FormControl,
    } from "@chakra-ui/react"
    import { FC, useState } from "react"
    import * as anchor from "@project-serum/anchor"
    import { getAssociatedTokenAddress } from "@solana/spl-token"
    import { CommentList } from "./CommentList"
    import { useConnection, useWallet } from "@solana/wallet-adapter-react"
    import { useWorkspace } from "../context/Anchor"
    import BN from "bn.js"

    interface ReviewDetailProps {
    isOpen: boolean
    onClose: any
    movie: any
    }

    export const ReviewDetail: FC<ReviewDetailProps> = ({
    isOpen,
    onClose,
    movie,
    }: ReviewDetailProps) => {
    const [comment, setComment] = useState("")
    const { connection } = useConnection()
    const { publicKey, sendTransaction } = useWallet()
    const { program } = useWorkspace()

    const handleSubmit = async (event: any) => {
    event.preventDefault()

    if (!publicKey || !program) {
    alert("Please connect your wallet!")
    return
    }

    const movieReview = new anchor.web3.PublicKey(movie.publicKey)

    const [movieReviewCounterPda] =
    await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("counter"), movieReview.toBuffer()],
    program.programId
    )

    const [mintPDA] = await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("mint")],
    program.programId
    )

    const tokenAddress = await getAssociatedTokenAddress(mintPDA, publicKey)

    const transaction = new anchor.web3.Transaction()

    const instruction = await program.methods
    .addComment(comment)
    .accounts({
    movieReview: movieReview,
    movieCommentCounter: movieReviewCounterPda,
    tokenAccount: tokenAddress,
    })
    .instruction()

    transaction.add(instruction)

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

    return (
    <div>
    <Modal isOpen={isOpen} onClose={onClose}>
    <ModalOverlay />
    <ModalContent>
    <ModalHeader
    textTransform="uppercase"
    textAlign={{ base: "center", md: "center" }}
    >
    {movie.account.title}
    </ModalHeader>
    <ModalCloseButton />
    <ModalBody>
    <Stack textAlign={{ base: "center", md: "center" }}>
    <p>{movie.account.description}</p>
    <form onSubmit={handleSubmit}>
    <FormControl isRequired>
    <Input
    id="title"
    color="black"
    onChange={(event) => setComment(event.currentTarget.value)}
    placeholder="Submit a comment..."
    />
    </FormControl>
    <Button width="full" mt={4} type="submit">
    Send
    </Button>
    </form>
    <CommentList movie={movie} />
    </Stack>
    </ModalBody>
    </ModalContent>
    </Modal>
    </div>
    )
    }

    CommentList.tsx

    • fetch
      • 获取账户并筛选特定的电影评论账户
    • 实现评论的分页
    import {
    Button,
    Center,
    HStack,
    Spacer,
    Stack,
    Box,
    Heading,
    } from "@chakra-ui/react"
    import { FC, useState, useEffect } from "react"
    import { useWorkspace } from "../context/Anchor"

    interface CommentListProps {
    movie: any
    }

    export const CommentList: FC<CommentListProps> = ({
    movie,
    }: CommentListProps) => {
    const [page, setPage] = useState(1)
    const [comments, setComments] = useState<any[]>([])
    const [result, setResult] = useState<any[]>([])
    const { program } = useWorkspace()

    useEffect(() => {
    const fetch = async () => {
    if (program) {
    const comments = await program.account.movieComment.all([
    {
    memcmp: {
    offset: 8,
    bytes: movie.publicKey.toBase58(),
    },
    },
    ])

    const sort = [...comments].sort((a, b) =>
    a.account.count > b.account.count ? 1 : -1
    )
    setComments(comments)
    const filtered = sort.slice((page - 1) * 3, page * 3)
    setResult(filtered)
    }
    }
    fetch()
    }, [page])

    return (
    <div>
    <Heading as="h1" size="l" ml={4} mt={2}>
    Existing Comments
    </Heading>
    {result.map((comment, index) => (
    <Box
    p={4}
    textAlign={{ base: "left", md: "left" }}
    display={{ md: "flex" }}
    maxWidth="32rem"
    borderWidth={1}
    margin={2}
    key={index}
    >
    <div>{comment.account.comment}</div>
    </Box>
    ))}
    <Stack>
    <Center>
    <HStack w="full" mt={2} mb={8} ml={4} mr={4}>
    {page > 1 && (
    <Button onClick={() => setPage(page - 1)}>Previous</Button>
    )}
    <Spacer />
    {comments.length > page * 3 && (
    <Button onClick={() => setPage(page + 1)}>Next</Button>
    )}
    </HStack>
    </Center>
    </Stack>
    </div>
    )
    }

    使用以下命令运行:

    npm run dev

    恭喜!你做到了。我们的下一课是你建立和发货的大结局。

    - +
    Skip to main content

    🎥 打造一款优秀的电影评论程序

    让我们开始行动,释放所有的魔力吧!

    我们将会将电影评论前端适配为使用Anchor IDL

    获取起始代码

    git clone https://github.com/buildspace/anchor-solana-movie-review-frontend
    cd anchor-solana-movie-review-frontend
    git checkout starter-add-tokens
    npm i
    • 请注意,起始代码在Anchor设置完成之前是无法运行的。
    • ./context/Anchor/MockWallet.ts 中,我们有一个临时的 AnchorWallet,在钱包连接之前可以使用。
    import { Keypair } from "@solana/web3.js"

    const MockWallet = {
    publicKey: Keypair.generate().publicKey,
    signTransaction: () => Promise.reject(),
    signAllTransactions: () => Promise.reject(),
    }

    export default MockWallet

    Anchor 的设置

    • 位于 ./context/Anchor/index.tsx 文件中。
    • 创建 WorkspaceProvider 的上下文,并提供一个名为 useWorkspace 的钩子。
      • 我们将使用 useWorkspace 钩子来访问我们组件中的 program 对象。
      • 这样做的好处是只需要进行一次设置。
    import { createContext, useContext } from "react"
    import {
    Program,
    AnchorProvider,
    Idl,
    setProvider,
    } from "@project-serum/anchor"
    import { MovieReview, IDL } from "./movie_review"
    import { Connection, PublicKey } from "@solana/web3.js"
    import { useAnchorWallet, useConnection } from "@solana/wallet-adapter-react"
    import MockWallet from "./MockWallet"
    const WorkspaceContext = createContext({})
    const programId = new PublicKey("BouTUP7a3MZLtXqMAm1NrkJSKwAjmid8abqiNjUyBJSr")

    interface WorkSpace {
    connection?: Connection
    provider?: AnchorProvider
    program?: Program<MovieReview>
    }

    const WorkspaceProvider = ({ children }: any) => {
    const wallet = useAnchorWallet() || MockWallet
    const { connection } = useConnection()

    const provider = new AnchorProvider(connection, wallet, {})

    setProvider(provider)
    const program = new Program(IDL as Idl, programId)
    const workspace = {
    connection,
    provider,
    program,
    }

    return (
    <WorkspaceContext.Provider value={workspace}>
    {children}
    </WorkspaceContext.Provider>
    )
    }

    const useWorkspace = (): WorkSpace => {
    return useContext(WorkspaceContext)
    }

    export { WorkspaceProvider, useWorkspace }
    • ..pages/_app.tsx 文件中。
    • 将整个应用程序包裹在 WorkspaceProvider 中。
    • 现在我们可以在不同的组件中使用 useWorkspace 钩子来访问 program 对象。
    import "../styles/globals.css"
    import type { AppProps } from "next/app"
    import { ChakraProvider } from "@chakra-ui/react"
    import WalletContextProvider from "../context/WalletContextProvider"
    import { WorkspaceProvider } from "../context/Anchor"

    function MyApp({ Component, pageProps }: AppProps) {
    return (
    <WalletContextProvider>
    <ChakraProvider>
    <WorkspaceProvider>
    <Component {...pageProps} />
    </WorkspaceProvider>
    </ChakraProvider>
    </WalletContextProvider>
    )
    }

    export default MyApp

    Form.tsx

    • handleSubmit 函数中:
      • 可以实现根据情况选择调用 addMovieReviewupdateMovieReview 指令。

    在使用Anchor时,利用IDL (Interface Description Language) 的特性可以推断PDA(程序派生地址)账户和其他账户(如系统程序或代币程序),因此无需显式传递这些信息。

    import { FC } from "react"
    import { useState } from "react"
    import {
    Box,
    Button,
    FormControl,
    FormLabel,
    Input,
    NumberDecrementStepper,
    NumberIncrementStepper,
    NumberInput,
    NumberInputField,
    NumberInputStepper,
    Textarea,
    Switch,
    } from "@chakra-ui/react"
    import * as anchor from "@project-serum/anchor"
    import { getAssociatedTokenAddress } from "@solana/spl-token"
    import { useConnection, useWallet } from "@solana/wallet-adapter-react"
    import { useWorkspace } from "../context/Anchor"

    export const Form: FC = () => {
    const [title, setTitle] = useState("")
    const [rating, setRating] = useState(0)
    const [description, setDescription] = useState("")
    const [toggle, setToggle] = useState(true)

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

    const workspace = useWorkspace()
    const program = workspace.program

    const handleSubmit = async (event: any) => {
    event.preventDefault()

    if (!publicKey || !program) {
    alert("Please connect your wallet!")
    return
    }

    const [mintPDA] = await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("mint")],
    program.programId
    )

    const tokenAddress = await getAssociatedTokenAddress(mintPDA, publicKey)

    const transaction = new anchor.web3.Transaction()

    if (toggle) {
    const instruction = await program.methods
    .addMovieReview(title, description, rating)
    .accounts({
    tokenAccount: tokenAddress,
    })
    .instruction()

    transaction.add(instruction)
    } else {
    const instruction = await program.methods
    .updateMovieReview(title, description, rating)
    .instruction()

    transaction.add(instruction)
    }

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

    return (
    <Box
    p={4}
    display={{ md: "flex" }}
    maxWidth="32rem"
    borderWidth={1}
    margin={2}
    justifyContent="center"
    >
    <form onSubmit={handleSubmit}>
    <FormControl isRequired>
    <FormLabel color="gray.200">Movie Title</FormLabel>
    <Input
    id="title"
    color="gray.400"
    onChange={(event) => setTitle(event.currentTarget.value)}
    />
    </FormControl>
    <FormControl isRequired>
    <FormLabel color="gray.200">Add your review</FormLabel>
    <Textarea
    id="review"
    color="gray.400"
    onChange={(event) => setDescription(event.currentTarget.value)}
    />
    </FormControl>
    <FormControl isRequired>
    <FormLabel color="gray.200">Rating</FormLabel>
    <NumberInput
    max={5}
    min={1}
    onChange={(valueString) => setRating(parseInt(valueString))}
    >
    <NumberInputField id="amount" color="gray.400" />
    <NumberInputStepper color="gray.400">
    <NumberIncrementStepper />
    <NumberDecrementStepper />
    </NumberInputStepper>
    </NumberInput>
    </FormControl>
    <FormControl display="center" alignItems="center">
    <FormLabel color="gray.100" mt={2}>
    Update
    </FormLabel>
    <Switch
    id="update"
    onChange={(event) => setToggle((prevCheck) => !prevCheck)}
    />
    </FormControl>
    <Button width="full" mt={4} type="submit">
    Submit Review
    </Button>
    </form>
    </Box>
    )
    }

    MovieList.tsx

    • fetchMyReviews
      • 为连接的钱包的评论实施 movieAccountState 账户过滤器
    • fetchAccounts
      • 执行获取所有账户
    • 实现评论的分页
    import { Card } from "./Card"
    import { FC, useEffect, useState } from "react"
    import {
    Button,
    Center,
    HStack,
    Input,
    Spacer,
    Heading,
    } from "@chakra-ui/react"
    import { useWorkspace } from "../context/Anchor"
    import { useWallet } from "@solana/wallet-adapter-react"
    import { useDisclosure } from "@chakra-ui/react"
    import { ReviewDetail } from "./ReviewDetail"

    export const MovieList: FC = () => {
    const { program } = useWorkspace()
    const [movies, setMovies] = useState<any | null>(null)
    const [page, setPage] = useState(1)
    const [search, setSearch] = useState("")
    const [result, setResult] = useState<any | null>(null)
    const [selectedMovie, setSelectedMovie] = useState<any | null>(null)
    const { isOpen, onOpen, onClose } = useDisclosure()
    const wallet = useWallet()

    useEffect(() => {
    const fetchAccounts = async () => {
    if (program) {
    const accounts = (await program.account.movieAccountState.all()) ?? []

    const sort = [...accounts].sort((a, b) =>
    a.account.title > b.account.title ? 1 : -1
    )
    setMovies(sort)
    }
    }
    fetchAccounts()
    }, [])

    useEffect(() => {
    if (movies && search != "") {
    const filtered = movies.filter((movie: any) => {
    return movie.account.title
    .toLowerCase()
    .startsWith(search.toLowerCase())
    })
    setResult(filtered)
    }
    }, [search])

    useEffect(() => {
    if (movies && search == "") {
    const filtered = movies.slice((page - 1) * 3, page * 3)
    setResult(filtered)
    }
    }, [page, movies, search])

    const fetchMyReviews = async () => {
    if (wallet.connected && program) {
    const accounts =
    (await program.account.movieAccountState.all([
    {
    memcmp: {
    offset: 8,
    bytes: wallet.publicKey!.toBase58(),
    },
    },
    ])) ?? []

    const sort = [...accounts].sort((a, b) =>
    a.account.title > b.account.title ? 1 : -1
    )
    setResult(sort)
    } else {
    alert("Please Connect Wallet")
    }
    }

    const handleReviewSelected = (data: any) => {
    setSelectedMovie(data)
    onOpen()
    }

    return (
    <div>
    <Center>
    <Input
    id="search"
    color="gray.400"
    onChange={(event) => setSearch(event.currentTarget.value)}
    placeholder="Search"
    w="97%"
    mt={2}
    mb={2}
    margin={2}
    />
    <Button onClick={fetchMyReviews}>My Reviews</Button>
    </Center>
    <Heading as="h1" size="l" color="white" ml={4} mt={8}>
    Select Review To Comment
    </Heading>
    {selectedMovie && (
    <ReviewDetail isOpen={isOpen} onClose={onClose} movie={selectedMovie} />
    )}
    {result && (
    <div>
    {Object.keys(result).map((key) => {
    const data = result[key as unknown as number]
    return (
    <Card
    key={key}
    movie={data}
    onClick={() => {
    handleReviewSelected(data)
    }}
    />
    )
    })}
    </div>
    )}
    <Center>
    {movies && (
    <HStack w="full" mt={2} mb={8} ml={4} mr={4}>
    {page > 1 && (
    <Button onClick={() => setPage(page - 1)}>Previous</Button>
    )}
    <Spacer />
    {movies.length > page * 3 && (
    <Button onClick={() => setPage(page + 1)}>Next</Button>
    )}
    </HStack>
    )}
    </Center>
    </div>
    )
    }

    ReviewDetail.tsx

    • handleSubmit
      • 实施 addComment

    请注意,Anchor可以使用IDL来推断PDA账户和其他账户(系统程序/代币程序),因此不需要显式传递

    import {
    Button,
    Input,
    Modal,
    ModalOverlay,
    ModalContent,
    ModalHeader,
    ModalCloseButton,
    ModalBody,
    Stack,
    FormControl,
    } from "@chakra-ui/react"
    import { FC, useState } from "react"
    import * as anchor from "@project-serum/anchor"
    import { getAssociatedTokenAddress } from "@solana/spl-token"
    import { CommentList } from "./CommentList"
    import { useConnection, useWallet } from "@solana/wallet-adapter-react"
    import { useWorkspace } from "../context/Anchor"
    import BN from "bn.js"

    interface ReviewDetailProps {
    isOpen: boolean
    onClose: any
    movie: any
    }

    export const ReviewDetail: FC<ReviewDetailProps> = ({
    isOpen,
    onClose,
    movie,
    }: ReviewDetailProps) => {
    const [comment, setComment] = useState("")
    const { connection } = useConnection()
    const { publicKey, sendTransaction } = useWallet()
    const { program } = useWorkspace()

    const handleSubmit = async (event: any) => {
    event.preventDefault()

    if (!publicKey || !program) {
    alert("Please connect your wallet!")
    return
    }

    const movieReview = new anchor.web3.PublicKey(movie.publicKey)

    const [movieReviewCounterPda] =
    await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("counter"), movieReview.toBuffer()],
    program.programId
    )

    const [mintPDA] = await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("mint")],
    program.programId
    )

    const tokenAddress = await getAssociatedTokenAddress(mintPDA, publicKey)

    const transaction = new anchor.web3.Transaction()

    const instruction = await program.methods
    .addComment(comment)
    .accounts({
    movieReview: movieReview,
    movieCommentCounter: movieReviewCounterPda,
    tokenAccount: tokenAddress,
    })
    .instruction()

    transaction.add(instruction)

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

    return (
    <div>
    <Modal isOpen={isOpen} onClose={onClose}>
    <ModalOverlay />
    <ModalContent>
    <ModalHeader
    textTransform="uppercase"
    textAlign={{ base: "center", md: "center" }}
    >
    {movie.account.title}
    </ModalHeader>
    <ModalCloseButton />
    <ModalBody>
    <Stack textAlign={{ base: "center", md: "center" }}>
    <p>{movie.account.description}</p>
    <form onSubmit={handleSubmit}>
    <FormControl isRequired>
    <Input
    id="title"
    color="black"
    onChange={(event) => setComment(event.currentTarget.value)}
    placeholder="Submit a comment..."
    />
    </FormControl>
    <Button width="full" mt={4} type="submit">
    Send
    </Button>
    </form>
    <CommentList movie={movie} />
    </Stack>
    </ModalBody>
    </ModalContent>
    </Modal>
    </div>
    )
    }

    CommentList.tsx

    • fetch
      • 获取账户并筛选特定的电影评论账户
    • 实现评论的分页
    import {
    Button,
    Center,
    HStack,
    Spacer,
    Stack,
    Box,
    Heading,
    } from "@chakra-ui/react"
    import { FC, useState, useEffect } from "react"
    import { useWorkspace } from "../context/Anchor"

    interface CommentListProps {
    movie: any
    }

    export const CommentList: FC<CommentListProps> = ({
    movie,
    }: CommentListProps) => {
    const [page, setPage] = useState(1)
    const [comments, setComments] = useState<any[]>([])
    const [result, setResult] = useState<any[]>([])
    const { program } = useWorkspace()

    useEffect(() => {
    const fetch = async () => {
    if (program) {
    const comments = await program.account.movieComment.all([
    {
    memcmp: {
    offset: 8,
    bytes: movie.publicKey.toBase58(),
    },
    },
    ])

    const sort = [...comments].sort((a, b) =>
    a.account.count > b.account.count ? 1 : -1
    )
    setComments(comments)
    const filtered = sort.slice((page - 1) * 3, page * 3)
    setResult(filtered)
    }
    }
    fetch()
    }, [page])

    return (
    <div>
    <Heading as="h1" size="l" ml={4} mt={2}>
    Existing Comments
    </Heading>
    {result.map((comment, index) => (
    <Box
    p={4}
    textAlign={{ base: "left", md: "left" }}
    display={{ md: "flex" }}
    maxWidth="32rem"
    borderWidth={1}
    margin={2}
    key={index}
    >
    <div>{comment.account.comment}</div>
    </Box>
    ))}
    <Stack>
    <Center>
    <HStack w="full" mt={2} mb={8} ml={4} mr={4}>
    {page > 1 && (
    <Button onClick={() => setPage(page - 1)}>Previous</Button>
    )}
    <Spacer />
    {comments.length > page * 3 && (
    <Button onClick={() => setPage(page + 1)}>Next</Button>
    )}
    </HStack>
    </Center>
    </Stack>
    </div>
    )
    }

    使用以下命令运行:

    npm run dev

    恭喜!你做到了。我们的下一课是你建立和发货的大结局。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/anchor-on-the-front-end/index.html b/Solana-Co-Learn/module5/anchor-on-the-front-end/index.html index 76242a4d9..903bb5133 100644 --- a/Solana-Co-Learn/module5/anchor-on-the-front-end/index.html +++ b/Solana-Co-Learn/module5/anchor-on-the-front-end/index.html @@ -5,13 +5,13 @@ Anchor on the front-end | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/index.html b/Solana-Co-Learn/module5/index.html index 168f80359..4fad2d097 100644 --- a/Solana-Co-Learn/module5/index.html +++ b/Solana-Co-Learn/module5/index.html @@ -5,14 +5,14 @@ 深入Anchor框架 | All in One Solana - +
    Skip to main content
    - +
  • 🏬 前端开发
  • + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/introduction-to-anchor/build-with-solana-frameworks/index.html b/Solana-Co-Learn/module5/introduction-to-anchor/build-with-solana-frameworks/index.html index 92cdc8b94..a9a15496a 100644 --- a/Solana-Co-Learn/module5/introduction-to-anchor/build-with-solana-frameworks/index.html +++ b/Solana-Co-Learn/module5/introduction-to-anchor/build-with-solana-frameworks/index.html @@ -5,14 +5,14 @@ 🧱 使用Anchor框架进行开发 | All in One Solana - +
    Skip to main content

    🧱 使用Anchor框架进行开发

    我们将从零开始。首先与Solana互动的是Ping程序。让我们使用Anchor从头开始构建它。你可以在playground上进行操作,但我建议在本地设置,因为这样测试会更方便。

    我们要构建的是一个相当简单的程序:

    • 设立一个账户
    • 记录某个指令被调用的次数。

    这样,我们需要两个指令:一个用于初始化该账户及其数据结构,另一个用于增加计数。

    Anchor利用Rust的一些独特魔法来处理所有这些问题✨,它被专门设计用于解决许多常见的安全问题,所以你可以构建出更安全的程序!现在,添加initialize指令:

    • #[program] 内实施 initialize 指令
    • initialize 需要一个类型为 InitializeContext,并且不需要额外的指令数据
    • 在指令逻辑中,将 counter 账户的 count 字段设置为 0
    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
    let counter = &mut ctx.accounts.counter;
    counter.count = 0;
    msg!("Counter Account Created");
    msg!("Current Count: { }", counter.count);
    Ok(())
    }

    实施 Context 类型 Initialize

    • 使用 #[derive(Accounts)] 宏来实现 Initialize Context 类型
    • initialize指令需包括:
      • counter - 指令中将初始化的计数器账户
      • user - 初始化的付款人
      • system_program - 用于初始化任何新账户的系统程序
    • 指定账户类型以进行账户验证
    • 使用 #[account(..)] 属性来定义额外的约束条件
    #[derive(Accounts)]
    pub struct Initialize<'info> {
    #[account(init, payer = user, space = 8 + 8)]
    pub counter: Account<'info, Counter>,
    #[account(mut)]
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    实现计数器

    使用#[account]属性来定义一个新的计数器账户类型

    #[account]
    pub struct Counter {
    pub count: u64,
    }

    添加 increment 指令

    • #[program] 内,实施一个 increment 指令,用于增加现有 counter 账户上的 count
    • increment 需要一个类型为 IncrementContext,并且不需额外的指令数据
    • 在指令逻辑中,将现有计数器账户的计数字段增加1
    pub fn increment(ctx: Context<Increment>) -> Result<()> {
    let counter = &mut ctx.accounts.counter;
    msg!("Previous Count: { }", counter.count);
    counter.count = counter.count.checked_add(1).unwrap();
    msg!("Counter Incremented");
    msg!("Current Count: { }", counter.count);
    Ok(())
    }

    实施 Context 类型 Increment

    • 使用 #[derive(Accounts)] 宏来实现 Increment Context 类型
    • increment指令需要:
      • counter - 一个已存在的计数器账户来递增
      • user - 支付交易手续费的付款人
    • 指定账户类型以进行账户验证
    • 使用 #[account(..)] 属性来定义额外的约束条件
    #[derive(Accounts)]
    pub struct Increment<'info> {
    #[account(mut)]
    pub counter: Account<'info, Counter>,
    pub user: Signer<'info>,
    }

    构建,部署,测试

    解决方案:此处查看

    • 构建和部署
    • 使用SolPG进行测试(支持Anchor测试)

    🚢 挑战

    好了,是时候展现你的技能,独立地建造一些东西了。

    概述

    由于我们从一个非常简单的程序开始,所以你的程序看起来几乎和我们刚刚创建的一样。尽量独立从头开始编写代码,不参考之前的代码,这样会更有助于提高。所以请尽量不要在这里复制粘贴。

    行动步骤:

    1. 编写一个新程序,初始化一个 counter 账户,并使用传入指令数据参数设置 count 字段。
    2. 执行 initializeincrementdecrement 指令
    3. 按照我们在演示中的方式,为每个指令编写测试
    4. 使用 anchor deploy 来部署你的程序。如果你愿意,可以像之前一样编写一个脚本来发送交易到你新部署的程序,然后使用Solana Explorer查看程序日志。

    像往常一样,发挥你的创意,超越基本指示,如果你愿意的话,尽情享受吧!

    info

    提示 -如果可能的话,尽量独立完成这个任务!但如果遇到困难,可以参考此仓库的解决方案 - 递减分支

    - +如果可能的话,尽量独立完成这个任务!但如果遇到困难,可以参考此仓库的解决方案 - 递减分支

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/introduction-to-anchor/index.html b/Solana-Co-Learn/module5/introduction-to-anchor/index.html index f36cc02d1..9f4980ce4 100644 --- a/Solana-Co-Learn/module5/introduction-to-anchor/index.html +++ b/Solana-Co-Learn/module5/introduction-to-anchor/index.html @@ -5,13 +5,13 @@ 关于 Anchor 的介绍 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/introduction-to-anchor/setting-up-anchor/index.html b/Solana-Co-Learn/module5/introduction-to-anchor/setting-up-anchor/index.html index 0c5d70016..1544cfe77 100644 --- a/Solana-Co-Learn/module5/introduction-to-anchor/setting-up-anchor/index.html +++ b/Solana-Co-Learn/module5/introduction-to-anchor/setting-up-anchor/index.html @@ -5,13 +5,13 @@ 🛳 设置 Anchor | All in One Solana - +
    -
    Skip to main content

    🛳 设置 Anchor

    你已经像一位先驱者一样原生地构建了 Solana 程序。当然,你可以继续原生地构建,但有了框架的帮助,事情将变得更加轻松迅捷。

    试想一下前端开发中的 React —— 你只需用很少的代码就能做很多事情。Anchor 也与之类似,它将程序划分为不同的部分,使指令逻辑与账户验证和安全检查分开。就像 React 处理状态更新一样,Anchor 能够处理许多基本任务,如账户解析、验证、序列化/反序列化等,让你能够更快速地构建程序。

    通过使用宏捆绑各种样板代码,Anchor 让你能够专注于程序的核心业务逻辑。此外,Anchor 还设计了许多常见的安全检查功能,并允许你轻松定义额外的检查,从而帮助你构建更加安全的程序。

    info

    简单来说,Anchor 可以通过减少你按键的次数,让你快速前进!

    🗂 Anchor 应用程序结构

    以下是具体的操作步骤。

    首先,确保你已经安装了 RustSolana CLI(除非你跳过了某些部分)。此外,你还需要安装 Yarn

    完成这些后,只需根据官方的 Anchor 文档 进行设置。一切顺利的话,运行 anchor --version 时,你会看到一个版本号被打印出来。

    下面是我执行后得到的 Anchor 的具体版本信息:

    anchor --version
    anchor-cli 0.28.0

    现在我们用 Anchor 来设置一个空白的 Solana 程序:

    anchor init <new-workspace-name>

    这将建立以下结构:

    • Anchor.tomlAnchor 配置文件。
    • Cargo.tomlRust 工作区配置文件。
    • package.jsonJavaScript 依赖文件。
    • programs/Solana 程序包的目录。
    • app/:你的应用前端所在地。
    • tests/TypeScript 集成测试的位置。
    • migrations/deploy.js:用于部署迁移到不同版本的程序的脚本。
    • .anchor 文件夹:包含最新程序日志和本地测试账本。

    你现在基本上可以忽略这些文件。打开 programs/<new-workspace-name>/src/lib.rs,你会发现它与我们的原生程序有所不同。Anchor 将定义入口点,我们将使用 Rust 属性告诉 Anchor 我们所有的需求,这样它就能自动化大部分工作。

    当我们使用 #[program] 时,我们实际上是在声明一个 Rust 宏。Anchor 将使用它为我们生成所有必要的本地 Solana 样板代码。

    Anchor CLI 的美妙之处还在于它集成了 TypeScript 测试。只需编写测试,然后使用 Anchor 命令就可以了!

    构建/部署的设置与本地程序相同,只不过使用的命令有所不同。以下是我们的构建方式:

    anchor build

    这将花费几秒钟时间,在工作区中构建适用于 SolanaBPF 运行时程序,并在 target/idl 目录中生成“IDLs”。运行 cargo build-sbf 时,你还应该在终端中看到类似的输出,其中包含一个部署命令。

    这里有一些关于目标文件夹你需要了解的信息:

    • target/deploy :存放部署程序的生成密钥对。
    • target/idl :程序的 IDL 文件,.json 格式。
    • target/typesTypeScriptIDL —— 所有我们需要的类型。
    info

    什么是 IDL

    IDL(接口描述语言)文件是一个 JSON 文件,用于描述程序的接口,它告诉你有哪些函数可用以及它们接受的参数。你可以将其看作程序的 API 文档。

    我们使用 IDL 程序来确定如何与客户端通信(可用的函数、参数等),并使用 TypeScriptIDL 来定义类型。这些是非常重要的,因为要让你的程序开源,你需要发布经过验证的构建版本和 IDLAnchor Programs Registry

    现在,我们想要部署程序。但我们还不能立即开始!我们需要做两件事情 - 获取程序地址并设置网络。

    声明程序ID

    首先,在先前的 lib.rs 文件中,有一个宏 declare_id! ,其中包含一个默认值。现在得版本anchor,在你使用anchor init生成一个新的项目的时候declare_id!中的值是每次都不一样的,为你生成一个新的值。你也可以通过运行 anchor keys list 来查看你的PROGRAM_ID

    使用下面的命令来获取程序的地址:

    anchor keys list

    选择网络

    我们需要解决的第二个问题是:程序默认会部署到本地主机网络。我们可以启动一个本地验证器,或者切换到开发网络。

    作为一个专业人士,我计划直接推送到开发网络,因此我将打开 Anchor.toml 文件,并将 cluster 改为 devnet。只要我拥有足够的开发网络的 SOL,我就可以直接部署。

    anchor deploy

    太好了!希望你能在终端上看到带有 Program Id 的“部署成功”的消息。

    现在,将你的集群更改为 localnet,这样我们就可以进行测试了。在测试过程中,Anchor 会自动设置一个本地验证器!机器人真是太棒了 🤖。

    测试过程相当简单:

    anchor test

    这将在配置的集群上运行一组集成测试套件,在运行之前部署工作区所有程序的新版本。

    就这样!你刚刚成功构建、部署,并测试了你的第一个 Anchor 程序 :D。

    下一步,我们将编写一个定制的 Anchor 程序,以此来体验它的真正威力!

    - +
    Skip to main content

    🛳 设置 Anchor

    你已经像一位先驱者一样原生地构建了 Solana 程序。当然,你可以继续原生地构建,但有了框架的帮助,事情将变得更加轻松迅捷。

    试想一下前端开发中的 React —— 你只需用很少的代码就能做很多事情。Anchor 也与之类似,它将程序划分为不同的部分,使指令逻辑与账户验证和安全检查分开。就像 React 处理状态更新一样,Anchor 能够处理许多基本任务,如账户解析、验证、序列化/反序列化等,让你能够更快速地构建程序。

    通过使用宏捆绑各种样板代码,Anchor 让你能够专注于程序的核心业务逻辑。此外,Anchor 还设计了许多常见的安全检查功能,并允许你轻松定义额外的检查,从而帮助你构建更加安全的程序。

    info

    简单来说,Anchor 可以通过减少你按键的次数,让你快速前进!

    🗂 Anchor 应用程序结构

    以下是具体的操作步骤。

    首先,确保你已经安装了 RustSolana CLI(除非你跳过了某些部分)。此外,你还需要安装 Yarn

    完成这些后,只需根据官方的 Anchor 文档 进行设置。一切顺利的话,运行 anchor --version 时,你会看到一个版本号被打印出来。

    下面是我执行后得到的 Anchor 的具体版本信息:

    anchor --version
    anchor-cli 0.28.0

    现在我们用 Anchor 来设置一个空白的 Solana 程序:

    anchor init <new-workspace-name>

    这将建立以下结构:

    • Anchor.tomlAnchor 配置文件。
    • Cargo.tomlRust 工作区配置文件。
    • package.jsonJavaScript 依赖文件。
    • programs/Solana 程序包的目录。
    • app/:你的应用前端所在地。
    • tests/TypeScript 集成测试的位置。
    • migrations/deploy.js:用于部署迁移到不同版本的程序的脚本。
    • .anchor 文件夹:包含最新程序日志和本地测试账本。

    你现在基本上可以忽略这些文件。打开 programs/<new-workspace-name>/src/lib.rs,你会发现它与我们的原生程序有所不同。Anchor 将定义入口点,我们将使用 Rust 属性告诉 Anchor 我们所有的需求,这样它就能自动化大部分工作。

    当我们使用 #[program] 时,我们实际上是在声明一个 Rust 宏。Anchor 将使用它为我们生成所有必要的本地 Solana 样板代码。

    Anchor CLI 的美妙之处还在于它集成了 TypeScript 测试。只需编写测试,然后使用 Anchor 命令就可以了!

    构建/部署的设置与本地程序相同,只不过使用的命令有所不同。以下是我们的构建方式:

    anchor build

    这将花费几秒钟时间,在工作区中构建适用于 SolanaBPF 运行时程序,并在 target/idl 目录中生成“IDLs”。运行 cargo build-sbf 时,你还应该在终端中看到类似的输出,其中包含一个部署命令。

    这里有一些关于目标文件夹你需要了解的信息:

    • target/deploy :存放部署程序的生成密钥对。
    • target/idl :程序的 IDL 文件,.json 格式。
    • target/typesTypeScriptIDL —— 所有我们需要的类型。
    info

    什么是 IDL

    IDL(接口描述语言)文件是一个 JSON 文件,用于描述程序的接口,它告诉你有哪些函数可用以及它们接受的参数。你可以将其看作程序的 API 文档。

    我们使用 IDL 程序来确定如何与客户端通信(可用的函数、参数等),并使用 TypeScriptIDL 来定义类型。这些是非常重要的,因为要让你的程序开源,你需要发布经过验证的构建版本和 IDLAnchor Programs Registry

    现在,我们想要部署程序。但我们还不能立即开始!我们需要做两件事情 - 获取程序地址并设置网络。

    声明程序ID

    首先,在先前的 lib.rs 文件中,有一个宏 declare_id! ,其中包含一个默认值。现在得版本anchor,在你使用anchor init生成一个新的项目的时候declare_id!中的值是每次都不一样的,为你生成一个新的值。你也可以通过运行 anchor keys list 来查看你的PROGRAM_ID

    使用下面的命令来获取程序的地址:

    anchor keys list

    选择网络

    我们需要解决的第二个问题是:程序默认会部署到本地主机网络。我们可以启动一个本地验证器,或者切换到开发网络。

    作为一个专业人士,我计划直接推送到开发网络,因此我将打开 Anchor.toml 文件,并将 cluster 改为 devnet。只要我拥有足够的开发网络的 SOL,我就可以直接部署。

    anchor deploy

    太好了!希望你能在终端上看到带有 Program Id 的“部署成功”的消息。

    现在,将你的集群更改为 localnet,这样我们就可以进行测试了。在测试过程中,Anchor 会自动设置一个本地验证器!机器人真是太棒了 🤖。

    测试过程相当简单:

    anchor test

    这将在配置的集群上运行一组集成测试套件,在运行之前部署工作区所有程序的新版本。

    就这样!你刚刚成功构建、部署,并测试了你的第一个 Anchor 程序 :D。

    下一步,我们将编写一个定制的 Anchor 程序,以此来体验它的真正威力!

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/introduction-to-anchor/the-anchor-framework/index.html b/Solana-Co-Learn/module5/introduction-to-anchor/the-anchor-framework/index.html index cbe0ab77c..9337b17ae 100644 --- a/Solana-Co-Learn/module5/introduction-to-anchor/the-anchor-framework/index.html +++ b/Solana-Co-Learn/module5/introduction-to-anchor/the-anchor-framework/index.html @@ -5,13 +5,13 @@ 🐟 Anchor 框架 | All in One Solana - +
    -
    Skip to main content

    🐟 Anchor 框架

    当进行本地构建时,我们会将程序分解为多个文件,每个文件负责特定的任务。但由于 Anchor 大大精简了代码量,我们现在可以学习如何将程序组织到单一文件的不同部分中 😎。

    我们可以将所有内容整合到一个文件中,这得益于 Anchor 使用宏来抽象各种重复任务。只需在文件中放置一个宏,让 Anchor 替我们处理,无需编写大量的代码。这也意味着我们能将指令逻辑与账户验证和安全检查分开。

    在我们继续之前,先快速回顾一下过去必须编写许多样板代码的那些无趣部分:

    • 账户验证
    • 安全检查
    • 序列化/反序列化

    Anchor 使用一些 Rust 的巧妙技巧来解决所有这些问题✨。它被设计为处理许多常见的安全问题,使你能够构建更安全的程序!

    🍱 Anchor Program 的结构

    让我们一起深入了解 Anchor program 的结构。

    这是一个相当简洁的程序 — 它初始化一个新账户,并使用从指令中传入的数据更新账户的数据字段。

    你会注意到每个部分都是以宏或属性开始的,这些都有助于扩展你所编写的代码。

    我们有四个主要部分:

    • declare_id! - 程序的链上地址(这取代了 entrypoint!
    • #[program] - 程序的指令逻辑
    • #[derive(Accounts)] - list、验证和反序列化传入指令的账户
    • #[account] - 为程序定义自定义账户类型

    🗿 declare_id!

    让我们先来了解 declare_id! 宏,因为它非常简单:

    这用于指定程序的链上地址(即 PROGRAM_ID)。当你第一次构建 Anchor 程序时,会生成一个新的密钥对(可以使用 anchor keys list 获取)。这个密钥对会作为部署程序的默认密钥对(除非你另外指定)。该密钥对的公钥被用作 PROGRAM_ID 并在 declare_id! 宏中定义。

    👑 #[program]

    #[program] 属性定义了包含所有程序指令的模块(因此是 mod)。这就是你将实现程序中每个指令逻辑的地方。你将为程序支持的每个指令创建一个公共函数。账户验证和安全检查与程序逻辑分离,因此不会出现在此处!

    每个指令都需要两个参数:一个 Context 和指令数据。Anchor 会自动反序列化指令数据,所以我们无需为此担心!

    在我们深入了解这些宏的其他部分之前,我们需要先了解指令逻辑中这个新的 Context 是什么。我们将深入探讨三个层次:Native 层、Rust 层和 Anchor 层,请紧随我来!

    📝 Context

    回想我们在本地处理指令时的工作流程。我们在 process_instruction 函数中传入了 program_idaccountsinstruction_data。除了指令数据外,其余部分可以统称为指令的“Context”。由于程序无状态,因此必须知道指令的上下文。在Anchor中,处理指令只需要Context和数据两部分。

    Context是一个结构体,承载着当前事务的所有信息。它传递到每个指令处理程序中,并包含以下字段:

    pub struct Context<'a, 'b, 'c, 'info, T> {
    /// 当前正在执行的程序ID
    pub program_id: &'a Pubkey,
    /// 反序列化的账户
    pub accounts: &'b mut T,
    /// 剩下的账户信息,但未被反序列化或验证
    /// 直接使用时需小心。
    pub remaining_accounts: &'c [AccountInfo<'info>],
    /// 在约束验证期间找到的Bump种子
    /// 提供此项便利,以便处理程序
    /// 不必重新计算Bump种子或
    /// 将它们作为参数传入。
    pub bumps: BTreeMap<String, u8>
    }

    第二层:Rust。

    我们之前没在Rust中谈论过“生命周期”,这在参数'a, 'b, 'c, 'info' 符号中体现。生命周期是Rust用来追踪引用有效期的机制。每个带生命周期标记的属性都与Context的生命周期关联。简而言之,它的意思是,在Context的其他属性消失前,不要释放或解引用它,以免出现悬挂引用。但现阶段我们无需过多深究,因为这对我们即将要做的事情影响不大。

    pub accounts: &'b mut T,

    重要的是 T,这是一个通用占位符,代表一种类型。这意味着Context将包含一个类型,并且该类型可以在运行时确定。

    简单来说,我们告诉Rust:“嘿,我现在还不知道accounts的确切类型,我会在实际使用时告诉你。”

    第三层:Anchor

    在运行时,accounts的类型变为我们在InstructionAccounts中定义的类型。这意味着我们的instruction_one函数现在能够访问在InstructionAccounts中声明的账户。

    • 执行程序的PROGRAM_IDctx.program_id
    • 传递到指令中的账户(ctx.accounts
    • 剩余的账户(ctx.remaining_accounts),包括所有传入指令但未在Accounts结构中声明的账户。这是不常用的。
    • 任何PDA账户的Bumpctx.bumps)。把它们放在这里,就不必在指令处理程序内重新计算。

    #[derive(Accounts)]

    让我们回归主题,探讨与#[derive(Accounts)]部分有关的Context类型。

    这是我们定义传入指令的账户的地方。#[derive(Accounts)]宏让Anchor创建了解析和验证这些账户所需的实现。

    例如,instruction_one需要一个类型为InstructionAccountsContext参数。#[derive(Accounts)]宏实现了InstructionAccounts结构,其中包括三个账户:

    • account_name
    • user
    • system_program

    instruction_one被调用时,程序会:

    • 核对传入指令的账户是否与InstructionAccounts结构中规定的账户类型匹配。
    • 检查账户是否满足指定的附加约束(这是#[account]行的作用)。

    最后,我想强调一下。在一行代码中,我们就执行了一个CPI到系统程序来创建一个账户!是不是有点疯狂?我们无需编写任何创建账户的代码,只需声明要创建的账户,Anchor就会完成剩下的工作!

    最后,对于用户账户,有一个“mut”属性,它标记了账户为可变。由于用户将为此付费(余额会有所变化),因此它必须是可变的。

    🔎 在Anchor中的账户类型

    或许你还记得上周我们使用的AccountInfo类型,当在编写native程序时。每当需要处理账户时,我们都会使用这个类型 - 处理指令、创建交易、进行CPI等。这个类型覆盖了我们可能会用到的各种账户类型,比如PDA、用户账户,甚至系统程序。想想看,使用同一个类型来描述如此多样的参数,的确有些奇特。

    Anchor将原生类型包裹起来,提供了一系列新类型,每个都带有不同的验证。我们不再需要在指令中检查是否拥有一个账户,因为我们可以声明它为特定类型,Anchor会为我们进行验证!

    下面让我们了解一下几种常见的类型,首先是Account

    你会注意到account_nameAccount类型的,它基本上是对AccountInfo的扩展,我们在原生开发中已经用过了。那么它在这里的作用是什么呢?

    对于account_name账户,Account包装器会:

    • AccountStruct的格式反序列化data
    • 检查账户的程序所有者是否与指定的账户类型匹配。
    • 当在Accounts包装器中指定的账户类型是使用#[account]宏在同一个crate中定义的时候,程序的所有权检查是针对declare_id!宏中定义的programId进行的。

    简直省了不少力气!

    🖖 Signer类型

    接下来是Signer类型。

    这个类型用来确认账户是否已经签署了交易。

    例如,我们可以要求user账户必须是指令的签署者。我们不检查其他任何内容 - 我们不关心账户的类型或签署者是否拥有该账户。

    如果他们没有签署交易,指令就会失败!

    💻 Program 输入类型

    最后,Program类型确保传入的账户符合我们的预期,并且确实是一个程序(可执行文件)。

    你可能已经开始注意到Anchor是如何让事情变得简单的。这段代码不仅更简洁,还更易于理解!因为每个元素都有自己的类型,所以你能够更快地理解程序的功能。只需掌握几个额外的“规则”就行了 :)

    🤔 额外的限制条件

    到现在为止,我们唯一还没有涉及的是#[account]位,无论是在InstructionAccounts结构体内还是外部。

    让我们先看看#[account]结构体内部:

    这就是我们为账户指定额外限制条件的地方。Anchor在基本验证方面做得很好,但它还能帮我们检查一些其他特定的东西!

    对于account_name属性,它通过#[account(..)]指定了:

    • init - 通过CPI创建和初始化账户,将其设置为账户的discriminator
    • payer - 指定payer为结构中定义的user账户的初始化值。
    • space - 指定为账户分配的space的大小为8 + 8字节。
      • 8个字节是一个discriminatorAnchor会自动添加以识别账户类型。
      • 接下来的8个字节为账户中存储的数据分配空间,其定义在AccountStruct类型中。
      • 更多细节请参考:Space Reference

    再来复习一遍。我们在一行代码中执行一个CPI到系统程序来创建一个账户!想想看,这有多简便?我们不需要手动编写代码来创建账户,我们只需指定要创建的账户,Anchor就会完成剩下的工作!

    最后,对于用户账户,有一个mut属性,表示账户是可变的。因为用户会为此付费,余额可能会变化,所以它必须是可变的。

    #[account]

    再多陪我一会儿,我们已经到了最后的部分!

    #[account]属性用于表现Solana账户的数据结构,并且实现了以下几个Trait

    • AccountSerialize
    • AccountDeserialize
    • AnchorSerialize
    • AnchorDeserialize
    • Clone
    • Discriminator
    • Owner

    简单来说,#[account]属性实现了序列化和反序列化功能,并为账户实现了discriminatorOwner trait

    • discriminator是一个8字节的唯一标识符,代表账户类型,并由账户结构名称的SHA256的前8字节派生。
    • 任何对AccountDeserializetry_deserialize的调用都会检查这个discriminator
    • 如果不匹配,那么账户就会被视为无效,并且账户反序列化会以错误退出。

    #[account]属性还实现了Owner Trait

    • 使用programIddeclareId声明的crate#[account]的使用。
    • 使用程序中定义的#[account]属性初始化的帐户归程序所有

    就是这样,Anchor程序的构建结构就介绍完了。虽然有些复杂,但这些都是我们后续使用Anchor的必要知识。休息一下吧,很快就回来,是时候开始构建了!

    ‼ 赶快回来!

    这真的非常重要——你现在可能无法完全理解其中的全部内容。

    没关系,我也是。我花了整整两天的时间来写这一页。一旦你用Anchor构建了一个程序,再回来重新阅读一遍。你会发现更容易理解,一切都会变得更有意义。

    学习并不是一个线性的过程,它会有高潮和低谷。你不能仅仅通过一次阅读就掌握宇宙中最困难的主题。不断学习,不断建立,你会学得更精,建得更好。

    - +
    Skip to main content

    🐟 Anchor 框架

    当进行本地构建时,我们会将程序分解为多个文件,每个文件负责特定的任务。但由于 Anchor 大大精简了代码量,我们现在可以学习如何将程序组织到单一文件的不同部分中 😎。

    我们可以将所有内容整合到一个文件中,这得益于 Anchor 使用宏来抽象各种重复任务。只需在文件中放置一个宏,让 Anchor 替我们处理,无需编写大量的代码。这也意味着我们能将指令逻辑与账户验证和安全检查分开。

    在我们继续之前,先快速回顾一下过去必须编写许多样板代码的那些无趣部分:

    • 账户验证
    • 安全检查
    • 序列化/反序列化

    Anchor 使用一些 Rust 的巧妙技巧来解决所有这些问题✨。它被设计为处理许多常见的安全问题,使你能够构建更安全的程序!

    🍱 Anchor Program 的结构

    让我们一起深入了解 Anchor program 的结构。

    这是一个相当简洁的程序 — 它初始化一个新账户,并使用从指令中传入的数据更新账户的数据字段。

    你会注意到每个部分都是以宏或属性开始的,这些都有助于扩展你所编写的代码。

    我们有四个主要部分:

    • declare_id! - 程序的链上地址(这取代了 entrypoint!
    • #[program] - 程序的指令逻辑
    • #[derive(Accounts)] - list、验证和反序列化传入指令的账户
    • #[account] - 为程序定义自定义账户类型

    🗿 declare_id!

    让我们先来了解 declare_id! 宏,因为它非常简单:

    这用于指定程序的链上地址(即 PROGRAM_ID)。当你第一次构建 Anchor 程序时,会生成一个新的密钥对(可以使用 anchor keys list 获取)。这个密钥对会作为部署程序的默认密钥对(除非你另外指定)。该密钥对的公钥被用作 PROGRAM_ID 并在 declare_id! 宏中定义。

    👑 #[program]

    #[program] 属性定义了包含所有程序指令的模块(因此是 mod)。这就是你将实现程序中每个指令逻辑的地方。你将为程序支持的每个指令创建一个公共函数。账户验证和安全检查与程序逻辑分离,因此不会出现在此处!

    每个指令都需要两个参数:一个 Context 和指令数据。Anchor 会自动反序列化指令数据,所以我们无需为此担心!

    在我们深入了解这些宏的其他部分之前,我们需要先了解指令逻辑中这个新的 Context 是什么。我们将深入探讨三个层次:Native 层、Rust 层和 Anchor 层,请紧随我来!

    📝 Context

    回想我们在本地处理指令时的工作流程。我们在 process_instruction 函数中传入了 program_idaccountsinstruction_data。除了指令数据外,其余部分可以统称为指令的“Context”。由于程序无状态,因此必须知道指令的上下文。在Anchor中,处理指令只需要Context和数据两部分。

    Context是一个结构体,承载着当前事务的所有信息。它传递到每个指令处理程序中,并包含以下字段:

    pub struct Context<'a, 'b, 'c, 'info, T> {
    /// 当前正在执行的程序ID
    pub program_id: &'a Pubkey,
    /// 反序列化的账户
    pub accounts: &'b mut T,
    /// 剩下的账户信息,但未被反序列化或验证
    /// 直接使用时需小心。
    pub remaining_accounts: &'c [AccountInfo<'info>],
    /// 在约束验证期间找到的Bump种子
    /// 提供此项便利,以便处理程序
    /// 不必重新计算Bump种子或
    /// 将它们作为参数传入。
    pub bumps: BTreeMap<String, u8>
    }

    第二层:Rust。

    我们之前没在Rust中谈论过“生命周期”,这在参数'a, 'b, 'c, 'info' 符号中体现。生命周期是Rust用来追踪引用有效期的机制。每个带生命周期标记的属性都与Context的生命周期关联。简而言之,它的意思是,在Context的其他属性消失前,不要释放或解引用它,以免出现悬挂引用。但现阶段我们无需过多深究,因为这对我们即将要做的事情影响不大。

    pub accounts: &'b mut T,

    重要的是 T,这是一个通用占位符,代表一种类型。这意味着Context将包含一个类型,并且该类型可以在运行时确定。

    简单来说,我们告诉Rust:“嘿,我现在还不知道accounts的确切类型,我会在实际使用时告诉你。”

    第三层:Anchor

    在运行时,accounts的类型变为我们在InstructionAccounts中定义的类型。这意味着我们的instruction_one函数现在能够访问在InstructionAccounts中声明的账户。

    • 执行程序的PROGRAM_IDctx.program_id
    • 传递到指令中的账户(ctx.accounts
    • 剩余的账户(ctx.remaining_accounts),包括所有传入指令但未在Accounts结构中声明的账户。这是不常用的。
    • 任何PDA账户的Bumpctx.bumps)。把它们放在这里,就不必在指令处理程序内重新计算。

    #[derive(Accounts)]

    让我们回归主题,探讨与#[derive(Accounts)]部分有关的Context类型。

    这是我们定义传入指令的账户的地方。#[derive(Accounts)]宏让Anchor创建了解析和验证这些账户所需的实现。

    例如,instruction_one需要一个类型为InstructionAccountsContext参数。#[derive(Accounts)]宏实现了InstructionAccounts结构,其中包括三个账户:

    • account_name
    • user
    • system_program

    instruction_one被调用时,程序会:

    • 核对传入指令的账户是否与InstructionAccounts结构中规定的账户类型匹配。
    • 检查账户是否满足指定的附加约束(这是#[account]行的作用)。

    最后,我想强调一下。在一行代码中,我们就执行了一个CPI到系统程序来创建一个账户!是不是有点疯狂?我们无需编写任何创建账户的代码,只需声明要创建的账户,Anchor就会完成剩下的工作!

    最后,对于用户账户,有一个“mut”属性,它标记了账户为可变。由于用户将为此付费(余额会有所变化),因此它必须是可变的。

    🔎 在Anchor中的账户类型

    或许你还记得上周我们使用的AccountInfo类型,当在编写native程序时。每当需要处理账户时,我们都会使用这个类型 - 处理指令、创建交易、进行CPI等。这个类型覆盖了我们可能会用到的各种账户类型,比如PDA、用户账户,甚至系统程序。想想看,使用同一个类型来描述如此多样的参数,的确有些奇特。

    Anchor将原生类型包裹起来,提供了一系列新类型,每个都带有不同的验证。我们不再需要在指令中检查是否拥有一个账户,因为我们可以声明它为特定类型,Anchor会为我们进行验证!

    下面让我们了解一下几种常见的类型,首先是Account

    你会注意到account_nameAccount类型的,它基本上是对AccountInfo的扩展,我们在原生开发中已经用过了。那么它在这里的作用是什么呢?

    对于account_name账户,Account包装器会:

    • AccountStruct的格式反序列化data
    • 检查账户的程序所有者是否与指定的账户类型匹配。
    • 当在Accounts包装器中指定的账户类型是使用#[account]宏在同一个crate中定义的时候,程序的所有权检查是针对declare_id!宏中定义的programId进行的。

    简直省了不少力气!

    🖖 Signer类型

    接下来是Signer类型。

    这个类型用来确认账户是否已经签署了交易。

    例如,我们可以要求user账户必须是指令的签署者。我们不检查其他任何内容 - 我们不关心账户的类型或签署者是否拥有该账户。

    如果他们没有签署交易,指令就会失败!

    💻 Program 输入类型

    最后,Program类型确保传入的账户符合我们的预期,并且确实是一个程序(可执行文件)。

    你可能已经开始注意到Anchor是如何让事情变得简单的。这段代码不仅更简洁,还更易于理解!因为每个元素都有自己的类型,所以你能够更快地理解程序的功能。只需掌握几个额外的“规则”就行了 :)

    🤔 额外的限制条件

    到现在为止,我们唯一还没有涉及的是#[account]位,无论是在InstructionAccounts结构体内还是外部。

    让我们先看看#[account]结构体内部:

    这就是我们为账户指定额外限制条件的地方。Anchor在基本验证方面做得很好,但它还能帮我们检查一些其他特定的东西!

    对于account_name属性,它通过#[account(..)]指定了:

    • init - 通过CPI创建和初始化账户,将其设置为账户的discriminator
    • payer - 指定payer为结构中定义的user账户的初始化值。
    • space - 指定为账户分配的space的大小为8 + 8字节。
      • 8个字节是一个discriminatorAnchor会自动添加以识别账户类型。
      • 接下来的8个字节为账户中存储的数据分配空间,其定义在AccountStruct类型中。
      • 更多细节请参考:Space Reference

    再来复习一遍。我们在一行代码中执行一个CPI到系统程序来创建一个账户!想想看,这有多简便?我们不需要手动编写代码来创建账户,我们只需指定要创建的账户,Anchor就会完成剩下的工作!

    最后,对于用户账户,有一个mut属性,表示账户是可变的。因为用户会为此付费,余额可能会变化,所以它必须是可变的。

    #[account]

    再多陪我一会儿,我们已经到了最后的部分!

    #[account]属性用于表现Solana账户的数据结构,并且实现了以下几个Trait

    • AccountSerialize
    • AccountDeserialize
    • AnchorSerialize
    • AnchorDeserialize
    • Clone
    • Discriminator
    • Owner

    简单来说,#[account]属性实现了序列化和反序列化功能,并为账户实现了discriminatorOwner trait

    • discriminator是一个8字节的唯一标识符,代表账户类型,并由账户结构名称的SHA256的前8字节派生。
    • 任何对AccountDeserializetry_deserialize的调用都会检查这个discriminator
    • 如果不匹配,那么账户就会被视为无效,并且账户反序列化会以错误退出。

    #[account]属性还实现了Owner Trait

    • 使用programIddeclareId声明的crate#[account]的使用。
    • 使用程序中定义的#[account]属性初始化的帐户归程序所有

    就是这样,Anchor程序的构建结构就介绍完了。虽然有些复杂,但这些都是我们后续使用Anchor的必要知识。休息一下吧,很快就回来,是时候开始构建了!

    ‼ 赶快回来!

    这真的非常重要——你现在可能无法完全理解其中的全部内容。

    没关系,我也是。我花了整整两天的时间来写这一页。一旦你用Anchor构建了一个程序,再回来重新阅读一遍。你会发现更容易理解,一切都会变得更有意义。

    学习并不是一个线性的过程,它会有高潮和低谷。你不能仅仅通过一次阅读就掌握宇宙中最困难的主题。不断学习,不断建立,你会学得更精,建得更好。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/program-in-anchor/build-with-anchor-cpis/index.html b/Solana-Co-Learn/module5/program-in-anchor/build-with-anchor-cpis/index.html index f38fe10b4..68f79d08b 100644 --- a/Solana-Co-Learn/module5/program-in-anchor/build-with-anchor-cpis/index.html +++ b/Solana-Co-Learn/module5/program-in-anchor/build-with-anchor-cpis/index.html @@ -5,13 +5,13 @@ 使用Anchor CPIs构建 | All in One Solana - +
    -
    Skip to main content

    使用Anchor CPIs构建

    回归未来。我们将通过以CPIs结尾的电影评论来为这个话题画上完美的句号。

    这一次,我们将:

    • 添加指令以创建带有元数据的代币铸造
    • 添加指令以添加评论
    • 在创建评论时铸造薄荷代币
    • 在添加评论时铸造薄荷代币

    初始代码

    • 起始代码链接:这里
    • 我们将在之前的PDA演示基础上进行扩展

    首先,我们来定义 create_reward_mint 指令:

    pub fn create_reward_mint(
    ctx: Context<CreateTokenReward>,
    uri: String,
    name: String,
    symbol: String,
    ) -> Result<()> {
    msg!("Create Reward Token");

    let seeds = &["mint".as_bytes(), &[*ctx.bumps.get("reward_mint").unwrap()]];

    let signer = [&seeds[..]];

    let account_info = vec![
    ctx.accounts.metadata.to_account_info(),
    ctx.accounts.reward_mint.to_account_info(),
    ctx.accounts.user.to_account_info(),
    ctx.accounts.token_metadata_program.to_account_info(),
    ctx.accounts.token_program.to_account_info(),
    ctx.accounts.system_program.to_account_info(),
    ctx.accounts.rent.to_account_info(),
    ];

    invoke_signed(
    &create_metadata_accounts_v2(
    ctx.accounts.token_metadata_program.key(),
    ctx.accounts.metadata.key(),
    ctx.accounts.reward_mint.key(),
    ctx.accounts.reward_mint.key(),
    ctx.accounts.user.key(),
    ctx.accounts.user.key(),
    name,
    symbol,
    uri,
    None,
    0,
    true,
    true,
    None,
    None,
    ),
    account_info.as_slice(),
    &signer,
    )?;

    Ok(())
    }

    尽管代码很长,但非常直观!我们正在为Token元数据程序创建一个CPI,用来指向 create_metadata_account_v2 指令。

    接下来,我们会看到 CreateTokenReward 上下文类型。

    有关 /// CHECK 的详细信息在这里:安全检查。

    #[derive(Accounts)]
    pub struct CreateTokenReward<'info> {
    #[account(
    init,
    seeds = ["mint".as_bytes()],
    bump,
    payer = user,
    mint::decimals = 6,
    mint::authority = reward_mint,

    )]
    pub reward_mint: Account<'info, Mint>,

    #[account(mut)]
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
    pub rent: Sysvar<'info, Rent>,
    pub token_program: Program<'info, Token>,

    /// CHECK:
    #[account(mut)]
    pub metadata: AccountInfo<'info>,
    /// CHECK:
    pub token_metadata_program: AccountInfo<'info>,
    }

    创建错误代码(ErrorCode)

    • 用于检查评级的错误代码
    • Anchor已处理我们在原生版本中的其他检查)
    #[error_code]
    pub enum ErrorCode {
    #[msg("评分大于5或小于1")]
    InvalidRating,
    }

    更新 add_movie_review

    • 添加对ErrorCode的检查
    • 设置评论计数器账户
    • 通过CPImintTo 指令,将代币铸造给评论人
    pub fn add_movie_review(
    ctx: Context<AddMovieReview>,
    title: String,
    description: String,
    rating: u8,
    ) -> Result<()> {
    msg!("创建了影评账户");
    msg!("标题:{}", title);
    msg!("描述:{}", description);
    msg!("评分:{}", rating);

    if rating > 5 || rating < 1 {
    msg!("评分不能高于5");
    return err!(ErrorCode::InvalidRating);
    }

    let movie_review = &mut ctx.accounts.movie_review;
    movie_review.reviewer = ctx.accounts.initializer.key();
    movie_review.title = title;
    movie_review.rating = rating;
    movie_review.description = description;

    msg!("创建了影评计数器账户");
    let movie_comment_counter = &mut ctx.accounts.movie_comment_counter;
    movie_comment_counter.counter = 0;
    msg!("计数器:{}", movie_comment_counter.counter);

    let seeds = &["mint".as_bytes(), &[*ctx.bumps.get("reward_mint").unwrap()]];

    let signer = [&seeds[..]];

    let cpi_ctx = CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    token::MintTo {
    mint: ctx.accounts.reward_mint.to_account_info(),
    to: ctx.accounts.token_account.to_account_info(),
    authority: ctx.accounts.reward_mint.to_account_info(),
    },
    &signer,
    );

    token::mint_to(cpi_ctx, 10000000)?;
    msg!("已铸币");
    Ok(())
    }

    更新 AddMovieReview 上下文

    • 初始化 movie_review
    • 初始化 movie_comment_counter
    • 使用 init_if_needed 来初始化令牌账户
    #[derive(Accounts)]
    #[instruction(title: String, description: String)]
    pub struct AddMovieReview<'info> {
    #[account(
    init,
    seeds = [title.as_bytes(), initializer.key().as_ref()],
    bump,
    payer = initializer,
    space = 8 + 32 + 1 + 4 + title.len() + 4 + description.len()
    )]
    pub movie_review: Account<'info, MovieAccountState>,
    #[account(
    init,
    seeds = ["counter".as_bytes(), movie_review.key().as_ref()],
    bump,
    payer = initializer,
    space = 8 + 8
    )]
    pub movie_comment_counter: Account<'info, MovieCommentCounter>,
    #[account(mut,
    seeds = ["mint".as_bytes()],
    bump
    )]
    pub reward_mint: Account<'info, Mint>,
    #[account(
    init_if_needed,
    payer = initializer,
    associated_token::mint = reward_mint,
    associated_token::authority = initializer
    )]
    pub token_account: Account<'info, TokenAccount>,
    #[account(mut)]
    pub initializer: Signer<'info>,
    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub rent: Sysvar<'info, Rent>,
    pub system_program: Program<'info, System>,
    }

    ErrorCode 添加到 update_movie_review

    • update_movie_review 指令中添加 ErrorCode 检查
    pub fn update_movie_review(
    ctx: Context<UpdateMovieReview>,
    title: String,
    description: String,
    rating: u8,
    ) -> Result<()> {
    msg!("更新了影评账户");
    msg!("标题:{}", title);
    msg!("描述:{}", description);
    msg!("评分:{}", rating);

    if rating > 5 || rating < 1 {
    msg!("评分不能高于5");
    return err!(ErrorCode::InvalidRating);
    }

    let movie_review = &mut ctx.accounts.movie_review;
    movie_review.rating = rating;
    movie_review.description = description;

    Ok(())
    }

    添加 add_comment

    • 创建 add_comment 指令
    • 设置 movie_comment 数据
    • 通过 CPImintTo 指令,将代币铸造给审核者
    pub fn add_comment(ctx: Context<AddComment>, comment: String) -> Result<()> {
    msg!("已创建评论账户");
    msg!("评论:{}", comment);

    let movie_comment = &mut ctx.accounts.movie_comment;
    let movie_comment_counter = &mut ctx.accounts.movie_comment_counter;

    movie_comment.review = ctx.accounts.movie_review.key();
    movie_comment.commenter = ctx.accounts.initializer.key();
    movie_comment.comment = comment;
    movie_comment.count = movie_comment_counter.counter;

    movie_comment_counter.counter += 1;

    let seeds = &["mint".as_bytes(), &[*ctx.bumps.get("reward_mint").unwrap()]];

    let signer = [&seeds[..]];

    let cpi_ctx = CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    token::MintTo {
    mint: ctx.accounts.reward_mint.to_account_info(),
    to: ctx.accounts.token_account.to_account_info(),
    authority: ctx.accounts.reward_mint.to_account_info(),
    },
    &signer,
    );

    token::mint_to(cpi_ctx, 5000000)?;
    msg!("已铸造代币");

    Ok(())
    }

    添加 AddComment 上下文

    • 初始化 movie_comment
    • 使用 init_if_needed 来初始化令牌账户
    #[derive(Accounts)]
    #[instruction(comment: String)]
    pub struct AddComment<'info> {
    #[account(
    init,
    seeds = [movie_review.key().as_ref(), &movie_comment_counter.counter.to_le_bytes()],
    bump,
    payer = initializer,
    space = 8 + 32 + 32 + 4 + comment.len() + 8
    )]
    pub movie_comment: Account<'info, MovieComment>,
    pub movie_review: Account<'info, MovieAccountState>,
    #[account(
    mut,
    seeds = ["counter".as_bytes(), movie_review.key().as_ref()],
    bump,
    )]
    pub movie_comment_counter: Account<'info, MovieCommentCounter>,
    #[account(mut,
    seeds = ["mint".as_bytes()],
    bump
    )]
    pub reward_mint: Account<'info, Mint>,
    #[account(
    init_if_needed,
    payer = initializer,
    associated_token::mint = reward_mint,
    associated_token::authority = initializer
    )]
    pub token_account: Account<'info, TokenAccount>,
    #[account(mut)]
    pub initializer: Signer<'info>,
    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub rent: Sysvar<'info, Rent>,
    pub system_program: Program<'info, System>,
    }

    构建,部署,测试

    解决方案:https://beta.solpg.io/6319c7bf77ea7f12846aee87

    如果你使用自己的编辑器,你必须在 mpl-token-metadataCargo.toml 中添加 features = ["no-entrypoint"]

    否则,将会出现以下错误:the #[global_allocator] in this crate conflicts with global allocator in: mpl_token_metadata

    • 构建和部署
    • 使用 SolPG 进行测试
    - +
    Skip to main content

    使用Anchor CPIs构建

    回归未来。我们将通过以CPIs结尾的电影评论来为这个话题画上完美的句号。

    这一次,我们将:

    • 添加指令以创建带有元数据的代币铸造
    • 添加指令以添加评论
    • 在创建评论时铸造薄荷代币
    • 在添加评论时铸造薄荷代币

    初始代码

    • 起始代码链接:这里
    • 我们将在之前的PDA演示基础上进行扩展

    首先,我们来定义 create_reward_mint 指令:

    pub fn create_reward_mint(
    ctx: Context<CreateTokenReward>,
    uri: String,
    name: String,
    symbol: String,
    ) -> Result<()> {
    msg!("Create Reward Token");

    let seeds = &["mint".as_bytes(), &[*ctx.bumps.get("reward_mint").unwrap()]];

    let signer = [&seeds[..]];

    let account_info = vec![
    ctx.accounts.metadata.to_account_info(),
    ctx.accounts.reward_mint.to_account_info(),
    ctx.accounts.user.to_account_info(),
    ctx.accounts.token_metadata_program.to_account_info(),
    ctx.accounts.token_program.to_account_info(),
    ctx.accounts.system_program.to_account_info(),
    ctx.accounts.rent.to_account_info(),
    ];

    invoke_signed(
    &create_metadata_accounts_v2(
    ctx.accounts.token_metadata_program.key(),
    ctx.accounts.metadata.key(),
    ctx.accounts.reward_mint.key(),
    ctx.accounts.reward_mint.key(),
    ctx.accounts.user.key(),
    ctx.accounts.user.key(),
    name,
    symbol,
    uri,
    None,
    0,
    true,
    true,
    None,
    None,
    ),
    account_info.as_slice(),
    &signer,
    )?;

    Ok(())
    }

    尽管代码很长,但非常直观!我们正在为Token元数据程序创建一个CPI,用来指向 create_metadata_account_v2 指令。

    接下来,我们会看到 CreateTokenReward 上下文类型。

    有关 /// CHECK 的详细信息在这里:安全检查。

    #[derive(Accounts)]
    pub struct CreateTokenReward<'info> {
    #[account(
    init,
    seeds = ["mint".as_bytes()],
    bump,
    payer = user,
    mint::decimals = 6,
    mint::authority = reward_mint,

    )]
    pub reward_mint: Account<'info, Mint>,

    #[account(mut)]
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
    pub rent: Sysvar<'info, Rent>,
    pub token_program: Program<'info, Token>,

    /// CHECK:
    #[account(mut)]
    pub metadata: AccountInfo<'info>,
    /// CHECK:
    pub token_metadata_program: AccountInfo<'info>,
    }

    创建错误代码(ErrorCode)

    • 用于检查评级的错误代码
    • Anchor已处理我们在原生版本中的其他检查)
    #[error_code]
    pub enum ErrorCode {
    #[msg("评分大于5或小于1")]
    InvalidRating,
    }

    更新 add_movie_review

    • 添加对ErrorCode的检查
    • 设置评论计数器账户
    • 通过CPImintTo 指令,将代币铸造给评论人
    pub fn add_movie_review(
    ctx: Context<AddMovieReview>,
    title: String,
    description: String,
    rating: u8,
    ) -> Result<()> {
    msg!("创建了影评账户");
    msg!("标题:{}", title);
    msg!("描述:{}", description);
    msg!("评分:{}", rating);

    if rating > 5 || rating < 1 {
    msg!("评分不能高于5");
    return err!(ErrorCode::InvalidRating);
    }

    let movie_review = &mut ctx.accounts.movie_review;
    movie_review.reviewer = ctx.accounts.initializer.key();
    movie_review.title = title;
    movie_review.rating = rating;
    movie_review.description = description;

    msg!("创建了影评计数器账户");
    let movie_comment_counter = &mut ctx.accounts.movie_comment_counter;
    movie_comment_counter.counter = 0;
    msg!("计数器:{}", movie_comment_counter.counter);

    let seeds = &["mint".as_bytes(), &[*ctx.bumps.get("reward_mint").unwrap()]];

    let signer = [&seeds[..]];

    let cpi_ctx = CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    token::MintTo {
    mint: ctx.accounts.reward_mint.to_account_info(),
    to: ctx.accounts.token_account.to_account_info(),
    authority: ctx.accounts.reward_mint.to_account_info(),
    },
    &signer,
    );

    token::mint_to(cpi_ctx, 10000000)?;
    msg!("已铸币");
    Ok(())
    }

    更新 AddMovieReview 上下文

    • 初始化 movie_review
    • 初始化 movie_comment_counter
    • 使用 init_if_needed 来初始化令牌账户
    #[derive(Accounts)]
    #[instruction(title: String, description: String)]
    pub struct AddMovieReview<'info> {
    #[account(
    init,
    seeds = [title.as_bytes(), initializer.key().as_ref()],
    bump,
    payer = initializer,
    space = 8 + 32 + 1 + 4 + title.len() + 4 + description.len()
    )]
    pub movie_review: Account<'info, MovieAccountState>,
    #[account(
    init,
    seeds = ["counter".as_bytes(), movie_review.key().as_ref()],
    bump,
    payer = initializer,
    space = 8 + 8
    )]
    pub movie_comment_counter: Account<'info, MovieCommentCounter>,
    #[account(mut,
    seeds = ["mint".as_bytes()],
    bump
    )]
    pub reward_mint: Account<'info, Mint>,
    #[account(
    init_if_needed,
    payer = initializer,
    associated_token::mint = reward_mint,
    associated_token::authority = initializer
    )]
    pub token_account: Account<'info, TokenAccount>,
    #[account(mut)]
    pub initializer: Signer<'info>,
    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub rent: Sysvar<'info, Rent>,
    pub system_program: Program<'info, System>,
    }

    ErrorCode 添加到 update_movie_review

    • update_movie_review 指令中添加 ErrorCode 检查
    pub fn update_movie_review(
    ctx: Context<UpdateMovieReview>,
    title: String,
    description: String,
    rating: u8,
    ) -> Result<()> {
    msg!("更新了影评账户");
    msg!("标题:{}", title);
    msg!("描述:{}", description);
    msg!("评分:{}", rating);

    if rating > 5 || rating < 1 {
    msg!("评分不能高于5");
    return err!(ErrorCode::InvalidRating);
    }

    let movie_review = &mut ctx.accounts.movie_review;
    movie_review.rating = rating;
    movie_review.description = description;

    Ok(())
    }

    添加 add_comment

    • 创建 add_comment 指令
    • 设置 movie_comment 数据
    • 通过 CPImintTo 指令,将代币铸造给审核者
    pub fn add_comment(ctx: Context<AddComment>, comment: String) -> Result<()> {
    msg!("已创建评论账户");
    msg!("评论:{}", comment);

    let movie_comment = &mut ctx.accounts.movie_comment;
    let movie_comment_counter = &mut ctx.accounts.movie_comment_counter;

    movie_comment.review = ctx.accounts.movie_review.key();
    movie_comment.commenter = ctx.accounts.initializer.key();
    movie_comment.comment = comment;
    movie_comment.count = movie_comment_counter.counter;

    movie_comment_counter.counter += 1;

    let seeds = &["mint".as_bytes(), &[*ctx.bumps.get("reward_mint").unwrap()]];

    let signer = [&seeds[..]];

    let cpi_ctx = CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    token::MintTo {
    mint: ctx.accounts.reward_mint.to_account_info(),
    to: ctx.accounts.token_account.to_account_info(),
    authority: ctx.accounts.reward_mint.to_account_info(),
    },
    &signer,
    );

    token::mint_to(cpi_ctx, 5000000)?;
    msg!("已铸造代币");

    Ok(())
    }

    添加 AddComment 上下文

    • 初始化 movie_comment
    • 使用 init_if_needed 来初始化令牌账户
    #[derive(Accounts)]
    #[instruction(comment: String)]
    pub struct AddComment<'info> {
    #[account(
    init,
    seeds = [movie_review.key().as_ref(), &movie_comment_counter.counter.to_le_bytes()],
    bump,
    payer = initializer,
    space = 8 + 32 + 32 + 4 + comment.len() + 8
    )]
    pub movie_comment: Account<'info, MovieComment>,
    pub movie_review: Account<'info, MovieAccountState>,
    #[account(
    mut,
    seeds = ["counter".as_bytes(), movie_review.key().as_ref()],
    bump,
    )]
    pub movie_comment_counter: Account<'info, MovieCommentCounter>,
    #[account(mut,
    seeds = ["mint".as_bytes()],
    bump
    )]
    pub reward_mint: Account<'info, Mint>,
    #[account(
    init_if_needed,
    payer = initializer,
    associated_token::mint = reward_mint,
    associated_token::authority = initializer
    )]
    pub token_account: Account<'info, TokenAccount>,
    #[account(mut)]
    pub initializer: Signer<'info>,
    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub rent: Sysvar<'info, Rent>,
    pub system_program: Program<'info, System>,
    }

    构建,部署,测试

    解决方案:https://beta.solpg.io/6319c7bf77ea7f12846aee87

    如果你使用自己的编辑器,你必须在 mpl-token-metadataCargo.toml 中添加 features = ["no-entrypoint"]

    否则,将会出现以下错误:the #[global_allocator] in this crate conflicts with global allocator in: mpl_token_metadata

    • 构建和部署
    • 使用 SolPG 进行测试
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/program-in-anchor/build-with-anchor-pdas/index.html b/Solana-Co-Learn/module5/program-in-anchor/build-with-anchor-pdas/index.html index 1ce6b764a..c5743f157 100644 --- a/Solana-Co-Learn/module5/program-in-anchor/build-with-anchor-pdas/index.html +++ b/Solana-Co-Learn/module5/program-in-anchor/build-with-anchor-pdas/index.html @@ -5,13 +5,13 @@ 使用Anchor PDA进行构建 | All in One Solana - +
    -
    Skip to main content

    使用Anchor PDA进行构建

    在深入讨论CPI之前,让我们展示一下这些PDA的魅力吧!🎸

    我们将利用Anchor框架创建一个电影评论程序。

    该程序将让用户能够:

    • 使用PDA初始化一个新的电影评论账户,用于存放评论
    • 更新现有电影评论账户中的内容
    • 关闭现有的电影评论账户

    设置流程

    请访问https://beta.solpg.io/,如果你还没有SolPG钱包,请按照提示创建一个。然后,将lib.rs中的默认代码替换为以下内容:

    use anchor_lang::prelude::*;

    declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");

    #[program]
    pub mod movie_review {
    use super::*;

    }

    🎥 电影账户状态(MovieAccountState)

    我们首先要做的是定义State账户。

    use anchor_lang::prelude::*;

    declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");

    #[program]
    pub mod movie_review {
    use super::*;

    }

    #[account]
    pub struct MovieAccountState {
    pub reviewer: Pubkey, // 评论者
    pub rating: u8, // 评分
    pub title: String, // 标题
    pub description: String, // 描述
    }

    每个电影评论账户将包含以下信息:

    • reviewer - 进行评论的用户
    • rating - 对电影的评分
    • title - 电影的标题
    • description - 评论的具体内容

    到现在为止,一切都相当简洁明了!

    🎬 添加电影评论

    感谢 Anchor 的便利性,我们可以轻松跳过所有的验证和安全检查,直接添加add_movie_review功能:

    #[program]
    pub mod movie_review{
    use super::*;

    pub fn add_movie_review(
    ctx: Context<AddMovieReview>,
    title: String,
    description: String,
    rating: u8,
    ) -> Result<()> {
    msg!("创建了电影评论账户");
    msg!("标题:{}", title);
    msg!("描述:{}", description);
    msg!("评分:{}", rating);

    let movie_review = &mut ctx.accounts.movie_review;
    movie_review.reviewer = ctx.accounts.initializer.key();
    movie_review.title = title;
    movie_review.rating = rating;
    movie_review.description = description;
    Ok(())
    }
    }

    ...

    这些操作对你应该不陌生——这只是我们构建的本地电影评论程序的精简版。

    现在,让我们为此添加Context

    #[program]
    pub mod movie_review {
    use super::*;

    ...
    }

    #[derive(Accounts)]
    #[instruction(title: String, description: String)]
    pub struct AddMovieReview<'info> {
    #[account(
    init,
    seeds = [title.as_bytes(), initializer.key().as_ref()],
    bump,
    payer = initializer,
    space = 8 + 32 + 1 + 4 + title.len() + 4 + description.len()
    )]
    pub movie_review: Account<'info, MovieAccountState>,
    #[account(mut)]
    pub initializer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    ...

    再次强调,我们正以与本地操作完全相同的方式进行操作,但这次我们可以借助Anchor的力量。

    我们正在使用两个seeds来初始化一个新的movie_review账户:

    • title - 指令数据中的电影标题
    • initializer.key() - 创建电影评论的initializer的公钥

    此外,我们还根据space账户类型的结构将资金分配到新账户中。

    🎞 更新电影评论

    没有必要对这个小程序进行测试,我们可以直接完成它!下面是更新函数的代码示例:

    #[program]
    pub mod movie_review {
    use super::*;

    ...

    pub fn update_movie_review(
    ctx: Context<UpdateMovieReview>,
    title: String,
    description: String,
    rating: u8,
    ) -> Result<()> {
    msg!("正在更新电影评论账户");
    msg!("标题:{}", title);
    msg!("描述:{}", description);
    msg!("评分:{}", rating);

    let movie_review = &mut ctx.accounts.movie_review;
    movie_review.rating = rating;
    movie_review.description = description;

    return Ok(());
    }

    }

    ...

    数据参数与add_movie_review相同,主要区别在于我们传入的Context。现在我们来定义它:

    #[program]
    pub mod movie_review {
    use super::*;

    ...
    }

    #[derive(Accounts)]
    #[instruction(title: String, description: String)]
    pub struct UpdateMovieReview<'info> {
    #[account(
    mut,
    seeds = [title.as_bytes(), initializer.key().as_ref()],
    bump,
    realloc = 8 + 32 + 1 + 4 + title.len() + 4 + description.len(),
    realloc::payer = initializer,
    realloc::zero = true,
    )]
    pub movie_review: Account<'info, MovieAccountState>,
    #[account(mut)]
    pub initializer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    ...

    我们使用seedsbump约束来验证movie_review账户。由于可能会有空间的变化,所以我们使用了realloc约束,让Anchor根据更新后的描述长度来自动处理账户空间和租金的重新分配。

    realloc::payer约束规定了所需的额外lamports将来自或发送到初始化账户。

    realloc::zero约束被设置为true,这是因为movie_review账户可能会多次更新,无论是缩小还是扩大分配给该账户的空间都可以灵活应对。

    ❌ 关闭电影评论

    最后一部分是实现close指令,用以关闭已存在的movie_review账户。我们只需要Context类型的Close,不需要其他任何数据!

    #[program]
    pub mod movie_review {
    use super::*;

    ...

    pub fn close(_ctx: Context<Close>) -> Result<()> {
    Ok(())
    }

    }

    ...

    关于这个的Context定义:

    #[program]
    pub mod movie_review {
    use super::*;

    ...
    }

    #[derive(Accounts)]
    pub struct Close<'info> {
    #[account(mut, close = reviewer, has_one = reviewer)]
    movie_review: Account<'info, MovieAccountState>,
    #[account(mut)]
    reviewer: Signer<'info>,
    }

    ...

    我们使用close约束来指明我们要关闭的是movie_review账户,并且租金应退还到reviewer账户。

    has_one约束用于限制关闭账户操作 - reviewer账户必须与电影评论账户上的reviewer相匹配。

    我们完成了!试一下,它应该会像之前的本地电影评论程序一样运行。如果有任何问题,你可以与此处的解决方案代码进行对比 :)

    🚢 挑战(这部分内容和build with solana Framework的内容重复了)

    现在轮到你亲自构建一些内容了。由于我们从一个非常简单的程序开始,你所创建的程序将与我们刚刚创建的程序几乎完全相同。请尽量不要在这里复制粘贴,努力达到能够独立编写代码的程度。

    • 编写一个新程序,初始化一个counter账户,并使用传入指令数据参数来设置count字段。
    • 执行initializeincrementdecrement指令。
    • 按照我们在演示中的做法,为每个指令编写测试。
    • 使用anchor deploy来部署你的程序。如果你愿意,你可以像之前那样编写一个脚本来发送交易到你新部署的程序,然后使用Solana Explorer来查看程序日志。

    像往常一样,对这些挑战充满创意,超越基本指示,如果你愿意,可以发挥你的想象力!

    如果可能的话,请尽量独立完成这个任务!但如果遇到困难,你可以参考这个存储库solution-decrement分支。

    - +
    Skip to main content

    使用Anchor PDA进行构建

    在深入讨论CPI之前,让我们展示一下这些PDA的魅力吧!🎸

    我们将利用Anchor框架创建一个电影评论程序。

    该程序将让用户能够:

    • 使用PDA初始化一个新的电影评论账户,用于存放评论
    • 更新现有电影评论账户中的内容
    • 关闭现有的电影评论账户

    设置流程

    请访问https://beta.solpg.io/,如果你还没有SolPG钱包,请按照提示创建一个。然后,将lib.rs中的默认代码替换为以下内容:

    use anchor_lang::prelude::*;

    declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");

    #[program]
    pub mod movie_review {
    use super::*;

    }

    🎥 电影账户状态(MovieAccountState)

    我们首先要做的是定义State账户。

    use anchor_lang::prelude::*;

    declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");

    #[program]
    pub mod movie_review {
    use super::*;

    }

    #[account]
    pub struct MovieAccountState {
    pub reviewer: Pubkey, // 评论者
    pub rating: u8, // 评分
    pub title: String, // 标题
    pub description: String, // 描述
    }

    每个电影评论账户将包含以下信息:

    • reviewer - 进行评论的用户
    • rating - 对电影的评分
    • title - 电影的标题
    • description - 评论的具体内容

    到现在为止,一切都相当简洁明了!

    🎬 添加电影评论

    感谢 Anchor 的便利性,我们可以轻松跳过所有的验证和安全检查,直接添加add_movie_review功能:

    #[program]
    pub mod movie_review{
    use super::*;

    pub fn add_movie_review(
    ctx: Context<AddMovieReview>,
    title: String,
    description: String,
    rating: u8,
    ) -> Result<()> {
    msg!("创建了电影评论账户");
    msg!("标题:{}", title);
    msg!("描述:{}", description);
    msg!("评分:{}", rating);

    let movie_review = &mut ctx.accounts.movie_review;
    movie_review.reviewer = ctx.accounts.initializer.key();
    movie_review.title = title;
    movie_review.rating = rating;
    movie_review.description = description;
    Ok(())
    }
    }

    ...

    这些操作对你应该不陌生——这只是我们构建的本地电影评论程序的精简版。

    现在,让我们为此添加Context

    #[program]
    pub mod movie_review {
    use super::*;

    ...
    }

    #[derive(Accounts)]
    #[instruction(title: String, description: String)]
    pub struct AddMovieReview<'info> {
    #[account(
    init,
    seeds = [title.as_bytes(), initializer.key().as_ref()],
    bump,
    payer = initializer,
    space = 8 + 32 + 1 + 4 + title.len() + 4 + description.len()
    )]
    pub movie_review: Account<'info, MovieAccountState>,
    #[account(mut)]
    pub initializer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    ...

    再次强调,我们正以与本地操作完全相同的方式进行操作,但这次我们可以借助Anchor的力量。

    我们正在使用两个seeds来初始化一个新的movie_review账户:

    • title - 指令数据中的电影标题
    • initializer.key() - 创建电影评论的initializer的公钥

    此外,我们还根据space账户类型的结构将资金分配到新账户中。

    🎞 更新电影评论

    没有必要对这个小程序进行测试,我们可以直接完成它!下面是更新函数的代码示例:

    #[program]
    pub mod movie_review {
    use super::*;

    ...

    pub fn update_movie_review(
    ctx: Context<UpdateMovieReview>,
    title: String,
    description: String,
    rating: u8,
    ) -> Result<()> {
    msg!("正在更新电影评论账户");
    msg!("标题:{}", title);
    msg!("描述:{}", description);
    msg!("评分:{}", rating);

    let movie_review = &mut ctx.accounts.movie_review;
    movie_review.rating = rating;
    movie_review.description = description;

    return Ok(());
    }

    }

    ...

    数据参数与add_movie_review相同,主要区别在于我们传入的Context。现在我们来定义它:

    #[program]
    pub mod movie_review {
    use super::*;

    ...
    }

    #[derive(Accounts)]
    #[instruction(title: String, description: String)]
    pub struct UpdateMovieReview<'info> {
    #[account(
    mut,
    seeds = [title.as_bytes(), initializer.key().as_ref()],
    bump,
    realloc = 8 + 32 + 1 + 4 + title.len() + 4 + description.len(),
    realloc::payer = initializer,
    realloc::zero = true,
    )]
    pub movie_review: Account<'info, MovieAccountState>,
    #[account(mut)]
    pub initializer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    ...

    我们使用seedsbump约束来验证movie_review账户。由于可能会有空间的变化,所以我们使用了realloc约束,让Anchor根据更新后的描述长度来自动处理账户空间和租金的重新分配。

    realloc::payer约束规定了所需的额外lamports将来自或发送到初始化账户。

    realloc::zero约束被设置为true,这是因为movie_review账户可能会多次更新,无论是缩小还是扩大分配给该账户的空间都可以灵活应对。

    ❌ 关闭电影评论

    最后一部分是实现close指令,用以关闭已存在的movie_review账户。我们只需要Context类型的Close,不需要其他任何数据!

    #[program]
    pub mod movie_review {
    use super::*;

    ...

    pub fn close(_ctx: Context<Close>) -> Result<()> {
    Ok(())
    }

    }

    ...

    关于这个的Context定义:

    #[program]
    pub mod movie_review {
    use super::*;

    ...
    }

    #[derive(Accounts)]
    pub struct Close<'info> {
    #[account(mut, close = reviewer, has_one = reviewer)]
    movie_review: Account<'info, MovieAccountState>,
    #[account(mut)]
    reviewer: Signer<'info>,
    }

    ...

    我们使用close约束来指明我们要关闭的是movie_review账户,并且租金应退还到reviewer账户。

    has_one约束用于限制关闭账户操作 - reviewer账户必须与电影评论账户上的reviewer相匹配。

    我们完成了!试一下,它应该会像之前的本地电影评论程序一样运行。如果有任何问题,你可以与此处的解决方案代码进行对比 :)

    🚢 挑战(这部分内容和build with solana Framework的内容重复了)

    现在轮到你亲自构建一些内容了。由于我们从一个非常简单的程序开始,你所创建的程序将与我们刚刚创建的程序几乎完全相同。请尽量不要在这里复制粘贴,努力达到能够独立编写代码的程度。

    • 编写一个新程序,初始化一个counter账户,并使用传入指令数据参数来设置count字段。
    • 执行initializeincrementdecrement指令。
    • 按照我们在演示中的做法,为每个指令编写测试。
    • 使用anchor deploy来部署你的程序。如果你愿意,你可以像之前那样编写一个脚本来发送交易到你新部署的程序,然后使用Solana Explorer来查看程序日志。

    像往常一样,对这些挑战充满创意,超越基本指示,如果你愿意,可以发挥你的想象力!

    如果可能的话,请尽量独立完成这个任务!但如果遇到困难,你可以参考这个存储库solution-decrement分支。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/program-in-anchor/cpis-in-anchor/index.html b/Solana-Co-Learn/module5/program-in-anchor/cpis-in-anchor/index.html index c9fc4756c..bd626985c 100644 --- a/Solana-Co-Learn/module5/program-in-anchor/cpis-in-anchor/index.html +++ b/Solana-Co-Learn/module5/program-in-anchor/cpis-in-anchor/index.html @@ -5,13 +5,13 @@ 🔀 Anchor的CPIs | All in One Solana - +
    -
    Skip to main content

    🔀 Anchor的CPIs

    现在我们可以通过添加CPI(跨程序调用)来提升我们的代码水平。

    首先回顾一下,CPI是通过使用invokeinvoke_signed方法来制作的。

    Anchor框架还提供了一种特殊的CPI制作格式。要使用这种格式,你需要访问所调用程序的CPI模块。一些常见的程序可能会有现成的包供你使用,例如anchor_spl,这可以用于令牌程序。否则,你将需要使用所调用程序的源代码或已发布的IDL(接口定义语言)来生成CPI模块。

    如果没有现成的CPI模块,你仍然可以直接在指令中使用invokeinvoke_signed方法。正如Anchor指令需要Context类型一样,Anchor CPI则使用CpiContext类型。

    CpiContext提供了执行指令所需的所有账户和种子信息。当不需要PDA(程序衍生账户)签名者时,使用CpiContext::new

    CpiContext::new(cpi_program, cpi_accounts)

    当需要一个PDA作为签名者时,使用CpiContext::new_with_signer

    CpiContext::new_with_signer(cpi_program, cpi_accounts, seeds)
    • accounts - 账户列表
    • remaining_accounts - 如果有的话
    • program - 正在调用CPI的程序
    • signer_seeds - 如果需要使用PDA签署CPI
    pub struct CpiContext<'a, 'b, 'c, 'info, T>
    where
    T: ToAccountMetas + ToAccountInfos<'info>,
    {
    pub accounts: T,
    pub remaining_accounts: Vec<AccountInfo<'info>>,
    pub program: AccountInfo<'info>,
    pub signer_seeds: &'a [&'b [&'c [u8]]],
    }

    当不需要signer_seeds时使用CpiContext::new(不使用PDA签名)。

    pub fn new(
    program: AccountInfo<'info>,
    accounts: T
    ) -> Self {
    Self {
    accounts,
    program,
    remaining_accounts: Vec::new(),
    signer_seeds: &[],
    }
    }

    CpiContext::new_with_signer用于在PDA上用种子签名。

    pub fn new_with_signer(
    program: AccountInfo<'info>,
    accounts: T,
    signer_seeds: &'a [&'b [&'c [u8]]],
    ) -> Self {
    Self {
    accounts,
    program,
    signer_seeds,
    remaining_accounts: Vec::new(),
    }
    }

    anchor_spl包还包括了一个token模块,用于简化创建到令牌程序的CPI的过程。

    在这里,“Structs”指的是每个相应的令牌程序指令所需的账户列表。“Functions”指的是每个相应指令的CPI

    例如,下面的MintTo就是所需的账户:

    #[derive(Accounts)]
    pub struct MintTo<'info> {
    pub mint: AccountInfo<'info>,
    pub to: AccountInfo<'info>,
    pub authority: AccountInfo<'info>,
    }

    我们也可以深入了解一下mint_to方法的内部工作原理。

    它使用CpiContext来构建一个到mint_to指令的CPI,并使用invoke_signed来执行CPI

    pub fn mint_to<'a, 'b, 'c, 'info>(
    ctx: CpiContext<'a, 'b, 'c, 'info, MintTo<'info>>,
    amount: u64,
    ) -> Result<()> {
    let ix = spl_token::instruction::mint_to(
    &spl_token::ID,
    ctx.accounts.mint.key,
    ctx.accounts.to.key,
    ctx.accounts.authority.key,
    &[],
    amount,
    )?;
    solana_program::program::invoke_signed(
    &ix,
    &[
    ctx.accounts.to.clone(),
    ctx.accounts.mint.clone(),
    ctx.accounts.authority.clone(),
    ],
    ctx.signer_seeds,
    )
    .map_err(Into::into)
    }

    例如:

    • 使用 mint_to CPI 来铸造代币
    let auth_bump = *ctx.bumps.get("mint_authority").unwrap();
    let seeds = &[
    b"mint".as_ref(),
    &[auth_bump],
    ];
    let signer = &[&seeds[..]];

    let cpi_program = ctx.accounts.token_program.to_account_info();

    let cpi_accounts = MintTo {
    mint: ctx.accounts.token_mint.to_account_info(),
    to: ctx.accounts.token_account.to_account_info(),
    authority: ctx.accounts.mint_authority.to_account_info()
    };

    let cpi_ctx = CpiContext::new_with_signer(cpi_program, cpi_accounts, signer);

    token::mint_to(cpi_ctx, amount)?;

    我们可以重构这个代码段,得到:

    token::mint_to(
    CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    token::MintTo {
    mint: ctx.accounts.mint_account.to_account_info(),
    to: ctx.accounts.token_account.to_account_info(),
    authority: ctx.accounts.mint_authority.to_account_info(),
    },
    &[&[
    b"mint",
    &[*ctx.bumps.get("mint_authority").unwrap()],
    ]]
    ),
    amount,
    )?;

    ❌ Anchor 错误处理

    错误可以分为以下几种类型:

    • 来自 Anchor 框架自身代码的内部错误
    • 用户(也就是你!)定义的自定义错误

    AnchorErrors 能提供许多有关错误的信息,例如:

    • 错误的名称和编号
    • 错误在代码中的位置
    • 违反的约束条件和相关账户

    最后,所有程序会返回一个通用的错误:ProgramError

    Anchor 有许多不同的内部错误代码。虽然这些代码不是为用户所设计,但通过研究可以了解代码和其背后原因的关联,这对理解很有帮助。

    自定义错误代码的编号将从自定义错误偏移量开始。

    你可以使用 error_code 属性为你的程序定义独特的错误。只需将其添加到所选枚举中即可。然后,你可以在程序中将枚举的变体用作错误。

    此外,你还可以使用 msg 为各个变体定义消息。如果发生错误,客户端将显示此错误消息。要实际触发错误,请使用 err!error! 宏。这些宏会将文件和行信息添加到错误中,然后由 anchor 记录。

    #[program]
    mod hello_anchor {
    use super::*;
    pub fn set_data(ctx: Context<SetData>, data: MyAccount) -> Result<()> {
    if data.data >= 100 {
    return err!(MyError::DataTooLarge);
    }
    ctx.accounts.my_account.set_inner(data);
    Ok(())
    }
    }

    #[error_code]
    pub enum MyError {
    #[msg("MyAccount 的数据只能小于 100")]
    DataTooLarge
    }

    你还可以使用 require 宏来简化错误的编写。上面的代码可以简化为下面的样子(注意 >= 翻转为 < )。

    #[program]
    mod hello_anchor {
    use super::*;
    pub fn set_data(ctx: Context<SetData>, data: MyAccount) -> Result<()> {
    require!(data.data < 100, MyError::DataTooLarge);
    ctx.accounts.my_account.set_inner(data);
    Ok(())
    }
    }

    #[error_code]
    pub enum MyError {
    #[msg("MyAccount 的数据只能小于 100")]
    DataTooLarge
    }

    constraint 约束条件

    如果账户不存在,系统将初始化一个账户。如果账户已存在,仍需检查其他的限制条件。

    如果你在使用自定义的编辑器,请确保在 anchor-langCargo.toml 文件中添加了 features = ["init-if-needed"] 特性。

    例如:anchor-lang = {version = "0.26.0", features = ["init-if-needed"]}

    下面是一个关联令牌账户的示例代码:

    #[program]
    mod example {
    use super::*;
    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
    Ok(())
    }
    }

    #[derive(Accounts)]
    pub struct Initialize<'info> {
    #[account(
    init_if_needed,
    payer = payer,
    associated_token::mint = mint,
    associated_token::authority = payer
    )]
    pub token_account: Account<'info, TokenAccount>,
    pub mint: Account<'info, Mint>,
    #[account(mut)]
    pub payer: Signer<'info>,
    pub system_program: Program<'info, System>,
    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub rent: Sysvar<'info, Rent>,
    }

    以下是 init_if_needed 生成的代码(这段代码片段来自 anchor expand 命令):

    let token_account: anchor_lang::accounts::account::Account<TokenAccount> = {
    if !true
    || AsRef::<AccountInfo>::as_ref(&token_account).owner
    == &anchor_lang::solana_program::system_program::ID
    {
    let payer = payer.to_account_info();
    let cpi_program = associated_token_program.to_account_info();
    let cpi_accounts = anchor_spl::associated_token::Create {
    payer: payer.to_account_info(),
    associated_token: token_account.to_account_info(),
    authority: payer.to_account_info(),
    mint: mint.to_account_info(),
    system_program: system_program.to_account_info(),
    token_program: token_program.to_account_info(),
    rent: rent.to_account_info(),
    };
    let cpi_ctx = anchor_lang::context::CpiContext::new(
    cpi_program,
    cpi_accounts,
    );
    anchor_spl::associated_token::create(cpi_ctx)?;
    }
    ...
    }

    通过这个约束条件,可以确保在初始化时根据需要创建关联的令牌账户,使得整个流程更加自动化和智能。

    - +
    Skip to main content

    🔀 Anchor的CPIs

    现在我们可以通过添加CPI(跨程序调用)来提升我们的代码水平。

    首先回顾一下,CPI是通过使用invokeinvoke_signed方法来制作的。

    Anchor框架还提供了一种特殊的CPI制作格式。要使用这种格式,你需要访问所调用程序的CPI模块。一些常见的程序可能会有现成的包供你使用,例如anchor_spl,这可以用于令牌程序。否则,你将需要使用所调用程序的源代码或已发布的IDL(接口定义语言)来生成CPI模块。

    如果没有现成的CPI模块,你仍然可以直接在指令中使用invokeinvoke_signed方法。正如Anchor指令需要Context类型一样,Anchor CPI则使用CpiContext类型。

    CpiContext提供了执行指令所需的所有账户和种子信息。当不需要PDA(程序衍生账户)签名者时,使用CpiContext::new

    CpiContext::new(cpi_program, cpi_accounts)

    当需要一个PDA作为签名者时,使用CpiContext::new_with_signer

    CpiContext::new_with_signer(cpi_program, cpi_accounts, seeds)
    • accounts - 账户列表
    • remaining_accounts - 如果有的话
    • program - 正在调用CPI的程序
    • signer_seeds - 如果需要使用PDA签署CPI
    pub struct CpiContext<'a, 'b, 'c, 'info, T>
    where
    T: ToAccountMetas + ToAccountInfos<'info>,
    {
    pub accounts: T,
    pub remaining_accounts: Vec<AccountInfo<'info>>,
    pub program: AccountInfo<'info>,
    pub signer_seeds: &'a [&'b [&'c [u8]]],
    }

    当不需要signer_seeds时使用CpiContext::new(不使用PDA签名)。

    pub fn new(
    program: AccountInfo<'info>,
    accounts: T
    ) -> Self {
    Self {
    accounts,
    program,
    remaining_accounts: Vec::new(),
    signer_seeds: &[],
    }
    }

    CpiContext::new_with_signer用于在PDA上用种子签名。

    pub fn new_with_signer(
    program: AccountInfo<'info>,
    accounts: T,
    signer_seeds: &'a [&'b [&'c [u8]]],
    ) -> Self {
    Self {
    accounts,
    program,
    signer_seeds,
    remaining_accounts: Vec::new(),
    }
    }

    anchor_spl包还包括了一个token模块,用于简化创建到令牌程序的CPI的过程。

    在这里,“Structs”指的是每个相应的令牌程序指令所需的账户列表。“Functions”指的是每个相应指令的CPI

    例如,下面的MintTo就是所需的账户:

    #[derive(Accounts)]
    pub struct MintTo<'info> {
    pub mint: AccountInfo<'info>,
    pub to: AccountInfo<'info>,
    pub authority: AccountInfo<'info>,
    }

    我们也可以深入了解一下mint_to方法的内部工作原理。

    它使用CpiContext来构建一个到mint_to指令的CPI,并使用invoke_signed来执行CPI

    pub fn mint_to<'a, 'b, 'c, 'info>(
    ctx: CpiContext<'a, 'b, 'c, 'info, MintTo<'info>>,
    amount: u64,
    ) -> Result<()> {
    let ix = spl_token::instruction::mint_to(
    &spl_token::ID,
    ctx.accounts.mint.key,
    ctx.accounts.to.key,
    ctx.accounts.authority.key,
    &[],
    amount,
    )?;
    solana_program::program::invoke_signed(
    &ix,
    &[
    ctx.accounts.to.clone(),
    ctx.accounts.mint.clone(),
    ctx.accounts.authority.clone(),
    ],
    ctx.signer_seeds,
    )
    .map_err(Into::into)
    }

    例如:

    • 使用 mint_to CPI 来铸造代币
    let auth_bump = *ctx.bumps.get("mint_authority").unwrap();
    let seeds = &[
    b"mint".as_ref(),
    &[auth_bump],
    ];
    let signer = &[&seeds[..]];

    let cpi_program = ctx.accounts.token_program.to_account_info();

    let cpi_accounts = MintTo {
    mint: ctx.accounts.token_mint.to_account_info(),
    to: ctx.accounts.token_account.to_account_info(),
    authority: ctx.accounts.mint_authority.to_account_info()
    };

    let cpi_ctx = CpiContext::new_with_signer(cpi_program, cpi_accounts, signer);

    token::mint_to(cpi_ctx, amount)?;

    我们可以重构这个代码段,得到:

    token::mint_to(
    CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    token::MintTo {
    mint: ctx.accounts.mint_account.to_account_info(),
    to: ctx.accounts.token_account.to_account_info(),
    authority: ctx.accounts.mint_authority.to_account_info(),
    },
    &[&[
    b"mint",
    &[*ctx.bumps.get("mint_authority").unwrap()],
    ]]
    ),
    amount,
    )?;

    ❌ Anchor 错误处理

    错误可以分为以下几种类型:

    • 来自 Anchor 框架自身代码的内部错误
    • 用户(也就是你!)定义的自定义错误

    AnchorErrors 能提供许多有关错误的信息,例如:

    • 错误的名称和编号
    • 错误在代码中的位置
    • 违反的约束条件和相关账户

    最后,所有程序会返回一个通用的错误:ProgramError

    Anchor 有许多不同的内部错误代码。虽然这些代码不是为用户所设计,但通过研究可以了解代码和其背后原因的关联,这对理解很有帮助。

    自定义错误代码的编号将从自定义错误偏移量开始。

    你可以使用 error_code 属性为你的程序定义独特的错误。只需将其添加到所选枚举中即可。然后,你可以在程序中将枚举的变体用作错误。

    此外,你还可以使用 msg 为各个变体定义消息。如果发生错误,客户端将显示此错误消息。要实际触发错误,请使用 err!error! 宏。这些宏会将文件和行信息添加到错误中,然后由 anchor 记录。

    #[program]
    mod hello_anchor {
    use super::*;
    pub fn set_data(ctx: Context<SetData>, data: MyAccount) -> Result<()> {
    if data.data >= 100 {
    return err!(MyError::DataTooLarge);
    }
    ctx.accounts.my_account.set_inner(data);
    Ok(())
    }
    }

    #[error_code]
    pub enum MyError {
    #[msg("MyAccount 的数据只能小于 100")]
    DataTooLarge
    }

    你还可以使用 require 宏来简化错误的编写。上面的代码可以简化为下面的样子(注意 >= 翻转为 < )。

    #[program]
    mod hello_anchor {
    use super::*;
    pub fn set_data(ctx: Context<SetData>, data: MyAccount) -> Result<()> {
    require!(data.data < 100, MyError::DataTooLarge);
    ctx.accounts.my_account.set_inner(data);
    Ok(())
    }
    }

    #[error_code]
    pub enum MyError {
    #[msg("MyAccount 的数据只能小于 100")]
    DataTooLarge
    }

    constraint 约束条件

    如果账户不存在,系统将初始化一个账户。如果账户已存在,仍需检查其他的限制条件。

    如果你在使用自定义的编辑器,请确保在 anchor-langCargo.toml 文件中添加了 features = ["init-if-needed"] 特性。

    例如:anchor-lang = {version = "0.26.0", features = ["init-if-needed"]}

    下面是一个关联令牌账户的示例代码:

    #[program]
    mod example {
    use super::*;
    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
    Ok(())
    }
    }

    #[derive(Accounts)]
    pub struct Initialize<'info> {
    #[account(
    init_if_needed,
    payer = payer,
    associated_token::mint = mint,
    associated_token::authority = payer
    )]
    pub token_account: Account<'info, TokenAccount>,
    pub mint: Account<'info, Mint>,
    #[account(mut)]
    pub payer: Signer<'info>,
    pub system_program: Program<'info, System>,
    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub rent: Sysvar<'info, Rent>,
    }

    以下是 init_if_needed 生成的代码(这段代码片段来自 anchor expand 命令):

    let token_account: anchor_lang::accounts::account::Account<TokenAccount> = {
    if !true
    || AsRef::<AccountInfo>::as_ref(&token_account).owner
    == &anchor_lang::solana_program::system_program::ID
    {
    let payer = payer.to_account_info();
    let cpi_program = associated_token_program.to_account_info();
    let cpi_accounts = anchor_spl::associated_token::Create {
    payer: payer.to_account_info(),
    associated_token: token_account.to_account_info(),
    authority: payer.to_account_info(),
    mint: mint.to_account_info(),
    system_program: system_program.to_account_info(),
    token_program: token_program.to_account_info(),
    rent: rent.to_account_info(),
    };
    let cpi_ctx = anchor_lang::context::CpiContext::new(
    cpi_program,
    cpi_accounts,
    );
    anchor_spl::associated_token::create(cpi_ctx)?;
    }
    ...
    }

    通过这个约束条件,可以确保在初始化时根据需要创建关联的令牌账户,使得整个流程更加自动化和智能。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/program-in-anchor/index.html b/Solana-Co-Learn/module5/program-in-anchor/index.html index 065ee6e0c..461b9bc08 100644 --- a/Solana-Co-Learn/module5/program-in-anchor/index.html +++ b/Solana-Co-Learn/module5/program-in-anchor/index.html @@ -5,13 +5,13 @@ Anchor 中的Program | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module5/program-in-anchor/pdas-in-anchor/index.html b/Solana-Co-Learn/module5/program-in-anchor/pdas-in-anchor/index.html index d77149dd9..a1d5123e9 100644 --- a/Solana-Co-Learn/module5/program-in-anchor/pdas-in-anchor/index.html +++ b/Solana-Co-Learn/module5/program-in-anchor/pdas-in-anchor/index.html @@ -3,15 +3,15 @@ -🛣 Anchor中的PDA(程序派生地址) | All in One Solana +🛣 Anchor中的PDA(程序派生地址) | All in One Solana - +
    -
    Skip to main content

    🛣 Anchor中的PDA(程序派生地址)

    🛣 Anchor里的PDAs

    你做得很好!让我们继续深入探讨。

    本课程中,我们将深入探讨如何使用#[account(...)]属性,并深入了解以下限制条件:

    • seedsbump - 初始化和验证PDA
    • realloc - 重新分配账户空间
    • close - 关闭账户

    🛣 Anchor里的PDAs

    我们再次回顾一下,PDA是通过一系列可选的种子、一个bump seed和一个 programId来衍生的。Anchor提供了一种方便的方式来验证带有seedsbump限制的PDA

    在账户验证过程中,Anchor会使用seeds约束中指定的种子生成一个PDA,并确认传入指令的账户是否与找到的PDA匹配。

    当包含bump约束,但未指定具体的bump时,Anchor将默认使用规范bump(即找到有效PDA的第一个bump)。

    在此示例中,通过seedbump约束验证pda_account的地址是否是预期的PDA

    推导PDAseeds包括:

    • example_seed - 一个硬编码的字符串值
    • user.key() - 传入账户的公钥 user
    • instruction_data - 传入指令的数据
      • 你可以通过#[instruction(...)]属性来访问这些数据

    • 使用#[instruction(...)]属性时,指令数据必须按照传入指令的顺序排列
    • 你可以忽略不需要的最后一个参数及其之后的所有参数

    如果输入顺序错误,将会导致错误

    你可以将init约束与seedsbump约束组合,以使用PDA初始化账户。

    init约束必须与以下内容结合使用:

    • payer - 指定用于支付初始化费用的账户
    • space - 新账户所分配的空间大小
    • system_program - 在账户验证结构中必须存在的system_program

    默认情况下,init会将创建账户的所有者设置为当前正在执行的程序。

    • 当使用initseedsbump初始化PDA账户时,所有者必须是正在执行的程序
    • 这是因为创建账户需要签名,只有执行程序的PDA才能提供
    • 如果用于派生PDAprogramId与正在执行的程序的programId不匹配,则PDA账户初始化的签名验证将失败
    • 因为init使用find_program_address来推导PDA,所以不需要指定bump
    • 这意味着PDA将使用规范的bump进行推导
    • 在为执行Anchor程序所初始化和拥有的账户分配space时,请记住前8个字节是保留给唯一账户discriminator的,Anchor程序使用该discriminator来识别程序账户类型

    🧮 重新分配

    在许多情况下,你可能需要更新现有账户而不是创建新账户。Anchor提供了出色的realloc约束,为现有账户重新分配空间提供了一种简便的方法。

    realloc约束必须与以下内容结合使用:

    • mut - 账户必须设置为可变
    • realloc::payer - 账户空间的增加或减少将相应增加或减少账户的lamports
    • realloc::zero - 一个布尔值,用于指定是否应将新内存初始化为零
    • system_program - realloc约束要求在账户验证结构中存在system_program

    例如,重新分配用于存储String类型字段的账户的空间。

    • 使用String类型时,除了String本身所需的空间外,还需要额外的4个字节来存储String的长度
    • 如果账户数据长度是增加的,为了保持租金豁免,Lamport将从realloc::payer转移到程序账户
    • 如果长度减少,Lamport将从程序账户转回realloc::payer
    • 需要realloc::zero约束来确定重新分配后是否应对新内存进行零初始化
    • 在之前减小过空间的账户上增加空间时,应将此约束设置为true

    close 关闭操作

    当你用完一个账户并不再需要它时会发生什么呢?你可以将它关闭!

    通过这样做,你可以腾出空间,并收回用于支付租金的SOL

    执行关闭操作是通过使用 close 约束来完成的:

    • close 约束会在指令执行结束时将账户标记为已关闭,并通过将其discriminator设置为 CLOSED_ACCOUNT_DISCRIMINATOR,同时将其 lamports 发送到特定的账户。
    • discriminator设置为特定的变量,以阻止账户复活攻击(例如,后续指令重新添加租金豁免的lamports)。
    • 我们将关闭名为 data_account 的账户,并将用于租金的lamports发送到名为 receiver 的账户。
    • 然而,目前任何人都可以调用关闭指令并关闭 data_account

    • has_one 约束可以用来核实传入指令的账户是否与存储在 data 账户字段中的账户匹配。
    • 你必须在所使用的账户的 data 字段上应用特定的命名规则,以便进行 has_one 约束检查。
    • 使用 has_one = receiver时:
      • 账户的 data 需要有一个名为 receiver 的字段与之匹配。
      • #[derive(Accounts)] 结构中,账户名称也必须称为 receiver
    • 请注意,虽然使用 close 约束只是一个例子,但 has_one 约束可以有更广泛的用途。
    - +
    Skip to main content

    🛣 Anchor中的PDA(程序派生地址)

    你做得很好!让我们继续深入探讨。

    本课程中,我们将深入探讨如何使用#[account(...)]属性,并深入了解以下限制条件:

    • seedsbump - 初始化和验证PDA
    • realloc - 重新分配账户空间
    • close - 关闭账户

    🛣 Anchor里的PDAs

    我们再次回顾一下,PDA是通过一系列可选的种子、一个bump seed和一个 programId来衍生的。Anchor提供了一种方便的方式来验证带有seedsbump限制的PDA

    #[account(seeds = [], bump)]
    pub pda_account: Account<'info, AccountType>,

    在账户验证过程中,Anchor会使用seeds约束中指定的种子生成一个PDA,并确认传入指令的账户是否与找到的PDA匹配。

    当包含bump约束,但未指定具体的bump时,Anchor将默认使用规范bump(即找到有效PDA的第一个bump)。

    #[derive(Accounts)]
    #[instruction(instruction_data: String)]
    pub struct Example<'info> {
    #[account(seeds = [b"example-seed", user.key().as_ref(), instruction_data.as_ref()]
    pub pad_account: Account<'info, AccountType>,
    #[account(mut)]
    pub user: Signer<'info>,
    }

    在此示例中,通过seedbump约束验证pda_account的地址是否是预期的PDA

    推导PDAseeds包括:

    • example_seed - 一个硬编码的字符串值
    • user.key() - 传入账户的公钥 user
    • instruction_data - 传入指令的数据
      • 你可以通过#[instruction(...)]属性来访问这些数据
    pub fn example_instruction(
    ctx: Context<Example>,
    input_one: String,
    input_two: String,
    input_three: String,
    ) -> Result<()> {
    // ....
    Ok(()
    }

    #[derive(Accounts)]
    #[instruction(input_one: String, input_two: String)]
    pub struct Example<'info> {
    // ...
    }
    • 使用#[instruction(...)]属性时,指令数据必须按照传入指令的顺序排列
    • 你可以忽略不需要的最后一个参数及其之后的所有参数
    #[derive(Accounts)]
    #[instruction(input_one: String, input_two: String)]
    pub struct Example<'info> {
    // ...
    }

    如果输入顺序错误,将会导致错误

    #[derive(Accounts)]
    pub struct InitializedPda<'info> {
    #[account(
    init,
    seeds = [b"example_seed", user.key().as_ref()]
    bump,
    payer = user,
    space = 8 + 8
    )]
    pub pda_account: Account<'info, AccountType>,
    #[account(mut)]
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    #[account]
    pub struct AccountType {
    pub data: u64
    }

    你可以将init约束与seedsbump约束组合,以使用PDA初始化账户。

    init约束必须与以下内容结合使用:

    • payer - 指定用于支付初始化费用的账户
    • space - 新账户所分配的空间大小
    • system_program - 在账户验证结构中必须存在的system_program

    默认情况下,init会将创建账户的所有者设置为当前正在执行的程序。

    • 当使用initseedsbump初始化PDA账户时,所有者必须是正在执行的程序
    • 这是因为创建账户需要签名,只有执行程序的PDA才能提供
    • 如果用于派生PDAprogramId与正在执行的程序的programId不匹配,则PDA账户初始化的签名验证将失败
    • 因为init使用find_program_address来推导PDA,所以不需要指定bump
    • 这意味着PDA将使用规范的bump进行推导
    • 在为执行Anchor程序所初始化和拥有的账户分配space时,请记住前8个字节是保留给唯一账户discriminator的,Anchor程序使用该discriminator来识别程序账户类型

    🧮 重新分配

    在许多情况下,你可能需要更新现有账户而不是创建新账户。Anchor提供了出色的realloc约束,为现有账户重新分配空间提供了一种简便的方法。

    #[derive(Accounts)]
    #[instruction(instruction_data: String)]
    pub struct ReallocExampl<'info> {
    #[account(
    mut,
    seeds = [b"example_seed", user.key().as_ref()]
    bump,
    realloc = 8 + 4 + instruction_data.len(),
    realloc::payer = user,
    realloc::zero = false,
    )]
    pub pda_account: Account<'info, AccountType>,
    #[account(mut)]
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    #[account]
    pub struct AccountType {
    pub data: u64
    }

    realloc约束必须与以下内容结合使用:

    • mut - 账户必须设置为可变
    • realloc::payer - 账户空间的增加或减少将相应增加或减少账户的lamports
    • realloc::zero - 一个布尔值,用于指定是否应将新内存初始化为零
    • system_program - realloc约束要求在账户验证结构中存在system_program

    例如,重新分配用于存储String类型字段的账户的空间。

    • 使用String类型时,除了String本身所需的空间外,还需要额外的4个字节来存储String的长度
    • 如果账户数据长度是增加的,为了保持租金豁免,Lamport将从realloc::payer转移到程序账户
    • 如果长度减少,Lamport将从程序账户转回realloc::payer
    • 需要realloc::zero约束来确定重新分配后是否应对新内存进行零初始化
    • 在之前减小过空间的账户上增加空间时,应将此约束设置为true

    close 关闭操作

    当你用完一个账户并不再需要它时会发生什么呢?你可以将它关闭!

    通过这样做,你可以腾出空间,并收回用于支付租金的SOL

    执行关闭操作是通过使用 close 约束来完成的:

    pub fn close(ctx: Context<Close>) -> Result<()> {
    Ok(())
    }

    #[derive(Accounts)]
    pub struct Close<'info> {
    #[account(mut, close = receiver)]
    pub data_account: Account<'info, AccountType>,
    #[account(mut)]
    pub receiver: Signer<'info>,
    }
    • close 约束会在指令执行结束时将账户标记为已关闭,并通过将其discriminator设置为 CLOSED_ACCOUNT_DISCRIMINATOR,同时将其 lamports 发送到特定的账户。
    • discriminator设置为特定的变量,以阻止账户复活攻击(例如,后续指令重新添加租金豁免的lamports)。
    • 我们将关闭名为 data_account 的账户,并将用于租金的lamports发送到名为 receiver 的账户。
    • 然而,目前任何人都可以调用关闭指令并关闭 data_account
    pub fn close(ctx: Context<Close>) -> Result<()> {
    Ok(())
    }

    #[derive(Accounts)]
    pub struct Close<'info> {
    #[account(mut, close = receiver, has_one = receiver)]
    pub data_account: Account<'info, AccountType>,
    #[account(mut)]
    pub receiver: Signer<'info>,
    }

    #[account]
    pub struct AccountType {
    pub data: String,
    pub receiver: PubKey,
    }
    • has_one 约束可以用来核实传入指令的账户是否与存储在 data 账户字段中的账户匹配。
    • 你必须在所使用的账户的 data 字段上应用特定的命名规则,以便进行 has_one 约束检查。
    • 使用 has_one = receiver时:
      • 账户的 data 需要有一个名为 receiver 的字段与之匹配。
      • #[derive(Accounts)] 结构中,账户名称也必须称为 receiver
    • 请注意,虽然使用 close 约束只是一个例子,但 has_one 约束可以有更广泛的用途。
    info

    这里需要知道的是 has_one 这个限制是很有用的。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/finishing-touches/index.html b/Solana-Co-Learn/module6/finishing-touches/index.html index 3880f4c17..965039db0 100644 --- a/Solana-Co-Learn/module6/finishing-touches/index.html +++ b/Solana-Co-Learn/module6/finishing-touches/index.html @@ -5,13 +5,13 @@ 最后的作品 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/finishing-touches/onwards/index.html b/Solana-Co-Learn/module6/finishing-touches/onwards/index.html index 52168d3f4..ec9c648db 100644 --- a/Solana-Co-Learn/module6/finishing-touches/onwards/index.html +++ b/Solana-Co-Learn/module6/finishing-touches/onwards/index.html @@ -5,13 +5,13 @@ 🌈 前进 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/finishing-touches/preparing-for-takeoff/index.html b/Solana-Co-Learn/module6/finishing-touches/preparing-for-takeoff/index.html index c171a89d1..8e608b308 100644 --- a/Solana-Co-Learn/module6/finishing-touches/preparing-for-takeoff/index.html +++ b/Solana-Co-Learn/module6/finishing-touches/preparing-for-takeoff/index.html @@ -5,13 +5,13 @@ 🚀 准备起飞 | All in One Solana - +
    -
    Skip to main content

    🚀 准备起飞

    好的,让我们一起启动项目吧。在深入探讨/components/Lootbox.tsx文件的逻辑之前,我们先来快速预览一下布局的构造。

    我们将所有相关的组件集中在一起,只需进行三个主要检查:是否有可用的战利品箱、是否存在押注账户,以及总收益是否超过战利品箱的值。如果检查结果为真,则会渲染一个带有各种选项的按钮;否则,用户将会收到一个提示,建议他们继续押注。接下来,我们将深入了解如何处理handleRedeemLoothandleOpenLootbox 函数的逻辑。

    return (
    <Center
    height="120px"
    width="120px"
    bgColor={"containerBg"}
    borderRadius="10px"
    >
    {availableLootbox &&
    stakeAccount &&
    stakeAccount.totalEarned.toNumber() >= availableLootbox ? (
    <Button
    borderRadius="25"
    onClick={mint ? handleRedeemLoot : handleOpenLootbox}
    isLoading={isConfirmingTransaction}
    >
    {mint
    ? "Redeem"
    : userAccountExists
    ? `${availableLootbox} $BLD`
    : "Enable"}
    </Button>
    ) : (
    <Text color="bodyText">Keep Staking</Text>
    )}
    </Center>
    )

    在这个函数体内,首先我们进行了大量的设置和状态定义。其中有一个useEffect钩子用来确保我们拥有公钥、战利品箱程序和质押程序。一旦这些都到位,它就会调用handleStateRefresh方法来刷新状态。

    通过这样的组织,我们可以确保逻辑清晰,并且易于理解和维护。

    export const Lootbox = ({
    stakeAccount,
    nftTokenAccount,
    fetchUpstreamState,
    }: {
    stakeAccount?: StakeAccount
    nftTokenAccount: PublicKey
    fetchUpstreamState: () => void
    }) => {
    const [isConfirmingTransaction, setIsConfirmingTransaction] = useState(false)
    const [availableLootbox, setAvailableLootbox] = useState(0)
    const walletAdapter = useWallet()
    const { stakingProgram, lootboxProgram, switchboardProgram } = useWorkspace()
    const { connection } = useConnection()

    const [userAccountExists, setUserAccountExist] = useState(false)
    const [mint, setMint] = useState<PublicKey>()

    useEffect(() => {
    if (!walletAdapter.publicKey || !lootboxProgram || !stakingProgram) return

    handleStateRefresh(lootboxProgram, walletAdapter.publicKey)
    }, [walletAdapter, lootboxProgram])

    状态的刷新是通过一个独立的函数来完成的,因为在每次交易后都需要调用它。这部分只是通过调用两个函数来实现。

    const handleStateRefresh = async (
    lootboxProgram: Program<LootboxProgram>,
    publicKey: PublicKey
    ) => {
    checkUserAccount(lootboxProgram, publicKey);
    fetchLootboxPointer(lootboxProgram, publicKey);
    }

    checkUserAccount将检查用户状态的PDA,如果存在,则通过调用setUserAccountExist将其设置为true

    // 检查UserState账户是否存在
    // 如果UserState账户存在,还要检查是否有可从战利品箱兑换的物品
    const checkUserAccount = async (
    lootboxProgram: Program<LootboxProgram>,
    publicKey: PublicKey
    ) => {
    try {
    const [userStatePda] = PublicKey.findProgramAddressSync(
    [publicKey.toBytes()],
    lootboxProgram.programId
    );
    const account = await lootboxProgram.account.userState.fetch(userStatePda);
    if (account) {
    setUserAccountExist(true);
    } else {
    setMint(undefined);
    setUserAccountExist(false);
    }
    } catch {}
    }

    fetchLootboxPointer 主要用于获取战利品盒的指针,并设置可用的战利品盒和可兑换的物品。

    const fetchLootboxPointer = async (
    lootboxProgram: Program<LootboxProgram>,
    publicKey: PublicKey
    ) => {
    try {
    const [lootboxPointerPda] = PublicKey.findProgramAddressSync(
    [Buffer.from("lootbox"), publicKey.toBytes()],
    LOOTBOX_PROGRAM_ID
    )

    const lootboxPointer = await lootboxProgram.account.lootboxPointer.fetch(
    lootboxPointerPda
    )

    setAvailableLootbox(lootboxPointer.availableLootbox.toNumber())
    setMint(lootboxPointer.redeemable ? lootboxPointer.mint : undefined)
    } catch (error) {
    console.log(error)
    setAvailableLootbox(10)
    setMint(undefined)
    }
    }

    回到两个主要的逻辑部分,一个是 handleOpenLootbox 。它首先检查我们是否拥有传递给函数所需的所有必要项目,然后调用 openLootbox

    const handleOpenLootbox: MouseEventHandler<HTMLButtonElement> = useCallback(
    async (event) => {
    if (
    event.defaultPrevented ||
    !walletAdapter.publicKey ||
    !lootboxProgram ||
    !switchboardProgram ||
    !stakingProgram
    )
    return

    openLootbox(
    connection,
    userAccountExists,
    walletAdapter.publicKey,
    lootboxProgram,
    switchboardProgram,
    stakingProgram
    )
    },
    [
    lootboxProgram,
    connection,
    walletAdapter,
    userAccountExists,
    walletAdapter,
    switchboardProgram,
    stakingProgram,
    ]
    )

    openLootbox 从检查用户账户是否存在开始,如果不存在,则调用指令文件中的 createInitSwitchboardInstructions ,该文件会返回给我们指令vrfKeypair。如果该账户不存在,我们尚未初始化交换机

    const openLootbox = async (
    connection: Connection,
    userAccountExists: boolean,
    publicKey: PublicKey,
    lootboxProgram: Program<LootboxProgram>,
    switchboardProgram: SwitchboardProgram,
    stakingProgram: Program<AnchorNftStaking>
    ) => {
    if (!userAccountExists) {
    const { instructions, vrfKeypair } =
    await createInitSwitchboardInstructions(
    switchboardProgram,
    lootboxProgram,
    publicKey
    )

    然后我们创建一个新的交易,添加指令并调用我们创建的 sendAndConfirmTransaction 。它以一个对象作为vrfKeypair的签名者。

    const transaction = new Transaction()
    transaction.add(...instructions)
    sendAndConfirmTransaction(connection, walletAdapter, transaction, {
    signers: [vrfKeypair],
    })
    }

    让我们跳出逻辑,看看 sendAndConfirmTransaction 。首先,我们设定我们正在加载 setIsConfirmingTransaction(true)

    然后我们调用发送交易,但我们传递了选项,这是可选的,因为我们并不总是需要它。这是我们如何发送vrfKeypair的签名者,但我们并不总是这样做。

    一旦确认,我们使用 await Promise.all 在我们调用 handleStateRefreshfetchUpstreamState 的地方。后者作为一个属性传入,基本上是在stake组件上的fetch状态函数。

    const sendAndConfirmTransaction = async (
    connection: Connection,
    walletAdapter: WalletContextState,
    transaction: Transaction,
    options?: SendTransactionOptions
    ) => {
    setIsConfirmingTransaction(true)

    try {
    const signature = await walletAdapter.sendTransaction(
    transaction,
    connection,
    options
    )
    const latestBlockhash = await connection.getLatestBlockhash()
    await connection.confirmTransaction(
    {
    blockhash: latestBlockhash.blockhash,
    lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
    signature: signature,
    },
    "finalized"
    )

    console.log("Transaction complete")
    await Promise.all([
    handleStateRefresh(lootboxProgram!, walletAdapter.publicKey!),
    fetchUpstreamState(),
    ])
    } catch (error) {
    console.log(error)
    throw error
    } finally {
    setIsConfirmingTransaction(false)
    }
    }

    现在回到 handleOpenLootboxelse语句,这是处理账户存在的逻辑。所以我们设置了打开战利品箱指令并发送它们。然后调用 sendAndConfirmTransaction 。一旦确认,该函数将把is confirming设置为false,然后我们再次将其设置为true

    ...
    else {
    const instructions = await createOpenLootboxInstructions(
    connection,
    stakingProgram,
    switchboardProgram,
    lootboxProgram,
    publicKey,
    nftTokenAccount,
    availableLootbox
    )

    const transaction = new Transaction()
    transaction.add(...instructions)
    try {
    await sendAndConfirmTransaction(connection, walletAdapter, transaction)
    setIsConfirmingTransaction(true)

    最后,这是等待看到mint被存入战利品箱指针的逻辑,这样我们就可以兑换它。(这段代码只能偶尔工作,不要依赖它,如果可以的话请修复它)。

        const [lootboxPointerPda] = PublicKey.findProgramAddressSync(
    [Buffer.from("lootbox"), publicKey.toBytes()],
    lootboxProgram.programId
    )

    const id = await connection.onAccountChange(
    lootboxPointerPda,
    async (_) => {
    try {
    const account = await lootboxProgram.account.lootboxPointer.fetch(
    lootboxPointerPda
    )
    if (account.redeemable) {
    setMint(account.mint)
    connection.removeAccountChangeListener(id)
    setIsConfirmingTransaction(false)
    }
    } catch (error) {
    console.log("Error in waiter:", error)
    }
    }
    )
    } catch (error) {
    console.log(error)
    }
    }
    }

    快速跳转到 /pages/stake.tsx 。我们做一个小修改,如果有 nftDatanftTokenAccount ,则显示战利品箱,并传入赌注账户、NFT代币账户,并调用fetchstate,将mint address作为上游属性传递。

    <HStack>
    {nftData && nftTokenAccount && (
    <Lootbox
    stakeAccount={stakeAccount}
    nftTokenAccount={nftTokenAccount}
    fetchUpstreamState={() => {
    fetchstate(nftData.mint.address)
    }}
    />
    )}
    </HStack>

    现在希望回顾一下 handleRedeemLoot ,这个过程更加简单明了。我们首先获取相关的令牌。然后使用我们的 retrieveItemFromLootbox 函数创建一个新的交易,然后发送并确认该交易。

    onst handleRedeemLoot: MouseEventHandler<HTMLButtonElement> = useCallback(
    async (event) => {
    if (
    event.defaultPrevented ||
    !walletAdapter.publicKey ||
    !lootboxProgram ||
    !mint
    )
    return

    const userGearAta = await getAssociatedTokenAddress(
    mint,
    walletAdapter.publicKey
    )

    const transaction = new Transaction()
    transaction.add(
    await lootboxProgram.methods
    .retrieveItemFromLootbox()
    .accounts({
    mint: mint,
    userGearAta: userGearAta,
    })
    .instruction()
    )

    sendAndConfirmTransaction(connection, walletAdapter, transaction)
    },
    [walletAdapter, lootboxProgram, mint]
    )

    那是很多的内容,我们跳来跳去的,所以如果你需要参考整个文件的代码,请看这里

    唉,让我们来看看 GearItem 组件。这个组件相对简单一些,也要短得多。

    import { Center, Image, VStack, Text } from "@chakra-ui/react"
    import { Metaplex, walletAdapterIdentity } from "@metaplex-foundation/js"
    import { useConnection, useWallet } from "@solana/wallet-adapter-react"
    import { PublicKey } from "@solana/web3.js"
    import { useEffect, useState } from "react"

    export const GearItem = ({
    item,
    balance,
    }: {
    item: string
    balance: number
    }) => {
    const [metadata, setMetadata] = useState<any>()
    const { connection } = useConnection()
    const walletAdapter = useWallet()

    useEffect(() => {
    const metaplex = Metaplex.make(connection).use(
    walletAdapterIdentity(walletAdapter)
    )

    const mint = new PublicKey(item)

    try {
    metaplex
    .nfts()
    .findByMint({ mintAddress: mint })
    .run()
    .then((nft) => fetch(nft.uri))
    .then((response) => response.json())
    .then((nftData) => setMetadata(nftData))
    } catch (error) {
    console.log("error getting gear token:", error)
    }
    }, [item, connection, walletAdapter])

    return (
    <VStack>
    <Center
    height="120px"
    width="120px"
    bgColor={"containerBg"}
    borderRadius="10px"
    >
    <Image src={metadata?.image ?? ""} alt="gear token" padding={4} />
    </Center>
    <Text color="white" as="b" fontSize="md" width="100%" textAlign="center">
    {`x${balance}`}
    </Text>
    </VStack>
    )
    }

    布局与之前相似,不同的是,现在我们以一张图片来展示齿轮代币,使用代币上的元数据作为来源。在图片下方,我们会显示你拥有的每个齿轮代币的数量。

    关于逻辑部分,我们会传入代表代币铸造的base58编码字符串和你拥有的数量。

    useEffect中,我们创建了一个metaplex对象,并将item字符串转换为公钥。然后我们通过mint调用metaplex来查找物品。一旦得到nft,我们便在nfturi上调用fetch方法,从而可以访问到链下的元数据。我们将响应转换为json格式,并设置为元数据,这样就可以在返回调用中显示一个图像属性。

    切换回stake.tsx文件。首先,我们为齿轮平衡添加了一个状态行。

    const [gearBalances, setGearBalances] = useState<any>({})

    我们在fetchState函数内调用它。

    在获取状态的过程中,我们首先将余额设置为空对象。然后,我们循环遍历不同的齿轮选项,并获取与该铸币相关联的当前用户的ATA。这为我们提供了一个地址,我们用它来获取账户,并将特定齿轮铸币的余额设置为我们所拥有的数字。在循环结束后,我们调用setGearBalances(balances)

    所以,在用户界面中,我们会检查齿轮平衡的长度是否大于零。如果是,就显示所有与齿轮相关的内容;否则,就不显示任何内容。

    <HStack spacing={10} align="start">
    {Object.keys(gearBalances).length > 0 && (
    <VStack alignItems="flex-start">
    <Text color="white" as="b" fontSize="2xl">
    Gear
    </Text>
    <SimpleGrid
    columns={Math.min(2, Object.keys(gearBalances).length)}
    spacing={3}
    >
    {Object.keys(gearBalances).map((key, _) => {
    return (
    <GearItem
    item={key}
    balance={gearBalances[key]}
    key={key}
    />
    )
    })}
    </SimpleGrid>
    </VStack>
    )}
    <VStack alignItems="flex-start">
    <Text color="white" as="b" fontSize="2xl">
    Loot Box
    </Text>
    <HStack>
    {nftData && nftTokenAccount && (
    <Lootbox
    stakeAccount={stakeAccount}
    nftTokenAccount={nftTokenAccount}
    fetchUpstreamState={() => {
    fetchstate(nftData.mint.address)
    }}
    />
    )}
    </HStack>
    </VStack>
    </HStack>

    这部分描述了如何完成检查和显示装备的操作,并提供了存储库中的代码作为参考。

    接下来的步骤由你来决定。你可以权衡要修复哪些错误,以及哪些错误可以接受。然后将所有内容从本地主机迁移出去并发布,这样你就可以分享一个公共链接。

    如果你有兴趣,甚至可以准备并部署到主网。当然,在上线主网之前,还有许多地方可以改进和优化,例如修复错误、添加更多检查、拥有更多的NFT等等。如果这些让你感兴趣,那么就放手一搏吧!

    - +
    Skip to main content

    🚀 准备起飞

    好的,让我们一起启动项目吧。在深入探讨/components/Lootbox.tsx文件的逻辑之前,我们先来快速预览一下布局的构造。

    我们将所有相关的组件集中在一起,只需进行三个主要检查:是否有可用的战利品箱、是否存在押注账户,以及总收益是否超过战利品箱的值。如果检查结果为真,则会渲染一个带有各种选项的按钮;否则,用户将会收到一个提示,建议他们继续押注。接下来,我们将深入了解如何处理handleRedeemLoothandleOpenLootbox 函数的逻辑。

    return (
    <Center
    height="120px"
    width="120px"
    bgColor={"containerBg"}
    borderRadius="10px"
    >
    {availableLootbox &&
    stakeAccount &&
    stakeAccount.totalEarned.toNumber() >= availableLootbox ? (
    <Button
    borderRadius="25"
    onClick={mint ? handleRedeemLoot : handleOpenLootbox}
    isLoading={isConfirmingTransaction}
    >
    {mint
    ? "Redeem"
    : userAccountExists
    ? `${availableLootbox} $BLD`
    : "Enable"}
    </Button>
    ) : (
    <Text color="bodyText">Keep Staking</Text>
    )}
    </Center>
    )

    在这个函数体内,首先我们进行了大量的设置和状态定义。其中有一个useEffect钩子用来确保我们拥有公钥、战利品箱程序和质押程序。一旦这些都到位,它就会调用handleStateRefresh方法来刷新状态。

    通过这样的组织,我们可以确保逻辑清晰,并且易于理解和维护。

    export const Lootbox = ({
    stakeAccount,
    nftTokenAccount,
    fetchUpstreamState,
    }: {
    stakeAccount?: StakeAccount
    nftTokenAccount: PublicKey
    fetchUpstreamState: () => void
    }) => {
    const [isConfirmingTransaction, setIsConfirmingTransaction] = useState(false)
    const [availableLootbox, setAvailableLootbox] = useState(0)
    const walletAdapter = useWallet()
    const { stakingProgram, lootboxProgram, switchboardProgram } = useWorkspace()
    const { connection } = useConnection()

    const [userAccountExists, setUserAccountExist] = useState(false)
    const [mint, setMint] = useState<PublicKey>()

    useEffect(() => {
    if (!walletAdapter.publicKey || !lootboxProgram || !stakingProgram) return

    handleStateRefresh(lootboxProgram, walletAdapter.publicKey)
    }, [walletAdapter, lootboxProgram])

    状态的刷新是通过一个独立的函数来完成的,因为在每次交易后都需要调用它。这部分只是通过调用两个函数来实现。

    const handleStateRefresh = async (
    lootboxProgram: Program<LootboxProgram>,
    publicKey: PublicKey
    ) => {
    checkUserAccount(lootboxProgram, publicKey);
    fetchLootboxPointer(lootboxProgram, publicKey);
    }

    checkUserAccount将检查用户状态的PDA,如果存在,则通过调用setUserAccountExist将其设置为true

    // 检查UserState账户是否存在
    // 如果UserState账户存在,还要检查是否有可从战利品箱兑换的物品
    const checkUserAccount = async (
    lootboxProgram: Program<LootboxProgram>,
    publicKey: PublicKey
    ) => {
    try {
    const [userStatePda] = PublicKey.findProgramAddressSync(
    [publicKey.toBytes()],
    lootboxProgram.programId
    );
    const account = await lootboxProgram.account.userState.fetch(userStatePda);
    if (account) {
    setUserAccountExist(true);
    } else {
    setMint(undefined);
    setUserAccountExist(false);
    }
    } catch {}
    }

    fetchLootboxPointer 主要用于获取战利品盒的指针,并设置可用的战利品盒和可兑换的物品。

    const fetchLootboxPointer = async (
    lootboxProgram: Program<LootboxProgram>,
    publicKey: PublicKey
    ) => {
    try {
    const [lootboxPointerPda] = PublicKey.findProgramAddressSync(
    [Buffer.from("lootbox"), publicKey.toBytes()],
    LOOTBOX_PROGRAM_ID
    )

    const lootboxPointer = await lootboxProgram.account.lootboxPointer.fetch(
    lootboxPointerPda
    )

    setAvailableLootbox(lootboxPointer.availableLootbox.toNumber())
    setMint(lootboxPointer.redeemable ? lootboxPointer.mint : undefined)
    } catch (error) {
    console.log(error)
    setAvailableLootbox(10)
    setMint(undefined)
    }
    }

    回到两个主要的逻辑部分,一个是 handleOpenLootbox 。它首先检查我们是否拥有传递给函数所需的所有必要项目,然后调用 openLootbox

    const handleOpenLootbox: MouseEventHandler<HTMLButtonElement> = useCallback(
    async (event) => {
    if (
    event.defaultPrevented ||
    !walletAdapter.publicKey ||
    !lootboxProgram ||
    !switchboardProgram ||
    !stakingProgram
    )
    return

    openLootbox(
    connection,
    userAccountExists,
    walletAdapter.publicKey,
    lootboxProgram,
    switchboardProgram,
    stakingProgram
    )
    },
    [
    lootboxProgram,
    connection,
    walletAdapter,
    userAccountExists,
    walletAdapter,
    switchboardProgram,
    stakingProgram,
    ]
    )

    openLootbox 从检查用户账户是否存在开始,如果不存在,则调用指令文件中的 createInitSwitchboardInstructions ,该文件会返回给我们指令vrfKeypair。如果该账户不存在,我们尚未初始化交换机

    const openLootbox = async (
    connection: Connection,
    userAccountExists: boolean,
    publicKey: PublicKey,
    lootboxProgram: Program<LootboxProgram>,
    switchboardProgram: SwitchboardProgram,
    stakingProgram: Program<AnchorNftStaking>
    ) => {
    if (!userAccountExists) {
    const { instructions, vrfKeypair } =
    await createInitSwitchboardInstructions(
    switchboardProgram,
    lootboxProgram,
    publicKey
    )

    然后我们创建一个新的交易,添加指令并调用我们创建的 sendAndConfirmTransaction 。它以一个对象作为vrfKeypair的签名者。

    const transaction = new Transaction()
    transaction.add(...instructions)
    sendAndConfirmTransaction(connection, walletAdapter, transaction, {
    signers: [vrfKeypair],
    })
    }

    让我们跳出逻辑,看看 sendAndConfirmTransaction 。首先,我们设定我们正在加载 setIsConfirmingTransaction(true)

    然后我们调用发送交易,但我们传递了选项,这是可选的,因为我们并不总是需要它。这是我们如何发送vrfKeypair的签名者,但我们并不总是这样做。

    一旦确认,我们使用 await Promise.all 在我们调用 handleStateRefreshfetchUpstreamState 的地方。后者作为一个属性传入,基本上是在stake组件上的fetch状态函数。

    const sendAndConfirmTransaction = async (
    connection: Connection,
    walletAdapter: WalletContextState,
    transaction: Transaction,
    options?: SendTransactionOptions
    ) => {
    setIsConfirmingTransaction(true)

    try {
    const signature = await walletAdapter.sendTransaction(
    transaction,
    connection,
    options
    )
    const latestBlockhash = await connection.getLatestBlockhash()
    await connection.confirmTransaction(
    {
    blockhash: latestBlockhash.blockhash,
    lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
    signature: signature,
    },
    "finalized"
    )

    console.log("Transaction complete")
    await Promise.all([
    handleStateRefresh(lootboxProgram!, walletAdapter.publicKey!),
    fetchUpstreamState(),
    ])
    } catch (error) {
    console.log(error)
    throw error
    } finally {
    setIsConfirmingTransaction(false)
    }
    }

    现在回到 handleOpenLootboxelse语句,这是处理账户存在的逻辑。所以我们设置了打开战利品箱指令并发送它们。然后调用 sendAndConfirmTransaction 。一旦确认,该函数将把is confirming设置为false,然后我们再次将其设置为true

    ...
    else {
    const instructions = await createOpenLootboxInstructions(
    connection,
    stakingProgram,
    switchboardProgram,
    lootboxProgram,
    publicKey,
    nftTokenAccount,
    availableLootbox
    )

    const transaction = new Transaction()
    transaction.add(...instructions)
    try {
    await sendAndConfirmTransaction(connection, walletAdapter, transaction)
    setIsConfirmingTransaction(true)

    最后,这是等待看到mint被存入战利品箱指针的逻辑,这样我们就可以兑换它。(这段代码只能偶尔工作,不要依赖它,如果可以的话请修复它)。

        const [lootboxPointerPda] = PublicKey.findProgramAddressSync(
    [Buffer.from("lootbox"), publicKey.toBytes()],
    lootboxProgram.programId
    )

    const id = await connection.onAccountChange(
    lootboxPointerPda,
    async (_) => {
    try {
    const account = await lootboxProgram.account.lootboxPointer.fetch(
    lootboxPointerPda
    )
    if (account.redeemable) {
    setMint(account.mint)
    connection.removeAccountChangeListener(id)
    setIsConfirmingTransaction(false)
    }
    } catch (error) {
    console.log("Error in waiter:", error)
    }
    }
    )
    } catch (error) {
    console.log(error)
    }
    }
    }

    快速跳转到 /pages/stake.tsx 。我们做一个小修改,如果有 nftDatanftTokenAccount ,则显示战利品箱,并传入赌注账户、NFT代币账户,并调用fetchstate,将mint address作为上游属性传递。

    <HStack>
    {nftData && nftTokenAccount && (
    <Lootbox
    stakeAccount={stakeAccount}
    nftTokenAccount={nftTokenAccount}
    fetchUpstreamState={() => {
    fetchstate(nftData.mint.address)
    }}
    />
    )}
    </HStack>

    现在希望回顾一下 handleRedeemLoot ,这个过程更加简单明了。我们首先获取相关的令牌。然后使用我们的 retrieveItemFromLootbox 函数创建一个新的交易,然后发送并确认该交易。

    onst handleRedeemLoot: MouseEventHandler<HTMLButtonElement> = useCallback(
    async (event) => {
    if (
    event.defaultPrevented ||
    !walletAdapter.publicKey ||
    !lootboxProgram ||
    !mint
    )
    return

    const userGearAta = await getAssociatedTokenAddress(
    mint,
    walletAdapter.publicKey
    )

    const transaction = new Transaction()
    transaction.add(
    await lootboxProgram.methods
    .retrieveItemFromLootbox()
    .accounts({
    mint: mint,
    userGearAta: userGearAta,
    })
    .instruction()
    )

    sendAndConfirmTransaction(connection, walletAdapter, transaction)
    },
    [walletAdapter, lootboxProgram, mint]
    )

    那是很多的内容,我们跳来跳去的,所以如果你需要参考整个文件的代码,请看这里

    唉,让我们来看看 GearItem 组件。这个组件相对简单一些,也要短得多。

    import { Center, Image, VStack, Text } from "@chakra-ui/react"
    import { Metaplex, walletAdapterIdentity } from "@metaplex-foundation/js"
    import { useConnection, useWallet } from "@solana/wallet-adapter-react"
    import { PublicKey } from "@solana/web3.js"
    import { useEffect, useState } from "react"

    export const GearItem = ({
    item,
    balance,
    }: {
    item: string
    balance: number
    }) => {
    const [metadata, setMetadata] = useState<any>()
    const { connection } = useConnection()
    const walletAdapter = useWallet()

    useEffect(() => {
    const metaplex = Metaplex.make(connection).use(
    walletAdapterIdentity(walletAdapter)
    )

    const mint = new PublicKey(item)

    try {
    metaplex
    .nfts()
    .findByMint({ mintAddress: mint })
    .run()
    .then((nft) => fetch(nft.uri))
    .then((response) => response.json())
    .then((nftData) => setMetadata(nftData))
    } catch (error) {
    console.log("error getting gear token:", error)
    }
    }, [item, connection, walletAdapter])

    return (
    <VStack>
    <Center
    height="120px"
    width="120px"
    bgColor={"containerBg"}
    borderRadius="10px"
    >
    <Image src={metadata?.image ?? ""} alt="gear token" padding={4} />
    </Center>
    <Text color="white" as="b" fontSize="md" width="100%" textAlign="center">
    {`x${balance}`}
    </Text>
    </VStack>
    )
    }

    布局与之前相似,不同的是,现在我们以一张图片来展示齿轮代币,使用代币上的元数据作为来源。在图片下方,我们会显示你拥有的每个齿轮代币的数量。

    关于逻辑部分,我们会传入代表代币铸造的base58编码字符串和你拥有的数量。

    useEffect中,我们创建了一个metaplex对象,并将item字符串转换为公钥。然后我们通过mint调用metaplex来查找物品。一旦得到nft,我们便在nfturi上调用fetch方法,从而可以访问到链下的元数据。我们将响应转换为json格式,并设置为元数据,这样就可以在返回调用中显示一个图像属性。

    切换回stake.tsx文件。首先,我们为齿轮平衡添加了一个状态行。

    const [gearBalances, setGearBalances] = useState<any>({})

    我们在fetchState函数内调用它。

    在获取状态的过程中,我们首先将余额设置为空对象。然后,我们循环遍历不同的齿轮选项,并获取与该铸币相关联的当前用户的ATA。这为我们提供了一个地址,我们用它来获取账户,并将特定齿轮铸币的余额设置为我们所拥有的数字。在循环结束后,我们调用setGearBalances(balances)

    所以,在用户界面中,我们会检查齿轮平衡的长度是否大于零。如果是,就显示所有与齿轮相关的内容;否则,就不显示任何内容。

    <HStack spacing={10} align="start">
    {Object.keys(gearBalances).length > 0 && (
    <VStack alignItems="flex-start">
    <Text color="white" as="b" fontSize="2xl">
    Gear
    </Text>
    <SimpleGrid
    columns={Math.min(2, Object.keys(gearBalances).length)}
    spacing={3}
    >
    {Object.keys(gearBalances).map((key, _) => {
    return (
    <GearItem
    item={key}
    balance={gearBalances[key]}
    key={key}
    />
    )
    })}
    </SimpleGrid>
    </VStack>
    )}
    <VStack alignItems="flex-start">
    <Text color="white" as="b" fontSize="2xl">
    Loot Box
    </Text>
    <HStack>
    {nftData && nftTokenAccount && (
    <Lootbox
    stakeAccount={stakeAccount}
    nftTokenAccount={nftTokenAccount}
    fetchUpstreamState={() => {
    fetchstate(nftData.mint.address)
    }}
    />
    )}
    </HStack>
    </VStack>
    </HStack>

    这部分描述了如何完成检查和显示装备的操作,并提供了存储库中的代码作为参考。

    接下来的步骤由你来决定。你可以权衡要修复哪些错误,以及哪些错误可以接受。然后将所有内容从本地主机迁移出去并发布,这样你就可以分享一个公共链接。

    如果你有兴趣,甚至可以准备并部署到主网。当然,在上线主网之前,还有许多地方可以改进和优化,例如修复错误、添加更多检查、拥有更多的NFT等等。如果这些让你感兴趣,那么就放手一搏吧!

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/finishing-touches/the-final-pieces/index.html b/Solana-Co-Learn/module6/finishing-touches/the-final-pieces/index.html index d67b0e7a9..3205241d2 100644 --- a/Solana-Co-Learn/module6/finishing-touches/the-final-pieces/index.html +++ b/Solana-Co-Learn/module6/finishing-touches/the-final-pieces/index.html @@ -5,13 +5,13 @@ 🚶‍ 最终作品 | All in One Solana - +
    -
    Skip to main content

    🚶‍ 最终作品

    概述

    终于到了最后的冲刺阶段!恭喜你抵达此地!这对每个人来说都是一次令人激动的旅程。不论你的NFT项目处于何种阶段,都要深呼吸,给自己一个赞扬,你做得非常棒!

    现在,审视一下你手头的成果,然后思考一下,为了让项目做好交付准备,你至少还需要做些什么。如果需要暂时跳过Switchboard的部分,那就这样做。

    现在是时候把你的用户界面与战利品箱和装备指示器连接起来,完成最后的修整工作,然后交付这个作品!

    具体来说,我们需要:

    • 使用GearItemLootbox组件替换UI中使用的模拟ItemBox
    • 添加一个instructions.ts文件,在其中创建函数来:
      • 创建初始化战利品箱和交换机所需的所有指令。
      • 创建打开战利品箱所需的所有指令。
      • 注意:这部分可能有些复杂 - 你可以参考我们的解决方案代码,但也不妨尝试自己的方法。
    • 进行大量的调试和优化。

    坦白说,这个列表可能还远远不够。我们添加了许多组件来确保交易和链上变化后状态得到更新,但它仍有不完美的地方。总有更多的空间可以改进,但不要让完美主义成为你前进的障碍。尽你所能,然后交付吧!

    解决方案代码

    我们的解决方案位于Buildoors代码库solution-lootboxes分支上。与你上次查看的代码可能有些许差异,因此如果你想查看所有更改,请确保从上周的分支查看差异

    有一些引导,但你可以自由开始。祝你好运!

    下一步

    现在,最后一个项目所需的一切都在上一课中。从这一刻起,这就是你和文字之间的事情了,宝贝。我们开始吧!

    我们接下来要深入研究一些代码的更改。从/components/WorkspaceProvider.tsx开始。

    这里只有一些小更改,主要是为了引入switchboard program

    const [switchboardProgram, setProgramSwitchboard] = useState<any>()

    然后,我们加载switchboard program,并使用useEffect设置the program switchboard,确保我们的工作区始终能够及时更新所有所需程序。这可能会是一个挑战,除非你是React的专家,否则请随意深入研究这段代码。

    async function program() {
    let response = await loadSwitchboardProgram(
    "devnet",
    connection,
    ((provider as AnchorProvider).wallet as AnchorWallet).payer
    )
    return response
    }

    useEffect(() => {
    program().then((result) => {
    setProgramSwitchboard(result)
    console.log("result", result)
    })
    }, [connection])

    好的,接下来我们进入 instructions.ts 文件夹中的 utils 文件,这是一个新文件。这里有两个公共函数,分别是 createOpenLootboxInstructions 指令和 createInitSwitchboardInstructions 指令。后者用于打包交换机程序的初始化内容,并初始化抽奖箱程序中的用户。

    export async function createOpenLootboxInstructions(
    connection: Connection,
    stakingProgram: Program<AnchorNftStaking>,
    switchboardProgram: SwitchboardProgram,
    lootboxProgram: Program<LootboxProgram>,
    userPubkey: PublicKey,
    nftTokenAccount: PublicKey,
    box: number
    ): Promise<TransactionInstruction[]> {
    const [userStatePda] = PublicKey.findProgramAddressSync(
    [userPubkey.toBytes()],
    lootboxProgram.programId
    )

    const state = await lootboxProgram.account.userState.fetch(userStatePda)

    const accounts = await getAccountsAndData(
    lootboxProgram,
    switchboardProgram,
    userPubkey,
    state.vrf
    )

    return await createAllOpenLootboxInstructions(
    connection,
    stakingProgram,
    lootboxProgram,
    switchboardProgram,
    accounts,
    nftTokenAccount,
    box
    )
    }

    进一步往下,有一个 getAccountsAndData 函数,它接受四个字段,正如你所见,对于最后一个字段,你需要事先生成或获取vrf账户。这个函数的作用是获取一些账户、增加和其他数据,将它们打包起来,并作为一个对象返回。

    async function getAccountsAndData(
    lootboxProgram: Program<LootboxProgram>,
    switchboardProgram: SwitchboardProgram,
    userPubkey: PublicKey,
    vrfAccount: PublicKey
    ): Promise<AccountsAndDataSuperset> {
    const [userStatePda] = PublicKey.findProgramAddressSync(
    [userPubkey.toBytes()],
    lootboxProgram.programId
    )

    // required switchboard accoount
    const [programStateAccount, stateBump] =
    ProgramStateAccount.fromSeed(switchboardProgram)

    // required switchboard accoount
    const queueAccount = new OracleQueueAccount({
    program: switchboardProgram,
    // devnet permissionless queue
    publicKey: new PublicKey("F8ce7MsckeZAbAGmxjJNetxYXQa9mKr9nnrC3qKubyYy"),
    })

    // required switchboard accoount
    const queueState = await queueAccount.loadData()
    // wrapped SOL is used to pay for switchboard VRF requests
    const wrappedSOLMint = await queueAccount.loadMint()

    // required switchboard accoount
    const [permissionAccount, permissionBump] = PermissionAccount.fromSeed(
    switchboardProgram,
    queueState.authority,
    queueAccount.publicKey,
    vrfAccount
    )

    // required switchboard accoount
    // escrow wrapped SOL token account owned by the VRF account we will initialize
    const escrow = await spl.getAssociatedTokenAddress(
    wrappedSOLMint.address,
    vrfAccount,
    true
    )

    const size = switchboardProgram.account.vrfAccountData.size

    return {
    userPubkey: userPubkey,
    userStatePda: userStatePda,
    vrfAccount: vrfAccount,
    escrow: escrow,
    wrappedSOLMint: wrappedSOLMint,
    programStateAccount: programStateAccount,
    stateBump: stateBump,
    permissionBump: permissionBump,
    queueAccount: queueAccount,
    queueState: queueState,
    permissionAccount: permissionAccount,
    size: size,
    }
    }

    该段描述了在文件底部定义的一个接口对象,这主要是为了确保你拥有所需的所有内容,并能够适当地调用它们。这个接口包括了许多公钥和与程序状态、权限等有关的字段。

    以下是接口的代码定义:

    interface AccountsAndDataSuperset {
    userPubkey: PublicKey
    userStatePda: PublicKey
    vrfAccount: PublicKey
    escrow: PublicKey
    wrappedSOLMint: spl.Mint
    programStateAccount: ProgramStateAccount
    stateBump: number
    permissionBump: number
    queueAccount: OracleQueueAccount
    queueState: any
    permissionAccount: PermissionAccount
    size: number
    }

    该段还深入介绍了createInitSwitchboardInstructions函数。这个函数首先生成一个vrf密钥对,然后调用getAccountsAndData以获取所有必要的账户。接着,通过initSwitchboardLootboxUser,它组装了指令,并返回这些指令和用于签名的vrf密钥对。

    export async function createInitSwitchboardInstructions(
    switchboardProgram: SwitchboardProgram,
    lootboxProgram: Program<LootboxProgram>,
    userPubkey: PublicKey
    ): Promise<{
    instructions: Array<TransactionInstruction>
    vrfKeypair: Keypair
    }> {
    const vrfKeypair = Keypair.generate()

    const accounts = await getAccountsAndData(
    lootboxProgram,
    switchboardProgram,
    userPubkey,
    vrfKeypair.publicKey
    )

    const initInstructions = await initSwitchboardLootboxUser(
    switchboardProgram,
    lootboxProgram,
    accounts,
    vrfKeypair
    )

    return { instructions: initInstructions, vrfKeypair: vrfKeypair }
    }

    关于 initSwitchboardLootboxUser ,我们首先获得一个PDAstate bump

    async function initSwitchboardLootboxUser(
    switchboardProgram: SwitchboardProgram,
    lootboxProgram: Program<LootboxProgram>,
    accountsAndData: AccountsAndDataSuperset,
    vrfKeypair: Keypair
    ): Promise<Array<TransactionInstruction>> {
    // lootbox account PDA
    const [lootboxPointerPda] = await PublicKey.findProgramAddress(
    [Buffer.from("lootbox"), accountsAndData.userPubkey.toBytes()],
    lootboxProgram.programId
    )

    const stateBump = accountsAndData.stateBump

    然后我们开始组装一系列的指令。首先,我们需要做的是创建一个与托管相关的令牌账户,由vrf密钥对拥有。

    const txnIxns: TransactionInstruction[] = [
    // create escrow ATA owned by VRF account
    spl.createAssociatedTokenAccountInstruction(
    accountsAndData.userPubkey,
    accountsAndData.escrow,
    vrfKeypair.publicKey,
    accountsAndData.wrappedSOLMint.address
    ),

    接下来是设置权限指令。

    // transfer escrow ATA owner to switchboard programStateAccount
    spl.createSetAuthorityInstruction(
    accountsAndData.escrow,
    vrfKeypair.publicKey,
    spl.AuthorityType.AccountOwner,
    accountsAndData.programStateAccount.publicKey,
    [vrfKeypair]
    ),

    然后我们调用create account来创建vrf账户。

    // request system program to create new account using newly generated keypair for VRF account
    SystemProgram.createAccount({
    fromPubkey: accountsAndData.userPubkey,
    newAccountPubkey: vrfKeypair.publicKey,
    space: accountsAndData.size,
    lamports:
    await switchboardProgram.provider.connection.getMinimumBalanceForRentExemption(
    accountsAndData.size
    ),
    programId: switchboardProgram.programId,
    }),

    然后我们使用switchboard program 方法进行vrf初始化,其中我们提供了消耗随机性回调函数。

    // initialize new VRF account, included the callback CPI into lootbox program as instruction data
    await switchboardProgram.methods
    .vrfInit({
    stateBump,
    callback: {
    programId: lootboxProgram.programId,
    accounts: [
    {
    pubkey: accountsAndData.userStatePda,
    isSigner: false,
    isWritable: true,
    },
    {
    pubkey: vrfKeypair.publicKey,
    isSigner: false,
    isWritable: false,
    },
    { pubkey: lootboxPointerPda, isSigner: false, isWritable: true },
    {
    pubkey: accountsAndData.userPubkey,
    isSigner: false,
    isWritable: false,
    },
    ],
    ixData: new BorshInstructionCoder(lootboxProgram.idl).encode(
    "consumeRandomness",
    ""
    ),
    },
    })
    .accounts({
    vrf: vrfKeypair.publicKey,
    escrow: accountsAndData.escrow,
    authority: accountsAndData.userStatePda,
    oracleQueue: accountsAndData.queueAccount.publicKey,
    programState: accountsAndData.programStateAccount.publicKey,
    tokenProgram: spl.TOKEN_PROGRAM_ID,
    })
    .instruction(),
    // initialize switchboard permission account, required account

    接下来我们使用switchboard来调用权限初始化。

    await switchboardProgram.methods
    .permissionInit({})
    .accounts({
    permission: accountsAndData.permissionAccount.publicKey,
    authority: accountsAndData.queueState.authority,
    granter: accountsAndData.queueAccount.publicKey,
    grantee: vrfKeypair.publicKey,
    payer: accountsAndData.userPubkey,
    systemProgram: SystemProgram.programId,
    })
    .instruction(),

    最后,我们将我们的战利品箱计划称为init user,并返回指示,这将由调用者打包成交易。

    await lootboxProgram.methods
    .initUser({
    switchboardStateBump: accountsAndData.stateBump,
    vrfPermissionBump: accountsAndData.permissionBump,
    })
    .accounts({
    // state: userStatePDA,
    vrf: vrfKeypair.publicKey,
    // payer: publicKey,
    // systemProgram: anchor.web3.SystemProgram.programId,
    })
    .instruction(),
    ]

    return txnIxns
    }

    最后,让我们回顾一下 createOpenLootboxInstructions 。首先,我们获取用户状态PDA,我们必须实际获取该账户,以便我们可以从中提取vrf密钥对。

    export async function createOpenLootboxInstructions(
    connection: Connection,
    stakingProgram: Program<AnchorNftStaking>,
    switchboardProgram: SwitchboardProgram,
    lootboxProgram: Program<LootboxProgram>,
    userPubkey: PublicKey,
    nftTokenAccount: PublicKey,
    box: number
    ): Promise<TransactionInstruction[]> {
    const [userStatePda] = PublicKey.findProgramAddressSync(
    [userPubkey.toBytes()],
    lootboxProgram.programId
    )

    const state = await lootboxProgram.account.userState.fetch(userStatePda)

    在这里,我们称之为 getAccountsAndData 来获取我们所需的所有账户。接下来是 createAllOpenLootboxInstructions ,我们将深入探讨。

    const accounts = await getAccountsAndData(
    lootboxProgram,
    switchboardProgram,
    userPubkey,
    state.vrf
    )

    return await createAllOpenLootboxInstructions(
    connection,
    stakingProgram,
    lootboxProgram,
    switchboardProgram,
    accounts,
    nftTokenAccount,
    box
    )
    }

    我们获得了包装的代币账户,其中包含了包装的SOL,因为这是我们用来支付请求随机数的必需品。

    async function createAllOpenLootboxInstructions(
    connection: Connection,
    stakingProgram: Program<AnchorNftStaking>,
    lootboxProgram: Program<LootboxProgram>,
    switchboardProgram: SwitchboardProgram,
    accountsAndData: AccountsAndDataSuperset,
    nftTokenAccount: PublicKey,
    box: number
    ): Promise<TransactionInstruction[]> {
    // user Wrapped SOL token account
    // wSOL amount is then transferred to escrow account to pay switchboard oracle for VRF request
    const wrappedTokenAccount = await spl.getAssociatedTokenAddress(
    accountsAndData.wrappedSOLMint.address,
    accountsAndData.userPubkey
    )

    接下来我们获得与BLD相关的 stakeTokenAccount ,因此你可以使用BLD代币来换取开启战利品箱。然后是质押账户,以确保你通过质押获得足够的BLD来开启战利品箱。

    // user BLD token account, used to pay BLD tokens to call the request randomness instruction on Lootbox program
    const stakeTokenAccount = await spl.getAssociatedTokenAddress(
    STAKE_MINT,
    accountsAndData.userPubkey
    )

    const [stakeAccount] = PublicKey.findProgramAddressSync(
    [accountsAndData.userPubkey.toBytes(), nftTokenAccount.toBuffer()],
    stakingProgram.programId
    )

    这里开始组装说明。如果没有封装的令牌账户,我们会添加一个创建它的指令。

    let instructions: TransactionInstruction[] = []
    // check if a wrapped SOL token account exists, if not add instruction to create one
    const account = await connection.getAccountInfo(wrappedTokenAccount)
    if (!account) {
    instructions.push(
    spl.createAssociatedTokenAccountInstruction(
    accountsAndData.userPubkey,
    wrappedTokenAccount,
    accountsAndData.userPubkey,
    accountsAndData.wrappedSOLMint.address
    )
    )
    }

    然后我们推送一个转账指令,将SOL转移到wrapped SOL。然后是一个同步wrapped SOL余额的指令。

    // transfer SOL to user's own wSOL token account
    instructions.push(
    SystemProgram.transfer({
    fromPubkey: accountsAndData.userPubkey,
    toPubkey: wrappedTokenAccount,
    lamports: 0.002 * LAMPORTS_PER_SOL,
    })
    )
    // sync wrapped SOL balance
    instructions.push(spl.createSyncNativeInstruction(wrappedTokenAccount))

    最后,我们制作并返回了打开战利品箱的说明书,这样呼叫者就可以将它们打包并发送出去。

    // Lootbox program request randomness instruction
    instructions.push(
    await lootboxProgram.methods
    .openLootbox(new BN(box))
    .accounts({
    user: accountsAndData.userPubkey,
    stakeMint: STAKE_MINT,
    stakeMintAta: stakeTokenAccount,
    stakeState: stakeAccount,
    state: accountsAndData.userStatePda,
    vrf: accountsAndData.vrfAccount,
    oracleQueue: accountsAndData.queueAccount.publicKey,
    queueAuthority: accountsAndData.queueState.authority,
    dataBuffer: accountsAndData.queueState.dataBuffer,
    permission: accountsAndData.permissionAccount.publicKey,
    escrow: accountsAndData.escrow,
    programState: accountsAndData.programStateAccount.publicKey,
    switchboardProgram: switchboardProgram.programId,
    payerWallet: wrappedTokenAccount,
    recentBlockhashes: SYSVAR_RECENT_BLOCKHASHES_PUBKEY,
    })
    .instruction()
    )

    return instructions
    }

    这就是说明的全部内容,让我们去看看新的战利品箱组件,这些说明将会被用到那里。

    - +
    Skip to main content

    🚶‍ 最终作品

    概述

    终于到了最后的冲刺阶段!恭喜你抵达此地!这对每个人来说都是一次令人激动的旅程。不论你的NFT项目处于何种阶段,都要深呼吸,给自己一个赞扬,你做得非常棒!

    现在,审视一下你手头的成果,然后思考一下,为了让项目做好交付准备,你至少还需要做些什么。如果需要暂时跳过Switchboard的部分,那就这样做。

    现在是时候把你的用户界面与战利品箱和装备指示器连接起来,完成最后的修整工作,然后交付这个作品!

    具体来说,我们需要:

    • 使用GearItemLootbox组件替换UI中使用的模拟ItemBox
    • 添加一个instructions.ts文件,在其中创建函数来:
      • 创建初始化战利品箱和交换机所需的所有指令。
      • 创建打开战利品箱所需的所有指令。
      • 注意:这部分可能有些复杂 - 你可以参考我们的解决方案代码,但也不妨尝试自己的方法。
    • 进行大量的调试和优化。

    坦白说,这个列表可能还远远不够。我们添加了许多组件来确保交易和链上变化后状态得到更新,但它仍有不完美的地方。总有更多的空间可以改进,但不要让完美主义成为你前进的障碍。尽你所能,然后交付吧!

    解决方案代码

    我们的解决方案位于Buildoors代码库solution-lootboxes分支上。与你上次查看的代码可能有些许差异,因此如果你想查看所有更改,请确保从上周的分支查看差异

    有一些引导,但你可以自由开始。祝你好运!

    下一步

    现在,最后一个项目所需的一切都在上一课中。从这一刻起,这就是你和文字之间的事情了,宝贝。我们开始吧!

    我们接下来要深入研究一些代码的更改。从/components/WorkspaceProvider.tsx开始。

    这里只有一些小更改,主要是为了引入switchboard program

    const [switchboardProgram, setProgramSwitchboard] = useState<any>()

    然后,我们加载switchboard program,并使用useEffect设置the program switchboard,确保我们的工作区始终能够及时更新所有所需程序。这可能会是一个挑战,除非你是React的专家,否则请随意深入研究这段代码。

    async function program() {
    let response = await loadSwitchboardProgram(
    "devnet",
    connection,
    ((provider as AnchorProvider).wallet as AnchorWallet).payer
    )
    return response
    }

    useEffect(() => {
    program().then((result) => {
    setProgramSwitchboard(result)
    console.log("result", result)
    })
    }, [connection])

    好的,接下来我们进入 instructions.ts 文件夹中的 utils 文件,这是一个新文件。这里有两个公共函数,分别是 createOpenLootboxInstructions 指令和 createInitSwitchboardInstructions 指令。后者用于打包交换机程序的初始化内容,并初始化抽奖箱程序中的用户。

    export async function createOpenLootboxInstructions(
    connection: Connection,
    stakingProgram: Program<AnchorNftStaking>,
    switchboardProgram: SwitchboardProgram,
    lootboxProgram: Program<LootboxProgram>,
    userPubkey: PublicKey,
    nftTokenAccount: PublicKey,
    box: number
    ): Promise<TransactionInstruction[]> {
    const [userStatePda] = PublicKey.findProgramAddressSync(
    [userPubkey.toBytes()],
    lootboxProgram.programId
    )

    const state = await lootboxProgram.account.userState.fetch(userStatePda)

    const accounts = await getAccountsAndData(
    lootboxProgram,
    switchboardProgram,
    userPubkey,
    state.vrf
    )

    return await createAllOpenLootboxInstructions(
    connection,
    stakingProgram,
    lootboxProgram,
    switchboardProgram,
    accounts,
    nftTokenAccount,
    box
    )
    }

    进一步往下,有一个 getAccountsAndData 函数,它接受四个字段,正如你所见,对于最后一个字段,你需要事先生成或获取vrf账户。这个函数的作用是获取一些账户、增加和其他数据,将它们打包起来,并作为一个对象返回。

    async function getAccountsAndData(
    lootboxProgram: Program<LootboxProgram>,
    switchboardProgram: SwitchboardProgram,
    userPubkey: PublicKey,
    vrfAccount: PublicKey
    ): Promise<AccountsAndDataSuperset> {
    const [userStatePda] = PublicKey.findProgramAddressSync(
    [userPubkey.toBytes()],
    lootboxProgram.programId
    )

    // required switchboard accoount
    const [programStateAccount, stateBump] =
    ProgramStateAccount.fromSeed(switchboardProgram)

    // required switchboard accoount
    const queueAccount = new OracleQueueAccount({
    program: switchboardProgram,
    // devnet permissionless queue
    publicKey: new PublicKey("F8ce7MsckeZAbAGmxjJNetxYXQa9mKr9nnrC3qKubyYy"),
    })

    // required switchboard accoount
    const queueState = await queueAccount.loadData()
    // wrapped SOL is used to pay for switchboard VRF requests
    const wrappedSOLMint = await queueAccount.loadMint()

    // required switchboard accoount
    const [permissionAccount, permissionBump] = PermissionAccount.fromSeed(
    switchboardProgram,
    queueState.authority,
    queueAccount.publicKey,
    vrfAccount
    )

    // required switchboard accoount
    // escrow wrapped SOL token account owned by the VRF account we will initialize
    const escrow = await spl.getAssociatedTokenAddress(
    wrappedSOLMint.address,
    vrfAccount,
    true
    )

    const size = switchboardProgram.account.vrfAccountData.size

    return {
    userPubkey: userPubkey,
    userStatePda: userStatePda,
    vrfAccount: vrfAccount,
    escrow: escrow,
    wrappedSOLMint: wrappedSOLMint,
    programStateAccount: programStateAccount,
    stateBump: stateBump,
    permissionBump: permissionBump,
    queueAccount: queueAccount,
    queueState: queueState,
    permissionAccount: permissionAccount,
    size: size,
    }
    }

    该段描述了在文件底部定义的一个接口对象,这主要是为了确保你拥有所需的所有内容,并能够适当地调用它们。这个接口包括了许多公钥和与程序状态、权限等有关的字段。

    以下是接口的代码定义:

    interface AccountsAndDataSuperset {
    userPubkey: PublicKey
    userStatePda: PublicKey
    vrfAccount: PublicKey
    escrow: PublicKey
    wrappedSOLMint: spl.Mint
    programStateAccount: ProgramStateAccount
    stateBump: number
    permissionBump: number
    queueAccount: OracleQueueAccount
    queueState: any
    permissionAccount: PermissionAccount
    size: number
    }

    该段还深入介绍了createInitSwitchboardInstructions函数。这个函数首先生成一个vrf密钥对,然后调用getAccountsAndData以获取所有必要的账户。接着,通过initSwitchboardLootboxUser,它组装了指令,并返回这些指令和用于签名的vrf密钥对。

    export async function createInitSwitchboardInstructions(
    switchboardProgram: SwitchboardProgram,
    lootboxProgram: Program<LootboxProgram>,
    userPubkey: PublicKey
    ): Promise<{
    instructions: Array<TransactionInstruction>
    vrfKeypair: Keypair
    }> {
    const vrfKeypair = Keypair.generate()

    const accounts = await getAccountsAndData(
    lootboxProgram,
    switchboardProgram,
    userPubkey,
    vrfKeypair.publicKey
    )

    const initInstructions = await initSwitchboardLootboxUser(
    switchboardProgram,
    lootboxProgram,
    accounts,
    vrfKeypair
    )

    return { instructions: initInstructions, vrfKeypair: vrfKeypair }
    }

    关于 initSwitchboardLootboxUser ,我们首先获得一个PDAstate bump

    async function initSwitchboardLootboxUser(
    switchboardProgram: SwitchboardProgram,
    lootboxProgram: Program<LootboxProgram>,
    accountsAndData: AccountsAndDataSuperset,
    vrfKeypair: Keypair
    ): Promise<Array<TransactionInstruction>> {
    // lootbox account PDA
    const [lootboxPointerPda] = await PublicKey.findProgramAddress(
    [Buffer.from("lootbox"), accountsAndData.userPubkey.toBytes()],
    lootboxProgram.programId
    )

    const stateBump = accountsAndData.stateBump

    然后我们开始组装一系列的指令。首先,我们需要做的是创建一个与托管相关的令牌账户,由vrf密钥对拥有。

    const txnIxns: TransactionInstruction[] = [
    // create escrow ATA owned by VRF account
    spl.createAssociatedTokenAccountInstruction(
    accountsAndData.userPubkey,
    accountsAndData.escrow,
    vrfKeypair.publicKey,
    accountsAndData.wrappedSOLMint.address
    ),

    接下来是设置权限指令。

    // transfer escrow ATA owner to switchboard programStateAccount
    spl.createSetAuthorityInstruction(
    accountsAndData.escrow,
    vrfKeypair.publicKey,
    spl.AuthorityType.AccountOwner,
    accountsAndData.programStateAccount.publicKey,
    [vrfKeypair]
    ),

    然后我们调用create account来创建vrf账户。

    // request system program to create new account using newly generated keypair for VRF account
    SystemProgram.createAccount({
    fromPubkey: accountsAndData.userPubkey,
    newAccountPubkey: vrfKeypair.publicKey,
    space: accountsAndData.size,
    lamports:
    await switchboardProgram.provider.connection.getMinimumBalanceForRentExemption(
    accountsAndData.size
    ),
    programId: switchboardProgram.programId,
    }),

    然后我们使用switchboard program 方法进行vrf初始化,其中我们提供了消耗随机性回调函数。

    // initialize new VRF account, included the callback CPI into lootbox program as instruction data
    await switchboardProgram.methods
    .vrfInit({
    stateBump,
    callback: {
    programId: lootboxProgram.programId,
    accounts: [
    {
    pubkey: accountsAndData.userStatePda,
    isSigner: false,
    isWritable: true,
    },
    {
    pubkey: vrfKeypair.publicKey,
    isSigner: false,
    isWritable: false,
    },
    { pubkey: lootboxPointerPda, isSigner: false, isWritable: true },
    {
    pubkey: accountsAndData.userPubkey,
    isSigner: false,
    isWritable: false,
    },
    ],
    ixData: new BorshInstructionCoder(lootboxProgram.idl).encode(
    "consumeRandomness",
    ""
    ),
    },
    })
    .accounts({
    vrf: vrfKeypair.publicKey,
    escrow: accountsAndData.escrow,
    authority: accountsAndData.userStatePda,
    oracleQueue: accountsAndData.queueAccount.publicKey,
    programState: accountsAndData.programStateAccount.publicKey,
    tokenProgram: spl.TOKEN_PROGRAM_ID,
    })
    .instruction(),
    // initialize switchboard permission account, required account

    接下来我们使用switchboard来调用权限初始化。

    await switchboardProgram.methods
    .permissionInit({})
    .accounts({
    permission: accountsAndData.permissionAccount.publicKey,
    authority: accountsAndData.queueState.authority,
    granter: accountsAndData.queueAccount.publicKey,
    grantee: vrfKeypair.publicKey,
    payer: accountsAndData.userPubkey,
    systemProgram: SystemProgram.programId,
    })
    .instruction(),

    最后,我们将我们的战利品箱计划称为init user,并返回指示,这将由调用者打包成交易。

    await lootboxProgram.methods
    .initUser({
    switchboardStateBump: accountsAndData.stateBump,
    vrfPermissionBump: accountsAndData.permissionBump,
    })
    .accounts({
    // state: userStatePDA,
    vrf: vrfKeypair.publicKey,
    // payer: publicKey,
    // systemProgram: anchor.web3.SystemProgram.programId,
    })
    .instruction(),
    ]

    return txnIxns
    }

    最后,让我们回顾一下 createOpenLootboxInstructions 。首先,我们获取用户状态PDA,我们必须实际获取该账户,以便我们可以从中提取vrf密钥对。

    export async function createOpenLootboxInstructions(
    connection: Connection,
    stakingProgram: Program<AnchorNftStaking>,
    switchboardProgram: SwitchboardProgram,
    lootboxProgram: Program<LootboxProgram>,
    userPubkey: PublicKey,
    nftTokenAccount: PublicKey,
    box: number
    ): Promise<TransactionInstruction[]> {
    const [userStatePda] = PublicKey.findProgramAddressSync(
    [userPubkey.toBytes()],
    lootboxProgram.programId
    )

    const state = await lootboxProgram.account.userState.fetch(userStatePda)

    在这里,我们称之为 getAccountsAndData 来获取我们所需的所有账户。接下来是 createAllOpenLootboxInstructions ,我们将深入探讨。

    const accounts = await getAccountsAndData(
    lootboxProgram,
    switchboardProgram,
    userPubkey,
    state.vrf
    )

    return await createAllOpenLootboxInstructions(
    connection,
    stakingProgram,
    lootboxProgram,
    switchboardProgram,
    accounts,
    nftTokenAccount,
    box
    )
    }

    我们获得了包装的代币账户,其中包含了包装的SOL,因为这是我们用来支付请求随机数的必需品。

    async function createAllOpenLootboxInstructions(
    connection: Connection,
    stakingProgram: Program<AnchorNftStaking>,
    lootboxProgram: Program<LootboxProgram>,
    switchboardProgram: SwitchboardProgram,
    accountsAndData: AccountsAndDataSuperset,
    nftTokenAccount: PublicKey,
    box: number
    ): Promise<TransactionInstruction[]> {
    // user Wrapped SOL token account
    // wSOL amount is then transferred to escrow account to pay switchboard oracle for VRF request
    const wrappedTokenAccount = await spl.getAssociatedTokenAddress(
    accountsAndData.wrappedSOLMint.address,
    accountsAndData.userPubkey
    )

    接下来我们获得与BLD相关的 stakeTokenAccount ,因此你可以使用BLD代币来换取开启战利品箱。然后是质押账户,以确保你通过质押获得足够的BLD来开启战利品箱。

    // user BLD token account, used to pay BLD tokens to call the request randomness instruction on Lootbox program
    const stakeTokenAccount = await spl.getAssociatedTokenAddress(
    STAKE_MINT,
    accountsAndData.userPubkey
    )

    const [stakeAccount] = PublicKey.findProgramAddressSync(
    [accountsAndData.userPubkey.toBytes(), nftTokenAccount.toBuffer()],
    stakingProgram.programId
    )

    这里开始组装说明。如果没有封装的令牌账户,我们会添加一个创建它的指令。

    let instructions: TransactionInstruction[] = []
    // check if a wrapped SOL token account exists, if not add instruction to create one
    const account = await connection.getAccountInfo(wrappedTokenAccount)
    if (!account) {
    instructions.push(
    spl.createAssociatedTokenAccountInstruction(
    accountsAndData.userPubkey,
    wrappedTokenAccount,
    accountsAndData.userPubkey,
    accountsAndData.wrappedSOLMint.address
    )
    )
    }

    然后我们推送一个转账指令,将SOL转移到wrapped SOL。然后是一个同步wrapped SOL余额的指令。

    // transfer SOL to user's own wSOL token account
    instructions.push(
    SystemProgram.transfer({
    fromPubkey: accountsAndData.userPubkey,
    toPubkey: wrappedTokenAccount,
    lamports: 0.002 * LAMPORTS_PER_SOL,
    })
    )
    // sync wrapped SOL balance
    instructions.push(spl.createSyncNativeInstruction(wrappedTokenAccount))

    最后,我们制作并返回了打开战利品箱的说明书,这样呼叫者就可以将它们打包并发送出去。

    // Lootbox program request randomness instruction
    instructions.push(
    await lootboxProgram.methods
    .openLootbox(new BN(box))
    .accounts({
    user: accountsAndData.userPubkey,
    stakeMint: STAKE_MINT,
    stakeMintAta: stakeTokenAccount,
    stakeState: stakeAccount,
    state: accountsAndData.userStatePda,
    vrf: accountsAndData.vrfAccount,
    oracleQueue: accountsAndData.queueAccount.publicKey,
    queueAuthority: accountsAndData.queueState.authority,
    dataBuffer: accountsAndData.queueState.dataBuffer,
    permission: accountsAndData.permissionAccount.publicKey,
    escrow: accountsAndData.escrow,
    programState: accountsAndData.programStateAccount.publicKey,
    switchboardProgram: switchboardProgram.programId,
    payerWallet: wrappedTokenAccount,
    recentBlockhashes: SYSVAR_RECENT_BLOCKHASHES_PUBKEY,
    })
    .instruction()
    )

    return instructions
    }

    这就是说明的全部内容,让我们去看看新的战利品箱组件,这些说明将会被用到那里。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/finishing-touches/the-last-ship/index.html b/Solana-Co-Learn/module6/finishing-touches/the-last-ship/index.html index 94da10119..beff74d10 100644 --- a/Solana-Co-Learn/module6/finishing-touches/the-last-ship/index.html +++ b/Solana-Co-Learn/module6/finishing-touches/the-last-ship/index.html @@ -5,13 +5,13 @@ 🏁 最后一艘船 | All in One Solana - +
    -
    Skip to main content

    🏁 最后一艘船

    天哪,你终于做到了 🫡

    非常感谢你参与我们的内测计划!没有你的支持,这一切都不可能实现。

    来自 706 & RustyCab 团队的最后几件事情

    1. 请将你的提交放入展示频道!我们想看看你建造了什么!!

    2. 快发个推文吧!你做了大量的工作,全世界都应该知道!

    你现在正式在玻璃上冲浪——我们在那里见。

    - +
    Skip to main content

    🏁 最后一艘船

    天哪,你终于做到了 🫡

    非常感谢你参与我们的内测计划!没有你的支持,这一切都不可能实现。

    来自 706 & RustyCab 团队的最后几件事情

    1. 请将你的提交放入展示频道!我们想看看你建造了什么!!

    2. 快发个推文吧!你做了大量的工作,全世界都应该知道!

    你现在正式在玻璃上冲浪——我们在那里见。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/index.html b/Solana-Co-Learn/module6/index.html index 1999d54b1..ab9e7591d 100644 --- a/Solana-Co-Learn/module6/index.html +++ b/Solana-Co-Learn/module6/index.html @@ -5,13 +5,13 @@ VRF可验证随机数的应用 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/randomness/build-a-randomiser/index.html b/Solana-Co-Learn/module6/randomness/build-a-randomiser/index.html index b4fce4e60..61f5538d7 100644 --- a/Solana-Co-Learn/module6/randomness/build-a-randomiser/index.html +++ b/Solana-Co-Learn/module6/randomness/build-a-randomiser/index.html @@ -5,13 +5,13 @@ 👁‍🗨 构造随机器 | All in One Solana - +
    -
    Skip to main content

    👁‍🗨 构造随机器

    Switchboard设置的详细步骤 🚶🏽🔀

    概览

    我们将通过Switchboard来构建一个基础程序,以实现随机数的请求。在此视频中,我们将重点关注如何在测试环境中配置Switchboard客户端。

    首先,我们要进行交换机的初始化设置,你可以在/tests/utils/setupSwitchboard.ts文件中找到相关代码。

    这个设置是用于运行测试的。虽然他们的文档非常精简,但对于随机化部分,我们应该已经了解得足够清楚了。

    让我们一起回顾一下代码。首先,我们需要导入以下三个库:

    import { SwitchboardTestContext } from "@switchboard-xyz/sbv2-utils"
    import * as anchor from "@project-serum/anchor"
    import * as sbv2 from "@switchboard-xyz/switchboard-v2"

    在实际功能方面,你会注意到我们传入的三个项目分别是提供者、战利品箱计划和付款人。

    我们要做的第一件事是加载devnet队列,这样我们就可以在devnet上进行测试了。ID是Switchboard的程序ID100,000,000则是switchboard代币数量,我们需要访问它们。

    export const setupSwitchboard = async (provider, lootboxProgram, payer) => {

    const switchboard = await SwitchboardTestContext.loadDevnetQueue(
    provider,
    "F8ce7MsckeZAbAGmxjJNetxYXQa9mKr9nnrC3qKubyYy",
    100_000_000
    )

    接下来,我们会看到一些日志,确保一切都准备就绪。

    console.log(switchboard.mint.address.toString())

    await switchboard.oracleHeartbeat();

    const { queue, unpermissionedVrfEnabled, authority } =
    await switchboard.queue.loadData();

    console.log(`oracleQueue: ${switchboard.queue.publicKey}`);
    console.log(`unpermissionedVrfEnabled: ${unpermissionedVrfEnabled}`);
    console.log(`# of oracles heartbeating: ${queue.length}`);
    console.log(
    "\x1b[32m%s\x1b[0m",
    `\u2714 Switchboard devnet环境成功加载\n`
    );

    以上的const语句加载了我们所需的交换机队列数据,在函数的后续部分我们将用到这些数据。

    接下来,我们创建验证随机函数(VRF)账户,这一部分对于我们使用的交换板非常特殊。你会看到,它会生成一个新的密钥对。

    // 创建VRF账户
    // VRF账户的密钥对
    const vrfKeypair = anchor.web3.Keypair.generate()

    在创建VRF账户的过程中,我们需要访问一些PDA设备。

    // 寻找用于客户端状态公钥的PDA
    const [userState] = anchor.utils.publicKey.findProgramAddressSync(
    [vrfKeypair.publicKey.toBytes(), payer.publicKey.toBytes()],
    lootboxProgram.programId
    )

    // 用于回调的lootboxPointerPda
    const [lootboxPointerPda] = anchor.web3.PublicKey.findProgramAddressSync(
    [Buffer.from("lootbox"), payer.publicKey.toBuffer()],
    lootboxProgram.programId
    )

    你会注意到我们使用了vrfpayer的公钥作为种子。在生产环境中,它们需要是静态的,只有payer的公钥会变化。这段代码确保我们在每次测试运行时都有不同的vrf密钥对和用户状态,这样我们在测试过程中不会遇到试图重新创建已经存在的账户的问题。

    现在,我们可以使用sbv2库创建VRF账户,并传入交换程序、我们为VRF账户提供的密钥对、作为授权的用户状态PDA、交换机队列和回调函数。

    因此,当我们需要一个新的随机数时,我们将通过与交换机程序进行CPI交互来获取随机数。它必须知道我们程序中的一条特定指令来执行CPI回调,以便为我们提供随机数。像所有的指令一样,它具有一个程序ID、一个账户列表和指令数据。关于账户,第一个是用于写入数据的位置,然后是vrf账户,我们将在其中写入已选的mintlootbox指针PDA,最后是付款人。

    // 创建新的vrf账户
    const vrfAccount = await sbv2.VrfAccount.create(switchboard.program, {
    keypair: vrfKeypair,
    authority: userState, // 将PDA设为vrf账户的授权
    queue: switchboard.queue,
    callback: {
    programId: lootboxProgram.programId,
    accounts: [
    { pubkey: userState, isSigner: false, isWritable: true },
    { pubkey: vrfKeypair.publicKey, isSigner: false, isWritable: false },
    { pubkey: lootboxPointerPda, isSigner: false, isWritable: true },
    { pubkey: payer.publicKey, isSigner: false, isWritable: false },
    ],
    ixData: new anchor.BorshInstructionCoder(lootboxProgram.idl).encode(
    "consumeRandomness",
    ""
    ),
    },
    })

    接下来我们要创建一个所谓的权限账户。

    // CREATE PERMISSION ACCOUNT
    const permissionAccount = await sbv2.PermissionAccount.create(
    switchboard.program,
    {
    authority,
    granter: switchboard.queue.publicKey,
    grantee: vrfAccount.publicKey,
    }
    )

    权限字段是从上文的队列中获取的加载数据。这将在交换机中给我们的 vrf 账户授权。

    下一步,我们会将权限更改为我们自己,并将其设置为付款方。

    // 如果队列需要权限来使用 VRF,请检查是否提供了正确的授权
    if (!unpermissionedVrfEnabled) {
    if (!payer.publicKey.equals(authority)) {
    throw new Error(
    `队列需要 PERMIT_VRF_REQUESTS 权限,而提供的队列授权错误`
    )
    }

    await permissionAccount.set({
    authority: payer,
    permission: sbv2.SwitchboardPermission.PERMIT_VRF_REQUESTS,
    enable: true,
    })
    }

    由于稍后我们需要切换板账户的提升,因此我们将其提取出来,还有 switchboardStateBump,这是切换板的程序账户。

    // 获取权限提升和切换板状态提升
    const [_permissionAccount, permissionBump] = sbv2.PermissionAccount.fromSeed(
    switchboard.program,
    authority,
    switchboard.queue.publicKey,
    vrfAccount.publicKey
    )

    const [switchboardStateAccount, switchboardStateBump] =
    sbv2.ProgramStateAccount.fromSeed(switchboard.program)

    这就是我们进行测试与程序和交换机互动所需的所有数据,我们将在最后返回这些数据。

    return {
    switchboard: switchboard,
    lootboxPointerPda: lootboxPointerPda,
    permissionBump: permissionBump,
    permissionAccount: permissionAccount,
    switchboardStateBump: switchboardStateBump,
    switchboardStateAccount: switchboardStateAccount,
    vrfAccount: vrfAccount,
    }

    我们最终会在测试环境设置中调用整个函数,所以现在的 before 代码块是这样的。

    before(async () => {
    ;({ nft, stakeStatePda, mint, tokenAddress } = await setupNft(
    program,
    wallet.payer
    ))
    ;({
    switchboard,
    lootboxPointerPda,
    permissionBump,
    switchboardStateBump,
    vrfAccount,
    switchboardStateAccount,
    permissionAccount,
    } = await setupSwitchboard(provider, lootboxProgram, wallet.payer))
    })

    下面是关于客户端交换机所需的基本知识。

    init_user 指令的详细步骤 👶

    首先,对于我们的战利品箱计划,我们以前把所有东西都放在 lib.rs 里,但随着项目变得越来越庞大,也变得难以管理,所以现在我们对其进行了拆分,你可以在此链接查看文件结构。

    现在的 lib 文件主要只是一堆 use 语句、declare_id! 宏和我们的四个指令,它们只是调用其他文件。

    Init_user 将创建用户状态账户,我们将在程序和交换机之间共享该账户,它就像一个联络账户。

    打开战利品箱的过程与之前相同,它将开始生成随机货币的过程,但不会完成该过程,而是生成一个 CPI 来呼叫交换机以请求一个随机数。

    交换机将调用消耗随机性,以返回指令中的号码,以便我们可以使用它,并在设置薄荷时完成该过程。

    从战利品箱中获取物品基本上没有改变。

    让我们开始吧,首先是 init_user

    在文件的顶部,你会找到初始用户上下文,在底部有一个实现,其中有一个名为 process instruction 的函数,在该函数中执行了之前在 libs 文件中的逻辑。

    InitUser 上下文中有四个账户。状态是我们的用户状态对象,其中包含 vrfpayer 密钥种子,这是用于测试的版本。对于生产代码,你只需要 payer 种子。我们这样做是为了节省时间,而不是使用环境变量。然后有 vrf 账户,switchboard 不会自动加载它,因此需要使用 .load() 调用来加载。可能有其他使用 switchboard 的方法,但我们目前采用的是最简单/最快的路径来启动和运行,随时可以对其进行探索和改进。最后,我们有 payersystem 程序来创建一个新账户。

    use crate::*;

    #[derive(Accounts)]
    #[instruction(params: InitUserParams)]
    pub struct InitUser<'info> {
    #[account(
    init,
    // 测试 - 注释掉这些种子用于测试
    // seeds = [
    // payer.key().as_ref(),
    // ],
    // 测试 - 取消注释这些种子用于测试
    seeds = [
    vrf.key().as_ref(),
    payer.key().as_ref()
    ],
    payer = payer,
    space = 8 + std::mem::size_of::<UserState>(),
    bump,
    )]
    pub state: AccountLoader<'info, UserState>,
    #[account(
    constraint = vrf.load()?.authority == state.key() @ LootboxError::InvalidVrfAuthorityError
    )]
    pub vrf: AccountLoader<'info, VrfAccountData>,
    #[account(mut)]
    pub payer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    在逻辑部分,我们正在操作名为state的账户,该账户设置了bumpswitchboard state bumpvrf permission bumpvrf账户以及与之关联的用户。你会注意到存在一个结构体,其中只包括了我们前面提到的两个bump

    #[derive(Clone, AnchorSerialize, AnchorDeserialize)]
    pub struct InitUserParams {
    pub switchboard_state_bump: u8,
    pub vrf_permission_bump: u8,
    }

    impl InitUser<'_> {
    pub fn process_instruction(ctx: &Context<Self>, params: &InitUserParams) -> Result<()> {
    let mut state = ctx.accounts.state.load_init()?;
    *state = UserState::default();
    state.bump = ctx.bumps.get("state").unwrap().clone();
    state.switchboard_state_bump = params.switchboard_state_bump;
    state.vrf_permission_bump = params.vrf_permission_bump;
    state.vrf = ctx.accounts.vrf.key();
    state.user = ctx.accounts.payer.key();

    Ok(())
    }
    }

    让我们快速了解一下用户状态文件,从而更好地理解其中的内容。

    其中新引入的部分是结果缓冲区。这是我们获取随机性的地方。系统会将随机数据作为一个32字节的数组发送给我们,我们可以将其转换为任何所需的随机性。

    请注意,这里还添加了两个属性。#[account(zero_copy)] 是一个需要加载的部分,我只是按照交换机示例中的建议进行操作的。

    #[repr(packed)]
    #[account(zero_copy)]
    #[derive(Default)]
    pub struct UserState {
    pub bump: u8,
    pub switchboard_state_bump: u8,
    pub vrf_permission_bump: u8,
    pub result_buffer: [u8; 32],
    pub vrf: Pubkey,
    pub user: Pubkey,
    }

    以上就是初始用户介绍的全部内容,我们可以继续深入了解了。

    - +
    Skip to main content

    👁‍🗨 构造随机器

    Switchboard设置的详细步骤 🚶🏽🔀

    概览

    我们将通过Switchboard来构建一个基础程序,以实现随机数的请求。在此视频中,我们将重点关注如何在测试环境中配置Switchboard客户端。

    首先,我们要进行交换机的初始化设置,你可以在/tests/utils/setupSwitchboard.ts文件中找到相关代码。

    这个设置是用于运行测试的。虽然他们的文档非常精简,但对于随机化部分,我们应该已经了解得足够清楚了。

    让我们一起回顾一下代码。首先,我们需要导入以下三个库:

    import { SwitchboardTestContext } from "@switchboard-xyz/sbv2-utils"
    import * as anchor from "@project-serum/anchor"
    import * as sbv2 from "@switchboard-xyz/switchboard-v2"

    在实际功能方面,你会注意到我们传入的三个项目分别是提供者、战利品箱计划和付款人。

    我们要做的第一件事是加载devnet队列,这样我们就可以在devnet上进行测试了。ID是Switchboard的程序ID100,000,000则是switchboard代币数量,我们需要访问它们。

    export const setupSwitchboard = async (provider, lootboxProgram, payer) => {

    const switchboard = await SwitchboardTestContext.loadDevnetQueue(
    provider,
    "F8ce7MsckeZAbAGmxjJNetxYXQa9mKr9nnrC3qKubyYy",
    100_000_000
    )

    接下来,我们会看到一些日志,确保一切都准备就绪。

    console.log(switchboard.mint.address.toString())

    await switchboard.oracleHeartbeat();

    const { queue, unpermissionedVrfEnabled, authority } =
    await switchboard.queue.loadData();

    console.log(`oracleQueue: ${switchboard.queue.publicKey}`);
    console.log(`unpermissionedVrfEnabled: ${unpermissionedVrfEnabled}`);
    console.log(`# of oracles heartbeating: ${queue.length}`);
    console.log(
    "\x1b[32m%s\x1b[0m",
    `\u2714 Switchboard devnet环境成功加载\n`
    );

    以上的const语句加载了我们所需的交换机队列数据,在函数的后续部分我们将用到这些数据。

    接下来,我们创建验证随机函数(VRF)账户,这一部分对于我们使用的交换板非常特殊。你会看到,它会生成一个新的密钥对。

    // 创建VRF账户
    // VRF账户的密钥对
    const vrfKeypair = anchor.web3.Keypair.generate()

    在创建VRF账户的过程中,我们需要访问一些PDA设备。

    // 寻找用于客户端状态公钥的PDA
    const [userState] = anchor.utils.publicKey.findProgramAddressSync(
    [vrfKeypair.publicKey.toBytes(), payer.publicKey.toBytes()],
    lootboxProgram.programId
    )

    // 用于回调的lootboxPointerPda
    const [lootboxPointerPda] = anchor.web3.PublicKey.findProgramAddressSync(
    [Buffer.from("lootbox"), payer.publicKey.toBuffer()],
    lootboxProgram.programId
    )

    你会注意到我们使用了vrfpayer的公钥作为种子。在生产环境中,它们需要是静态的,只有payer的公钥会变化。这段代码确保我们在每次测试运行时都有不同的vrf密钥对和用户状态,这样我们在测试过程中不会遇到试图重新创建已经存在的账户的问题。

    现在,我们可以使用sbv2库创建VRF账户,并传入交换程序、我们为VRF账户提供的密钥对、作为授权的用户状态PDA、交换机队列和回调函数。

    因此,当我们需要一个新的随机数时,我们将通过与交换机程序进行CPI交互来获取随机数。它必须知道我们程序中的一条特定指令来执行CPI回调,以便为我们提供随机数。像所有的指令一样,它具有一个程序ID、一个账户列表和指令数据。关于账户,第一个是用于写入数据的位置,然后是vrf账户,我们将在其中写入已选的mintlootbox指针PDA,最后是付款人。

    // 创建新的vrf账户
    const vrfAccount = await sbv2.VrfAccount.create(switchboard.program, {
    keypair: vrfKeypair,
    authority: userState, // 将PDA设为vrf账户的授权
    queue: switchboard.queue,
    callback: {
    programId: lootboxProgram.programId,
    accounts: [
    { pubkey: userState, isSigner: false, isWritable: true },
    { pubkey: vrfKeypair.publicKey, isSigner: false, isWritable: false },
    { pubkey: lootboxPointerPda, isSigner: false, isWritable: true },
    { pubkey: payer.publicKey, isSigner: false, isWritable: false },
    ],
    ixData: new anchor.BorshInstructionCoder(lootboxProgram.idl).encode(
    "consumeRandomness",
    ""
    ),
    },
    })

    接下来我们要创建一个所谓的权限账户。

    // CREATE PERMISSION ACCOUNT
    const permissionAccount = await sbv2.PermissionAccount.create(
    switchboard.program,
    {
    authority,
    granter: switchboard.queue.publicKey,
    grantee: vrfAccount.publicKey,
    }
    )

    权限字段是从上文的队列中获取的加载数据。这将在交换机中给我们的 vrf 账户授权。

    下一步,我们会将权限更改为我们自己,并将其设置为付款方。

    // 如果队列需要权限来使用 VRF,请检查是否提供了正确的授权
    if (!unpermissionedVrfEnabled) {
    if (!payer.publicKey.equals(authority)) {
    throw new Error(
    `队列需要 PERMIT_VRF_REQUESTS 权限,而提供的队列授权错误`
    )
    }

    await permissionAccount.set({
    authority: payer,
    permission: sbv2.SwitchboardPermission.PERMIT_VRF_REQUESTS,
    enable: true,
    })
    }

    由于稍后我们需要切换板账户的提升,因此我们将其提取出来,还有 switchboardStateBump,这是切换板的程序账户。

    // 获取权限提升和切换板状态提升
    const [_permissionAccount, permissionBump] = sbv2.PermissionAccount.fromSeed(
    switchboard.program,
    authority,
    switchboard.queue.publicKey,
    vrfAccount.publicKey
    )

    const [switchboardStateAccount, switchboardStateBump] =
    sbv2.ProgramStateAccount.fromSeed(switchboard.program)

    这就是我们进行测试与程序和交换机互动所需的所有数据,我们将在最后返回这些数据。

    return {
    switchboard: switchboard,
    lootboxPointerPda: lootboxPointerPda,
    permissionBump: permissionBump,
    permissionAccount: permissionAccount,
    switchboardStateBump: switchboardStateBump,
    switchboardStateAccount: switchboardStateAccount,
    vrfAccount: vrfAccount,
    }

    我们最终会在测试环境设置中调用整个函数,所以现在的 before 代码块是这样的。

    before(async () => {
    ;({ nft, stakeStatePda, mint, tokenAddress } = await setupNft(
    program,
    wallet.payer
    ))
    ;({
    switchboard,
    lootboxPointerPda,
    permissionBump,
    switchboardStateBump,
    vrfAccount,
    switchboardStateAccount,
    permissionAccount,
    } = await setupSwitchboard(provider, lootboxProgram, wallet.payer))
    })

    下面是关于客户端交换机所需的基本知识。

    init_user 指令的详细步骤 👶

    首先,对于我们的战利品箱计划,我们以前把所有东西都放在 lib.rs 里,但随着项目变得越来越庞大,也变得难以管理,所以现在我们对其进行了拆分,你可以在此链接查看文件结构。

    现在的 lib 文件主要只是一堆 use 语句、declare_id! 宏和我们的四个指令,它们只是调用其他文件。

    Init_user 将创建用户状态账户,我们将在程序和交换机之间共享该账户,它就像一个联络账户。

    打开战利品箱的过程与之前相同,它将开始生成随机货币的过程,但不会完成该过程,而是生成一个 CPI 来呼叫交换机以请求一个随机数。

    交换机将调用消耗随机性,以返回指令中的号码,以便我们可以使用它,并在设置薄荷时完成该过程。

    从战利品箱中获取物品基本上没有改变。

    让我们开始吧,首先是 init_user

    在文件的顶部,你会找到初始用户上下文,在底部有一个实现,其中有一个名为 process instruction 的函数,在该函数中执行了之前在 libs 文件中的逻辑。

    InitUser 上下文中有四个账户。状态是我们的用户状态对象,其中包含 vrfpayer 密钥种子,这是用于测试的版本。对于生产代码,你只需要 payer 种子。我们这样做是为了节省时间,而不是使用环境变量。然后有 vrf 账户,switchboard 不会自动加载它,因此需要使用 .load() 调用来加载。可能有其他使用 switchboard 的方法,但我们目前采用的是最简单/最快的路径来启动和运行,随时可以对其进行探索和改进。最后,我们有 payersystem 程序来创建一个新账户。

    use crate::*;

    #[derive(Accounts)]
    #[instruction(params: InitUserParams)]
    pub struct InitUser<'info> {
    #[account(
    init,
    // 测试 - 注释掉这些种子用于测试
    // seeds = [
    // payer.key().as_ref(),
    // ],
    // 测试 - 取消注释这些种子用于测试
    seeds = [
    vrf.key().as_ref(),
    payer.key().as_ref()
    ],
    payer = payer,
    space = 8 + std::mem::size_of::<UserState>(),
    bump,
    )]
    pub state: AccountLoader<'info, UserState>,
    #[account(
    constraint = vrf.load()?.authority == state.key() @ LootboxError::InvalidVrfAuthorityError
    )]
    pub vrf: AccountLoader<'info, VrfAccountData>,
    #[account(mut)]
    pub payer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    在逻辑部分,我们正在操作名为state的账户,该账户设置了bumpswitchboard state bumpvrf permission bumpvrf账户以及与之关联的用户。你会注意到存在一个结构体,其中只包括了我们前面提到的两个bump

    #[derive(Clone, AnchorSerialize, AnchorDeserialize)]
    pub struct InitUserParams {
    pub switchboard_state_bump: u8,
    pub vrf_permission_bump: u8,
    }

    impl InitUser<'_> {
    pub fn process_instruction(ctx: &Context<Self>, params: &InitUserParams) -> Result<()> {
    let mut state = ctx.accounts.state.load_init()?;
    *state = UserState::default();
    state.bump = ctx.bumps.get("state").unwrap().clone();
    state.switchboard_state_bump = params.switchboard_state_bump;
    state.vrf_permission_bump = params.vrf_permission_bump;
    state.vrf = ctx.accounts.vrf.key();
    state.user = ctx.accounts.payer.key();

    Ok(())
    }
    }

    让我们快速了解一下用户状态文件,从而更好地理解其中的内容。

    其中新引入的部分是结果缓冲区。这是我们获取随机性的地方。系统会将随机数据作为一个32字节的数组发送给我们,我们可以将其转换为任何所需的随机性。

    请注意,这里还添加了两个属性。#[account(zero_copy)] 是一个需要加载的部分,我只是按照交换机示例中的建议进行操作的。

    #[repr(packed)]
    #[account(zero_copy)]
    #[derive(Default)]
    pub struct UserState {
    pub bump: u8,
    pub switchboard_state_bump: u8,
    pub vrf_permission_bump: u8,
    pub result_buffer: [u8; 32],
    pub vrf: Pubkey,
    pub user: Pubkey,
    }

    以上就是初始用户介绍的全部内容,我们可以继续深入了解了。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/randomness/index.html b/Solana-Co-Learn/module6/randomness/index.html index 1510e74d3..ea1d56f63 100644 --- a/Solana-Co-Learn/module6/randomness/index.html +++ b/Solana-Co-Learn/module6/randomness/index.html @@ -5,13 +5,13 @@ 随机性 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/randomness/opening-loot-boxes/index.html b/Solana-Co-Learn/module6/randomness/opening-loot-boxes/index.html index 02f60987e..2de70c622 100644 --- a/Solana-Co-Learn/module6/randomness/opening-loot-boxes/index.html +++ b/Solana-Co-Learn/module6/randomness/opening-loot-boxes/index.html @@ -5,13 +5,13 @@ 🎁 开启战利品箱 | All in One Solana - +
    -
    Skip to main content

    🎁 开启战利品箱

    现在我们来深入探讨开启战利品箱的指南。首先你会注意到的是,这个过程涉及许多账号,总共有19个!

    直到stake_state为止,这些信息都是我们之前已经了解的。

    我们正在添加与总线相关的内容,包括我们在初始化用户中刚刚设置的用户状态。然后还有一系列总线账户,包括vrf账户、oracle队列账户、队列权限账户(这只是权限的PDA)、数据缓冲区账户、权限账户、托管账户、程序状态账户和总线程序账户本身。

    你会发现还有一些我们尚未讨论过的类型,它们来自switchboard-v2 crate。以下是你需要添加到Cargo.toml中的两个依赖项,以确保所有这些类型都能正常工作。

    switchboard-v2 = { version = "^0.1.14", features = ["devnet"] }
    bytemuck = "1.7.2"

    最后两个账户是付款人钱包,它与你的switchboard代币关联,用于支付随机性和最近的区块哈希。

    use crate::*;
    use anchor_lang::solana_program;

    #[derive(Accounts)]
    pub struct OpenLootbox<'info> {
    #[account(mut)]
    pub user: Signer<'info>,
    #[account(
    init_if_needed,
    payer = user,
    space = std::mem::size_of::<LootboxPointer>() + 8,
    seeds=["lootbox".as_bytes(), user.key().as_ref()],
    bump
    )]
    pub lootbox_pointer: Box<Account<'info, LootboxPointer>>,
    pub system_program: Program<'info, System>,
    pub token_program: Program<'info, Token>,
    // TESTING - Uncomment the next line during testing
    // #[account(mut)]
    // TESTING - Comment out the next three lines during testing
    #[account(
    mut,
    address="D7F9JnGcjxQwz9zEQmasksX1VrwFcfRKu8Vdqrk2enHR".parse::<Pubkey>().unwrap()
    )]
    pub stake_mint: Account<'info, Mint>,
    #[account(
    mut,
    associated_token::mint=stake_mint,
    associated_token::authority=user
    )]
    pub stake_mint_ata: Box<Account<'info, TokenAccount>>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    #[account(
    constraint=stake_state.user_pubkey==user.key(),
    )]
    pub stake_state: Box<Account<'info, UserStakeInfo>>,
    #[account(
    mut,
    // TESTING - Comment out these seeds for testing
    seeds = [
    user.key().as_ref(),
    ],
    // TESTING - Uncomment these seeds for testing
    // seeds = [
    // vrf.key().as_ref(),
    // user.key().as_ref()
    // ],
    bump = state.load()?.bump,
    has_one = vrf @ LootboxError::InvalidVrfAccount
    )]
    pub state: AccountLoader<'info, UserState>,

    // SWITCHBOARD ACCOUNTS
    #[account(mut,
    has_one = escrow
    )]
    pub vrf: AccountLoader<'info, VrfAccountData>,
    #[account(mut,
    has_one = data_buffer
    )]
    pub oracle_queue: AccountLoader<'info, OracleQueueAccountData>,
    /// CHECK:
    #[account(mut,
    constraint =
    oracle_queue.load()?.authority == queue_authority.key()
    )]
    pub queue_authority: UncheckedAccount<'info>,
    /// CHECK
    #[account(mut)]
    pub data_buffer: AccountInfo<'info>,
    #[account(mut)]
    pub permission: AccountLoader<'info, PermissionAccountData>,
    #[account(mut,
    constraint =
    escrow.owner == program_state.key()
    && escrow.mint == program_state.load()?.token_mint
    )]
    pub escrow: Account<'info, TokenAccount>,
    #[account(mut)]
    pub program_state: AccountLoader<'info, SbState>,
    /// CHECK:
    #[account(
    address = *vrf.to_account_info().owner,
    constraint = switchboard_program.executable == true
    )]
    pub switchboard_program: AccountInfo<'info>,

    // PAYER ACCOUNTS
    #[account(mut,
    constraint =
    payer_wallet.owner == user.key()
    && escrow.mint == program_state.load()?.token_mint
    )]
    pub payer_wallet: Account<'info, TokenAccount>,
    // SYSTEM ACCOUNTS
    /// CHECK:
    #[account(address = solana_program::sysvar::recent_blockhashes::ID)]
    pub recent_blockhashes: AccountInfo<'info>,
    }

    在我们的账户配置之后,下面的代码片段是我们在开放式战利品箱实现中真正进行的操作,需要注意的是,这正是我们逻辑所在的地方。

    起初,我们加载状态的部分与以前完全相同。一旦我们加载了状态,我们就从状态中获取了我们的 bump(译者注:bump通常用于校验或确保唯一性),还有我们在初始化用户时添加的另外两个 bump。我们还从内存中删除了状态。

    let state = ctx.accounts.state.load()?;
    let bump = state.bump.clone();
    let switchboard_state_bump = state.switchboard_state_bump;
    let vrf_permission_bump = state.vrf_permission_bump;
    drop(state);

    接下来,我们从账户列表中获取了交换机程序本身。然后,我们构建了VRF请求的随机性,这实际上是我们用于CPI(跨程序调用)的上下文,在我们几行后调用vrf_request_randomness时会用到。

    再次,你会看到一些被注释掉的代码,用来区分生产环境和测试环境。我们仅在测试目的下使用vrf账户。

    let switchboard_program = ctx.accounts.switchboard_program.to_account_info();

    let vrf_request_randomness = VrfRequestRandomness {
    authority: ctx.accounts.state.to_account_info(),
    vrf: ctx.accounts.vrf.to_account_info(),
    oracle_queue: ctx.accounts.oracle_queue.to_account_info(),
    queue_authority: ctx.accounts.queue_authority.to_account_info(),
    data_buffer: ctx.accounts.data_buffer.to_account_info(),
    permission: ctx.accounts.permission.to_account_info(),
    escrow: ctx.accounts.escrow.clone(),
    payer_wallet: ctx.accounts.payer_wallet.clone(),
    payer_authority: ctx.accounts.user.to_account_info(),
    recent_blockhashes: ctx.accounts.recent_blockhashes.to_account_info(),
    program_state: ctx.accounts.program_state.to_account_info(),
    token_program: ctx.accounts.token_program.to_account_info(),
    };

    let payer = ctx.accounts.user.key();
    // TESTING - uncomment the following during tests
    let vrf = ctx.accounts.vrf.key();
    let state_seeds: &[&[&[u8]]] = &[&[vrf.as_ref(), payer.as_ref(), &[bump]]];
    // TESTING - comment out the next line during tests
    // let state_seeds: &[&[&[u8]]] = &[&[payer.as_ref(), &[bump]]];

    这是对switchboard的呼叫。

    msg!("requesting randomness");
    vrf_request_randomness.invoke_signed(
    switchboard_program,
    switchboard_state_bump,
    vrf_permission_bump,
    state_seeds,
    )?;

    msg!("randomness requested successfully");

    最后,我们将随机请求更改为已初始化为true

    ctx.accounts.lootbox_pointer.randomness_requested = true;
    ctx.accounts.lootbox_pointer.is_initialized = true;
    ctx.accounts.lootbox_pointer.available_lootbox = box_number * 2;

    Ok(())

    我们再来探讨战利品盒指针结构体,注意到其中有一个名为 redeemable 的属性。这个属性让客户端可以观察战利品盒指针账户,一旦它从false变为true,我们便能知道随机性已经恢复,可以开始进行铸造。此变化是在消耗随机性函数中发生的。

    #[account]
    pub struct LootboxPointer {
    pub mint: Pubkey,
    pub redeemable: bool,
    pub randomness_requested: bool,
    pub available_lootbox: u64,
    pub is_initialized: bool,
    }

    下面我们来看一下这个函数,并对它进行解读。该函数由交换机调用,并且内容在 callback 文件中提供。回调中的四个账户与ConsumeRandomness中的账户匹配,loobox指针和状态是可变的。

    use crate::state::*;
    use crate::*;

    #[derive(Accounts)]
    pub struct ConsumeRandomness<'info> {
    #[account(
    mut,
    // TESTING - Comment out these seeds for testing
    seeds = [
    payer.key().as_ref(),
    ],
    // TESTING - Uncomment these seeds for testing
    // seeds = [
    // vrf.key().as_ref(),
    // payer.key().as_ref()
    // ],
    bump = state.load()?.bump,
    has_one = vrf @ LootboxError::InvalidVrfAccount
    )]
    pub state: AccountLoader<'info, UserState>,
    pub vrf: AccountLoader<'info, VrfAccountData>,
    #[account(
    mut,
    seeds=["lootbox".as_bytes(), payer.key().as_ref()],
    bump
    )]
    pub lootbox_pointer: Account<'info, LootboxPointer>,
    /// CHECK: ...
    pub payer: AccountInfo<'info>,
    }

    在实际执行上,我们在流程指令功能中首先加载vrf和状态账户。随后,我们从vrf账户获取结果缓冲区,并检查确保其不为空。

    impl ConsumeRandomness<'_> {
    pub fn process_instruction(ctx: &mut Context<Self>) -> Result<()> {
    let vrf = ctx.accounts.vrf.load()?;
    let state = &mut ctx.accounts.state.load_mut()?;

    let result_buffer = vrf.get_result()?;
    if result_buffer == [0u8; 32] {
    msg!("vrf buffer empty");
    return Ok(());
    }

    if result_buffer == state.result_buffer {
    msg!("result_buffer unchanged");
    return Ok(());
    }
    }

    接下来,我们将对可用的装备进行映射。此时,我们仅使用下方定义的常量,方便在构建程序时进行必要的修改。这将给我们一个公钥向量。

    let available_gear: Vec<Pubkey> = Self::AVAILABLE_GEAR
    .into_iter()
    .map(|key| key.parse::<Pubkey>().unwrap())
    .collect();

    value 变量中,我们将结果缓冲区转换为无符号8位整数,这是switchboard推荐的实现方式,采用了 bytemuck crate。最后,我们通过取模运算和可用的最大薄荷数量来随机选择一个。

    // maximum value to convert randomness buffer
    let max_result = available_gear.len();
    let value: &[u8] = bytemuck::cast_slice(&result_buffer[..]);
    let i = (value[0] as usize) % max_result;
    msg!("The chosen mint index is {} out of {}", i, max_result);

    最后,我们会选中第i个索引处的值,并分配给lootbox指针的mint,然后将redeemable的值更改为true。这样一来,客户端便可观察到这一变化,一旦redeemabletrue,用户就能开始铸造他们的装备。

    let mint = available_gear[i];
    msg!("Next mint is {:?}", mint);
    ctx.accounts.lootbox_pointer.mint = mint;
    ctx.accounts.lootbox_pointer.redeemable = true;

    Ok(())
    }

    const AVAILABLE_GEAR: [&'static str; 5] = [
    "87QkviUPcxNqjdo1N6C4FrQe3ZiYdAyxGoT44ioDUG8m",
    "EypLPq3xBRREfpsdbyXfFjobVAnHsNerP892NMHWzrKj",
    "Ds1txTXZadjsjKtt2ybH56GQ2do4nbGc8nrSH3Ln8G9p",
    "EHPo4mSNCfYzX3Dtr832boZAiR8vy39eTsUfKprXbFus",
    "HzUvbXymUCBtubKQD9yiwWdivAbTiyKhpzVBcgD9DhrV",
    ];
    }

    正如之前所提及的,从战利品箱中获取物品的指令基本保持不变。如果您更细致地观察,就会发现它并没有与交换机进行任何交互,因此无需进行任何更新。

    客户端交互与测试

    最后,我们要来探讨与交换机相关的测试环节。我们已经审视了setupSwitchboard函数,以便准备测试。前三个测试主要用于质押、赎回和解质押。紧随其后的是init_user测试,非常直接明了。我们只需传入交换机状态的增量和权限增量,再加上四个账户即可。

    it("init user", async () => {
    const tx = await lootboxProgram.methods
    .initUser({
    switchboardStateBump: switchboardStateBump,
    vrfPermissionBump: permissionBump,
    })
    .accounts({
    state: userState,
    vrf: vrfAccount.publicKey,
    payer: wallet.pubkey,
    systemProgram: anchor.web3.SystemProgram.programId,
    })
    .rpc();
    })

    随后的选择性随机测试则相对复杂一些。前半部分与其他测试相似。我们首先创建一个虚拟的铸币机,用以铸造这些物品。然后获取或创建一个所谓的ATA,并将物品铸造到其中。除此之外,还有我们的质押账户,负责实际质押我们的NFT。

    it("Chooses a mint pseudorandomly", async () => {
    const mint = await createMint(
    provider.connection,
    wallet.payer,
    wallet.publicKey,
    wallet.publicKey,
    2
    )
    const ata = await getOrCreateAssociatedTokenAccount(
    provider.connection,
    wallet.payer,
    mint,
    wallet.publicKey
    )

    await mintToChecked(
    provider.connection,
    wallet.payer,
    mint,
    ata.address,
    wallet.payer,
    1000,
    2
    )

    const [stakeAccount] = anchor.web3.PublicKey.findProgramAddressSync(
    [wallet.publicKey.toBuffer(), nft.tokenAddress.toBuffer()],
    program.programId
    )

    我们首先从vrf账户中加载数据,并从交换机队列中获取我们的权限和数据缓冲区。随后,我们调用了openLootbox函数,这个函数需要许多合适的账户,数量相当多。其中大部分来自setupSwitchboard函数,还有一些则来自我们刚刚从交换机队列中获取的内容。

    const vrfState = await vrfAccount.loadData();
    const { authority, dataBuffer } = await switchboard.queue.loadData();

    await lootboxProgram.methods
    .openLootbox(new BN(10))
    .accounts({
    user: wallet.publicKey,
    stakeMint: mint,
    stakeMintAta: ata.address,
    stakeState: stakeAccount,
    state: userState,
    vrf: vrfAccount.publicKey,
    oracleQueue: switchboard.queue.publicKey,
    queueAuthority: authority,
    dataBuffer: dataBuffer,
    permission: permissionAccount.publicKey,
    escrow: vrfState.escrow,
    programState: switchboardStateAccount.publicKey,
    switchboardProgram: switchboard.program.programId,
    payerWallet: switchboard.payerTokenWallet,
    recentBlockhashes: anchor.web3.SYSVAR_RECENT_BLOCKHASHES_PUBKEY,
    })
    .rpc();

    接下来,我们使用了awaitCallback函数,在其中我们传递了lootbox程序、指针PDA,并设置了20秒的等待时间。在这段时间内,我们将观察lootbox指针是否更新为新的mint

    await awaitCallback(
    lootboxProgram,
    lootboxPointerPda,
    20_000,
    "Didn't get random mint"
    );

    下面是等待回调函数的部分,您可以随意引用。在这里,您会看到它实际上只是静静地等待。它会观察战利品盒指针上的账户变化,一旦有变化,它就会检查战利品盒指针,看看是否已设置为“可兑换”为真。如果是这样,它就会解决并完成回调,一切都将顺利进行。如果在20秒内没有发生任何变化,它将报告"未获得随机铸币"的错误。

    async function awaitCallback(
    program: Program<LootboxProgram>,
    lootboxPointerAddress: anchor.web3.PublicKey,
    timeoutInterval: number,
    errorMsg = "Timed out waiting for VRF Client callback"
    ) {
    let ws: number | undefined = undefined
    const result: boolean = await promiseWithTimeout(
    timeoutInterval,
    new Promise((resolve: (result: boolean) => void) => {
    ws = program.provider.connection.onAccountChange(
    lootboxPointerAddress,
    async (
    accountInfo: anchor.web3.AccountInfo<Buffer>,
    context: anchor.web3.Context
    ) => {
    const lootboxPointer = await program.account.lootboxPointer.fetch(
    lootboxPointerAddress
    )

    if (lootboxPointer.redeemable) {
    resolve(true)
    }
    }
    )
    }).finally(async () => {
    if (ws) {
    await program.provider.connection.removeAccountChangeListener(ws)
    }
    ws = undefined
    }),
    new Error(errorMsg)
    ).finally(async () => {
    if (ws) {
    await program.provider.connection.removeAccountChangeListener(ws)
    }
    ws = undefined
    })

    return result
    }

    最后,我们来测试选定齿轮的铸造过程。首先,我们获取战利品箱指针,从中找到铸币,并获取我们需要的ATA以使其工作。然后,我们将检查是否之前已经有了相同的齿轮,以防止我们重复运行。随后,我们调用从战利品箱中检索物品的函数,并再次确认新的齿轮数量是之前的数量加一。

    it("Mints the selected gear", async () => {
    const [pointerAddress] = anchor.web3.PublicKey.findProgramAddressSync(
    [Buffer.from("lootbox"), wallet.publicKey.toBuffer()],
    lootboxProgram.programId
    );

    const pointer = await lootboxProgram.account.lootboxPointer.fetch(
    pointerAddress
    );

    let previousGearCount = 0;
    const gearAta = await getAssociatedTokenAddress(
    pointer.mint,
    wallet.publicKey
    );
    try {
    let gearAccount = await getAccount(provider.connection, gearAta);
    previousGearCount = Number(gearAccount.amount);
    } catch (error) {}

    await lootboxProgram.methods
    .retrieveItemFromLootbox()
    .accounts({
    mint: pointer.mint,
    userGearAta: gearAta,
    })
    .rpc();

    const gearAccount = await getAccount(provider.connection, gearAta);
    expect(Number(gearAccount.amount)).to.equal(previousGearCount + 1);
    })

    现在您可以运行上述代码,希望一切能正常工作。如果刚开始不成功,请不要气馁。我们自己也花了好几天的时间进行调试。

    - +
    Skip to main content

    🎁 开启战利品箱

    现在我们来深入探讨开启战利品箱的指南。首先你会注意到的是,这个过程涉及许多账号,总共有19个!

    直到stake_state为止,这些信息都是我们之前已经了解的。

    我们正在添加与总线相关的内容,包括我们在初始化用户中刚刚设置的用户状态。然后还有一系列总线账户,包括vrf账户、oracle队列账户、队列权限账户(这只是权限的PDA)、数据缓冲区账户、权限账户、托管账户、程序状态账户和总线程序账户本身。

    你会发现还有一些我们尚未讨论过的类型,它们来自switchboard-v2 crate。以下是你需要添加到Cargo.toml中的两个依赖项,以确保所有这些类型都能正常工作。

    switchboard-v2 = { version = "^0.1.14", features = ["devnet"] }
    bytemuck = "1.7.2"

    最后两个账户是付款人钱包,它与你的switchboard代币关联,用于支付随机性和最近的区块哈希。

    use crate::*;
    use anchor_lang::solana_program;

    #[derive(Accounts)]
    pub struct OpenLootbox<'info> {
    #[account(mut)]
    pub user: Signer<'info>,
    #[account(
    init_if_needed,
    payer = user,
    space = std::mem::size_of::<LootboxPointer>() + 8,
    seeds=["lootbox".as_bytes(), user.key().as_ref()],
    bump
    )]
    pub lootbox_pointer: Box<Account<'info, LootboxPointer>>,
    pub system_program: Program<'info, System>,
    pub token_program: Program<'info, Token>,
    // TESTING - Uncomment the next line during testing
    // #[account(mut)]
    // TESTING - Comment out the next three lines during testing
    #[account(
    mut,
    address="D7F9JnGcjxQwz9zEQmasksX1VrwFcfRKu8Vdqrk2enHR".parse::<Pubkey>().unwrap()
    )]
    pub stake_mint: Account<'info, Mint>,
    #[account(
    mut,
    associated_token::mint=stake_mint,
    associated_token::authority=user
    )]
    pub stake_mint_ata: Box<Account<'info, TokenAccount>>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    #[account(
    constraint=stake_state.user_pubkey==user.key(),
    )]
    pub stake_state: Box<Account<'info, UserStakeInfo>>,
    #[account(
    mut,
    // TESTING - Comment out these seeds for testing
    seeds = [
    user.key().as_ref(),
    ],
    // TESTING - Uncomment these seeds for testing
    // seeds = [
    // vrf.key().as_ref(),
    // user.key().as_ref()
    // ],
    bump = state.load()?.bump,
    has_one = vrf @ LootboxError::InvalidVrfAccount
    )]
    pub state: AccountLoader<'info, UserState>,

    // SWITCHBOARD ACCOUNTS
    #[account(mut,
    has_one = escrow
    )]
    pub vrf: AccountLoader<'info, VrfAccountData>,
    #[account(mut,
    has_one = data_buffer
    )]
    pub oracle_queue: AccountLoader<'info, OracleQueueAccountData>,
    /// CHECK:
    #[account(mut,
    constraint =
    oracle_queue.load()?.authority == queue_authority.key()
    )]
    pub queue_authority: UncheckedAccount<'info>,
    /// CHECK
    #[account(mut)]
    pub data_buffer: AccountInfo<'info>,
    #[account(mut)]
    pub permission: AccountLoader<'info, PermissionAccountData>,
    #[account(mut,
    constraint =
    escrow.owner == program_state.key()
    && escrow.mint == program_state.load()?.token_mint
    )]
    pub escrow: Account<'info, TokenAccount>,
    #[account(mut)]
    pub program_state: AccountLoader<'info, SbState>,
    /// CHECK:
    #[account(
    address = *vrf.to_account_info().owner,
    constraint = switchboard_program.executable == true
    )]
    pub switchboard_program: AccountInfo<'info>,

    // PAYER ACCOUNTS
    #[account(mut,
    constraint =
    payer_wallet.owner == user.key()
    && escrow.mint == program_state.load()?.token_mint
    )]
    pub payer_wallet: Account<'info, TokenAccount>,
    // SYSTEM ACCOUNTS
    /// CHECK:
    #[account(address = solana_program::sysvar::recent_blockhashes::ID)]
    pub recent_blockhashes: AccountInfo<'info>,
    }

    在我们的账户配置之后,下面的代码片段是我们在开放式战利品箱实现中真正进行的操作,需要注意的是,这正是我们逻辑所在的地方。

    起初,我们加载状态的部分与以前完全相同。一旦我们加载了状态,我们就从状态中获取了我们的 bump(译者注:bump通常用于校验或确保唯一性),还有我们在初始化用户时添加的另外两个 bump。我们还从内存中删除了状态。

    let state = ctx.accounts.state.load()?;
    let bump = state.bump.clone();
    let switchboard_state_bump = state.switchboard_state_bump;
    let vrf_permission_bump = state.vrf_permission_bump;
    drop(state);

    接下来,我们从账户列表中获取了交换机程序本身。然后,我们构建了VRF请求的随机性,这实际上是我们用于CPI(跨程序调用)的上下文,在我们几行后调用vrf_request_randomness时会用到。

    再次,你会看到一些被注释掉的代码,用来区分生产环境和测试环境。我们仅在测试目的下使用vrf账户。

    let switchboard_program = ctx.accounts.switchboard_program.to_account_info();

    let vrf_request_randomness = VrfRequestRandomness {
    authority: ctx.accounts.state.to_account_info(),
    vrf: ctx.accounts.vrf.to_account_info(),
    oracle_queue: ctx.accounts.oracle_queue.to_account_info(),
    queue_authority: ctx.accounts.queue_authority.to_account_info(),
    data_buffer: ctx.accounts.data_buffer.to_account_info(),
    permission: ctx.accounts.permission.to_account_info(),
    escrow: ctx.accounts.escrow.clone(),
    payer_wallet: ctx.accounts.payer_wallet.clone(),
    payer_authority: ctx.accounts.user.to_account_info(),
    recent_blockhashes: ctx.accounts.recent_blockhashes.to_account_info(),
    program_state: ctx.accounts.program_state.to_account_info(),
    token_program: ctx.accounts.token_program.to_account_info(),
    };

    let payer = ctx.accounts.user.key();
    // TESTING - uncomment the following during tests
    let vrf = ctx.accounts.vrf.key();
    let state_seeds: &[&[&[u8]]] = &[&[vrf.as_ref(), payer.as_ref(), &[bump]]];
    // TESTING - comment out the next line during tests
    // let state_seeds: &[&[&[u8]]] = &[&[payer.as_ref(), &[bump]]];

    这是对switchboard的呼叫。

    msg!("requesting randomness");
    vrf_request_randomness.invoke_signed(
    switchboard_program,
    switchboard_state_bump,
    vrf_permission_bump,
    state_seeds,
    )?;

    msg!("randomness requested successfully");

    最后,我们将随机请求更改为已初始化为true

    ctx.accounts.lootbox_pointer.randomness_requested = true;
    ctx.accounts.lootbox_pointer.is_initialized = true;
    ctx.accounts.lootbox_pointer.available_lootbox = box_number * 2;

    Ok(())

    我们再来探讨战利品盒指针结构体,注意到其中有一个名为 redeemable 的属性。这个属性让客户端可以观察战利品盒指针账户,一旦它从false变为true,我们便能知道随机性已经恢复,可以开始进行铸造。此变化是在消耗随机性函数中发生的。

    #[account]
    pub struct LootboxPointer {
    pub mint: Pubkey,
    pub redeemable: bool,
    pub randomness_requested: bool,
    pub available_lootbox: u64,
    pub is_initialized: bool,
    }

    下面我们来看一下这个函数,并对它进行解读。该函数由交换机调用,并且内容在 callback 文件中提供。回调中的四个账户与ConsumeRandomness中的账户匹配,loobox指针和状态是可变的。

    use crate::state::*;
    use crate::*;

    #[derive(Accounts)]
    pub struct ConsumeRandomness<'info> {
    #[account(
    mut,
    // TESTING - Comment out these seeds for testing
    seeds = [
    payer.key().as_ref(),
    ],
    // TESTING - Uncomment these seeds for testing
    // seeds = [
    // vrf.key().as_ref(),
    // payer.key().as_ref()
    // ],
    bump = state.load()?.bump,
    has_one = vrf @ LootboxError::InvalidVrfAccount
    )]
    pub state: AccountLoader<'info, UserState>,
    pub vrf: AccountLoader<'info, VrfAccountData>,
    #[account(
    mut,
    seeds=["lootbox".as_bytes(), payer.key().as_ref()],
    bump
    )]
    pub lootbox_pointer: Account<'info, LootboxPointer>,
    /// CHECK: ...
    pub payer: AccountInfo<'info>,
    }

    在实际执行上,我们在流程指令功能中首先加载vrf和状态账户。随后,我们从vrf账户获取结果缓冲区,并检查确保其不为空。

    impl ConsumeRandomness<'_> {
    pub fn process_instruction(ctx: &mut Context<Self>) -> Result<()> {
    let vrf = ctx.accounts.vrf.load()?;
    let state = &mut ctx.accounts.state.load_mut()?;

    let result_buffer = vrf.get_result()?;
    if result_buffer == [0u8; 32] {
    msg!("vrf buffer empty");
    return Ok(());
    }

    if result_buffer == state.result_buffer {
    msg!("result_buffer unchanged");
    return Ok(());
    }
    }

    接下来,我们将对可用的装备进行映射。此时,我们仅使用下方定义的常量,方便在构建程序时进行必要的修改。这将给我们一个公钥向量。

    let available_gear: Vec<Pubkey> = Self::AVAILABLE_GEAR
    .into_iter()
    .map(|key| key.parse::<Pubkey>().unwrap())
    .collect();

    value 变量中,我们将结果缓冲区转换为无符号8位整数,这是switchboard推荐的实现方式,采用了 bytemuck crate。最后,我们通过取模运算和可用的最大薄荷数量来随机选择一个。

    // maximum value to convert randomness buffer
    let max_result = available_gear.len();
    let value: &[u8] = bytemuck::cast_slice(&result_buffer[..]);
    let i = (value[0] as usize) % max_result;
    msg!("The chosen mint index is {} out of {}", i, max_result);

    最后,我们会选中第i个索引处的值,并分配给lootbox指针的mint,然后将redeemable的值更改为true。这样一来,客户端便可观察到这一变化,一旦redeemabletrue,用户就能开始铸造他们的装备。

    let mint = available_gear[i];
    msg!("Next mint is {:?}", mint);
    ctx.accounts.lootbox_pointer.mint = mint;
    ctx.accounts.lootbox_pointer.redeemable = true;

    Ok(())
    }

    const AVAILABLE_GEAR: [&'static str; 5] = [
    "87QkviUPcxNqjdo1N6C4FrQe3ZiYdAyxGoT44ioDUG8m",
    "EypLPq3xBRREfpsdbyXfFjobVAnHsNerP892NMHWzrKj",
    "Ds1txTXZadjsjKtt2ybH56GQ2do4nbGc8nrSH3Ln8G9p",
    "EHPo4mSNCfYzX3Dtr832boZAiR8vy39eTsUfKprXbFus",
    "HzUvbXymUCBtubKQD9yiwWdivAbTiyKhpzVBcgD9DhrV",
    ];
    }

    正如之前所提及的,从战利品箱中获取物品的指令基本保持不变。如果您更细致地观察,就会发现它并没有与交换机进行任何交互,因此无需进行任何更新。

    客户端交互与测试

    最后,我们要来探讨与交换机相关的测试环节。我们已经审视了setupSwitchboard函数,以便准备测试。前三个测试主要用于质押、赎回和解质押。紧随其后的是init_user测试,非常直接明了。我们只需传入交换机状态的增量和权限增量,再加上四个账户即可。

    it("init user", async () => {
    const tx = await lootboxProgram.methods
    .initUser({
    switchboardStateBump: switchboardStateBump,
    vrfPermissionBump: permissionBump,
    })
    .accounts({
    state: userState,
    vrf: vrfAccount.publicKey,
    payer: wallet.pubkey,
    systemProgram: anchor.web3.SystemProgram.programId,
    })
    .rpc();
    })

    随后的选择性随机测试则相对复杂一些。前半部分与其他测试相似。我们首先创建一个虚拟的铸币机,用以铸造这些物品。然后获取或创建一个所谓的ATA,并将物品铸造到其中。除此之外,还有我们的质押账户,负责实际质押我们的NFT。

    it("Chooses a mint pseudorandomly", async () => {
    const mint = await createMint(
    provider.connection,
    wallet.payer,
    wallet.publicKey,
    wallet.publicKey,
    2
    )
    const ata = await getOrCreateAssociatedTokenAccount(
    provider.connection,
    wallet.payer,
    mint,
    wallet.publicKey
    )

    await mintToChecked(
    provider.connection,
    wallet.payer,
    mint,
    ata.address,
    wallet.payer,
    1000,
    2
    )

    const [stakeAccount] = anchor.web3.PublicKey.findProgramAddressSync(
    [wallet.publicKey.toBuffer(), nft.tokenAddress.toBuffer()],
    program.programId
    )

    我们首先从vrf账户中加载数据,并从交换机队列中获取我们的权限和数据缓冲区。随后,我们调用了openLootbox函数,这个函数需要许多合适的账户,数量相当多。其中大部分来自setupSwitchboard函数,还有一些则来自我们刚刚从交换机队列中获取的内容。

    const vrfState = await vrfAccount.loadData();
    const { authority, dataBuffer } = await switchboard.queue.loadData();

    await lootboxProgram.methods
    .openLootbox(new BN(10))
    .accounts({
    user: wallet.publicKey,
    stakeMint: mint,
    stakeMintAta: ata.address,
    stakeState: stakeAccount,
    state: userState,
    vrf: vrfAccount.publicKey,
    oracleQueue: switchboard.queue.publicKey,
    queueAuthority: authority,
    dataBuffer: dataBuffer,
    permission: permissionAccount.publicKey,
    escrow: vrfState.escrow,
    programState: switchboardStateAccount.publicKey,
    switchboardProgram: switchboard.program.programId,
    payerWallet: switchboard.payerTokenWallet,
    recentBlockhashes: anchor.web3.SYSVAR_RECENT_BLOCKHASHES_PUBKEY,
    })
    .rpc();

    接下来,我们使用了awaitCallback函数,在其中我们传递了lootbox程序、指针PDA,并设置了20秒的等待时间。在这段时间内,我们将观察lootbox指针是否更新为新的mint

    await awaitCallback(
    lootboxProgram,
    lootboxPointerPda,
    20_000,
    "Didn't get random mint"
    );

    下面是等待回调函数的部分,您可以随意引用。在这里,您会看到它实际上只是静静地等待。它会观察战利品盒指针上的账户变化,一旦有变化,它就会检查战利品盒指针,看看是否已设置为“可兑换”为真。如果是这样,它就会解决并完成回调,一切都将顺利进行。如果在20秒内没有发生任何变化,它将报告"未获得随机铸币"的错误。

    async function awaitCallback(
    program: Program<LootboxProgram>,
    lootboxPointerAddress: anchor.web3.PublicKey,
    timeoutInterval: number,
    errorMsg = "Timed out waiting for VRF Client callback"
    ) {
    let ws: number | undefined = undefined
    const result: boolean = await promiseWithTimeout(
    timeoutInterval,
    new Promise((resolve: (result: boolean) => void) => {
    ws = program.provider.connection.onAccountChange(
    lootboxPointerAddress,
    async (
    accountInfo: anchor.web3.AccountInfo<Buffer>,
    context: anchor.web3.Context
    ) => {
    const lootboxPointer = await program.account.lootboxPointer.fetch(
    lootboxPointerAddress
    )

    if (lootboxPointer.redeemable) {
    resolve(true)
    }
    }
    )
    }).finally(async () => {
    if (ws) {
    await program.provider.connection.removeAccountChangeListener(ws)
    }
    ws = undefined
    }),
    new Error(errorMsg)
    ).finally(async () => {
    if (ws) {
    await program.provider.connection.removeAccountChangeListener(ws)
    }
    ws = undefined
    })

    return result
    }

    最后,我们来测试选定齿轮的铸造过程。首先,我们获取战利品箱指针,从中找到铸币,并获取我们需要的ATA以使其工作。然后,我们将检查是否之前已经有了相同的齿轮,以防止我们重复运行。随后,我们调用从战利品箱中检索物品的函数,并再次确认新的齿轮数量是之前的数量加一。

    it("Mints the selected gear", async () => {
    const [pointerAddress] = anchor.web3.PublicKey.findProgramAddressSync(
    [Buffer.from("lootbox"), wallet.publicKey.toBuffer()],
    lootboxProgram.programId
    );

    const pointer = await lootboxProgram.account.lootboxPointer.fetch(
    pointerAddress
    );

    let previousGearCount = 0;
    const gearAta = await getAssociatedTokenAddress(
    pointer.mint,
    wallet.publicKey
    );
    try {
    let gearAccount = await getAccount(provider.connection, gearAta);
    previousGearCount = Number(gearAccount.amount);
    } catch (error) {}

    await lootboxProgram.methods
    .retrieveItemFromLootbox()
    .accounts({
    mint: pointer.mint,
    userGearAta: gearAta,
    })
    .rpc();

    const gearAccount = await getAccount(provider.connection, gearAta);
    expect(Number(gearAccount.amount)).to.equal(previousGearCount + 1);
    })

    现在您可以运行上述代码,希望一切能正常工作。如果刚开始不成功,请不要气馁。我们自己也花了好几天的时间进行调试。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/randomness/randomising-loot-with-switchborar/index.html b/Solana-Co-Learn/module6/randomness/randomising-loot-with-switchborar/index.html index 5dfcba02a..6eb151521 100644 --- a/Solana-Co-Learn/module6/randomness/randomising-loot-with-switchborar/index.html +++ b/Solana-Co-Learn/module6/randomness/randomising-loot-with-switchborar/index.html @@ -5,13 +5,13 @@ 使用Switchboard进行随机化战利品 | All in One Solana - +
    -
    Skip to main content

    使用Switchboard进行随机化战利品

    现在我们将深入探讨简单战利品箱的实现解决方案。我们会创建一个新程序,用于创建战利品箱并从中获取物品。

    我们将审查的解决方案代码位于Anchor NFT Staking存储库的solution-naive-loot-boxes分支之一。

    我再次强调,建议你自行尝试操作,而不是直接复制粘贴解决方案代码。

    在programs目录中,你可以使用命令anchor new <program-name>来创建一个新程序,我们将其称为lootbox-program

    如果你仔细观察,Anchor.toml文件中nft-staking程序的ID已经变化了,我们还新增了一个loot box程序的ID。你需要在自己的端更新这两个ID。

    首先,让我们回顾一下对原始质押计划所作的修改。

    如果你向下滚动到UserStakeInfo对象,你会发现我们添加了total_earned字段。它会跟踪用户的质押旅程,随着时间的推移,他们将赚取更多的奖励,并且在达到新的里程碑时,将获得更多的战利品箱物品。

    同样相关的是redeem_amount

    首先,你会注意到有些注释被注释掉了,这仅是为了确保我们有足够的令牌进行测试。在测试时,请确保正确地注释/取消注释代码。

    往下滚动一点,你会看到这一行新添加的内容。

    ctx.accounts.stake_state.total_earned += redeem_amount as u64;

    这是一种跟踪总收益的方法,从0开始,然后你添加已兑换的金额,这将成为新的总收益。

    在下面的解除质押功能中,你还会发现测试说明和赎回金额都发生了变化。

    最后,在这个文件中还有一个最后的更改。如果你的程序与我的完全相同,当我们运行它时,由于添加了这个新字段,我们可能会在堆栈中耗尽空间。我选择了一个随机账户,并在其周围放置了一个盒子,确保它被分配到堆中而不是栈中,以解决这个空间问题。你可以在用户的stake ATA上进行操作,或者选择任何其他账户。

    pub user_stake_ata: Box<Account<'info, TokenAccount>>,

    好的,让我们进入新的战利品箱计划的文件。

    Cargo.toml中,你会注意到我们为我们原始的锚定NFT质押程序添加了一个新的依赖项。

    [dependencies]
    anchor-lang = { version="0.25.0", features=["init-if-needed"] }
    anchor-spl = "0.25.0"
    anchor-nft-staking = { path = "../anchor-nft-staking", features = ["cpi"] }

    现在让我们进入主要的战利品箱程序文件

    在使用语句中,你会注意到我们现在导入了锚定NFT质押,这样我们就可以检查总收益字段了。

    use anchor_lang::prelude::*;
    use anchor_nft_staking::UserStakeInfo;
    use anchor_spl::token;
    use anchor_spl::{
    associated_token::AssociatedToken,
    token::{Burn, Mint, MintTo, Token, TokenAccount},
    };

    这里,我们只有两个指令,open_lootboxretrieve_item_from_lootbox。有两个指令的原因是,当你请求“给我一个随机的战利品”时,程序必须决定要铸造和赠送的所有可能物品,客户端必须传入所有可能的铸造账户。这使程序变得不那么灵活,并增加了检查一堆不同账户以确保有选项的开销,对客户端来说也非常麻烦。因此,我们创建了一个用于打开战利品箱的指令,基本上是在所有可能的铸造选项中给我一个。我们还选择了这个地方作为支付的地方,这是我们将烧毁BLD代币的地方。至于第二个指令,在这一点上,客户端知道他们将获得哪个铸造物品,并可以传入该信息,然后我们可以从中铸造。

    首先,让我们打开战利品箱,看看我们需要的账号。

    #[derive(Accounts)]
    pub struct OpenLootbox<'info> {
    #[account(mut)]
    pub user: Signer<'info>,
    #[account(
    init_if_needed,
    payer = user,
    space = std::mem::size_of::<LootboxPointer>() + 8,
    seeds=["lootbox".as_bytes(), user.key().as_ref()],
    bump
    )]
    pub lootbox_pointer: Account<'info, LootboxPointer>,
    pub system_program: Program<'info, System>,
    pub token_program: Program<'info, Token>,
    // Swap the next two lines out between prod/testing
    // #[account(mut)]
    #[account(
    mut,
    address="6YR1nuLqkk8VC1v42xJaPKvE9X9pnuqVAvthFUSDsMUL".parse::<Pubkey>().unwrap()
    )]
    pub stake_mint: Account<'info, Mint>,
    #[account(
    mut,
    associated_token::mint=stake_mint,
    associated_token::authority=user
    )]
    pub stake_mint_ata: Account<'info, TokenAccount>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    #[account(
    constraint=stake_state.user_pubkey==user.key(),
    )]
    pub stake_state: Account<'info, UserStakeInfo>,
    }

    你会发现一个名为lootbox_pointer的新元素,这是一种全新的类型。它包括一个薄荷属性、一个布尔值用来表示是否已被领取,以及一个is_initialized属性。

    这是一个与用户关联的PDA(Program-derived address),因此其种子是“战利品箱”和用户。通过这样做,当我们选中一个薄荷时,我们不将数据返回给客户端,而是存储在某个账户中。因此,这是一个用户可以查询并检索物品的PDA

    此外,需要注意的是,在某行代码的开头有一个“Swap”注释行。为了使测试正常运行,需要取消这些行的注释,并注释掉其他包含心智地址的stake_mint属性行。

    下面的Rust代码展示了LootboxPointer结构:

    #[account]
    pub struct LootboxPointer {
    mint: Pubkey,
    claimed: bool,
    is_initialized: bool,
    }

    接下来,我们来详细了解这个功能。首先,我们要验证它是否是一个有效的战利品箱。

    用户输入一个盒子号码,然后程序会运行一个无限循环。在每次迭代中,如果BLD令牌的数量过低,我们会返回错误。其他两种可能的路径是:要么将loot_box号码加倍,要么如果在loot_box号码和box_number之间找到匹配,我们要求stake_state PDAs的总收益不少于传入的box_number。简而言之,你必须赚得比盒子号码更多。

    以下是打开战利品箱的函数:

    pub fn open_lootbox(ctx: Context<OpenLootbox>, box_number: u64) -> Result<()> {
    let mut loot_box = 10;
    loop {
    if loot_box > box_number {
    return err!(LootboxError::InvalidLootbox);
    }

    if loot_box == box_number {
    require!(
    ctx.accounts.stake_state.total_earned >= box_number,
    LootboxError::InvalidLootbox
    );
    break;
    } else {
    loot_box = loot_box * 2;
    }
    }

    require!(
    !ctx.accounts.lootbox_pointer.is_initialized || ctx.accounts.lootbox_pointer.claimed,
    LootboxError::InvalidLootbox
    );
    }

    然后我们继续进行代币销毁,销毁与盒子编号所需数量相对应的代币。

    token::burn(
    CpiContext::new(
    ctx.accounts.token_program.to_account_info(),
    Burn {
    mint: ctx.accounts.stake_mint.to_account_info(),
    from: ctx.accounts.stake_mint_ata.to_account_info(),
    authority: ctx.accounts.user.to_account_info(),
    },
    ),
    box_number * u64::pow(10, 2),
    )?;

    该函数还涉及代币销毁操作,即销毁与盒子编号所需数量相匹配的代币。之后,我们将描述可用装备。当前是硬编码的,这是客户端代码中cache.json文件的数据,但有更灵活的方式来实现。

    let available_gear: Vec<Pubkey> = vec![
    "DQmrQJkErmfe6a1fD2hPwdLSnawzkdyrKfSUmd6vkC89"
    .parse::<Pubkey>()
    .unwrap(),
    "A26dg2NBfGgU6gpFPfsiLpxwsV13ZKiD58zgjeQvuad"
    .parse::<Pubkey>()
    .unwrap(),
    "GxR5UVvQDRwB19bCsB1wJh6RtLRZUbEAigtgeAsm6J7N"
    .parse::<Pubkey>()
    .unwrap(),
    "3rL2p6LsGyHVn3iwQQYV9bBmchxMHYPice6ntp7Qw8Pa"
    .parse::<Pubkey>()
    .unwrap(),
    "73JnegAtAWHmBYL7pipcSTpQkkAx77pqCQaEys2Qmrb2"
    .parse::<Pubkey>()
    .unwrap(),
    ];

    随后的代码片段展示了一种非安全的伪随机方法,获取当前时间(以秒为单位),然后对5取模,以确定我们应该选择这5个物品中的哪一个。一旦选择,我们将其分配给战利品盒指针。

    let clock = Clock::get()?;
    let i: usize = (clock.unix_timestamp % 5).try_into().unwrap();
    // Add in randomness later for selecting mint
    let mint = available_gear[i];
    ctx.accounts.lootbox_pointer.mint = mint;
    ctx.accounts.lootbox_pointer.claimed = false;
    ctx.accounts.lootbox_pointer.is_initialized = true;

    Ok(())
    }

    我们将在后续版本中处理真正的随机性,但目前这个版本已经足够。我们还将添加一个检查,以确保用户不能反复打开战利品箱,以获取他们想要的物品。现在,只要用户打开战利品箱,他们就可以看到其中的物品。我们可以检查战利品箱指针是否已初始化,如果没有,则无问题,可以继续进行。虽然每次尝试都需要付费,但是否将其作为功能由你决定。

    好了,现在让我们转到检索指令并查看所需的账户。

    #[derive(Accounts)]
    pub struct RetrieveItem<'info> {
    #[account(mut)]
    pub user: Signer<'info>,
    #[account(
    seeds=["lootbox".as_bytes(), user.key().as_ref()],
    bump,
    constraint=lootbox_pointer.is_initialized
    )]
    pub lootbox_pointer: Account<'info, LootboxPointer>,
    #[account(
    mut,
    constraint=lootbox_pointer.mint==mint.key()
    )]
    pub mint: Account<'info, Mint>,
    #[account(
    init_if_needed,
    payer=user,
    associated_token::mint=mint,
    associated_token::authority=user
    )]
    pub user_gear_ata: Account<'info, TokenAccount>,
    /// CHECK: Mint authority - not used as account
    #[account(
    seeds=["mint".as_bytes()],
    bump
    )]
    pub mint_authority: UncheckedAccount<'info>,
    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub system_program: Program<'info, System>,
    pub rent: Sysvar<'info, Rent>,
    }

    有几件事情我们需要明确。"mint account" 可以理解为他们所要求的装备的存储账户。"mint authority" 是我们在客户端脚本中分配的用于控制铸币的程序派生账户(PDA)。

    关于这部分的逻辑,首先,我们需要确保战利品箱指针还未被认领。

    pub fn retrieve_item_from_lootbox(ctx: Context<RetrieveItem>) -> Result<()> {
    require!(
    !ctx.accounts.lootbox_pointer.claimed,
    LootboxError::AlreadyClaimed
    );

    接下来,我们将战利品铸造给你。

    token::mint_to(
    CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    MintTo {
    mint: ctx.accounts.mint.to_account_info(),
    to: ctx.accounts.user_gear_ata.to_account_info(),
    authority: ctx.accounts.mint_authority.to_account_info(),
    },
    &[&[
    b"mint".as_ref(),
    &[*ctx.bumps.get("mint_authority").unwrap()],
    ]],
    ),
    1,
    )?;

    最后,我们将认领标记设为真实。

        ctx.accounts.lootbox_pointer.claimed = true;

    Ok(())
    }

    别忘了查看我们在文件底部创建的自定义错误代码。

    #[error_code]
    enum LootboxError {
    #[msg("Mint already claimed")]
    AlreadyClaimed,

    #[msg("Haven't staked long enough for this loot box or invalid loot box number")]
    InvalidLootbox,
    }

    这便是流程。如果你还没尝试实施这个,那么尝试一下,并进行一些测试。尽量自己独立完成。

    在这个文件中,你可以找到相关测试。你会注意到我们添加了两个测试,分别是“随机选择一种铸币口味”和“制造所选装备”。请注意在我们标注“Swap”的地方,更改代码行以使测试正常工作。然后运行测试,它们应该都会按预期运行。

    利用Switchboard的验证功能来随机分配战利品🔀

    任务

    既然你已经成功实现了简单的战利品箱,现在我们可以考虑通过`Switchboard`````````````````````来增强随机性的真实性(虽然从技术上说仍是伪随机,但比之前的随机性要好几个数量级)。

    Switchboard是建立在Solana上的分散式预言机网络。预言机是区块链与现实世界之间的连接桥梁,提供了在多个来源中数据达成共识的机制。在随机性方面,这意味着提供了一个可验证的伪随机结果,没有预言机则无法获得。这对于实现不能“作弊”的战利品箱至关重要。

    Oracle交互是一项涵盖我们在整个课程中所学的所有内容的综合练习。通常包括以下几个步骤:

    • Oracle程序进行客户端设置
    • 使用你自己的程序初始化与Oracle特定的账户(通常是PDAs
    • 你的程序向Oracle程序发出CPI调用,请求特定数据,例如,可验证的随机缓冲区
    • Oracle可以调用你的程序以提供所请求信息的指令
    • 执行你的程序对所请求数据进行操作的指令

    文档

    首先,Switchboard的文档在Web3上仍然相对稀缺,但你可以在此处阅读关于Switchboard可验证随机性的简要概述。然后你应该深入他们的集成文档。

    你可能还会有很多疑问。这没关系,不要感到气馁。这是一个培养自主解决问题能力的好机会。

    接下来你可以查看他们的逐步指南,了解获取随机性的过程。这会引导你了解如何设置Switchboard环境、初始化请求客户端、发出CPI指令、在你的程序中添加Switchboard可以调用的指令来提供随机性等步骤。

    最后的备注

    这个任务可能具有挑战性。这是故意设计的,是对过去六周努力理解Solana的工作的总结。我们还提供了一些关于如何在战利品箱计划中使用Switchboard的视频概览。

    你可以随时观看这些视频。通常,我会建议你先完成一些独立工作,但由于Switchboard的文档相对稀缺,所以尽早查看步骤说明可能会有所帮助。然而,我想提醒你,不要仅仅复制粘贴我的解决方案。相反,观看步骤说明后,尽量自己重新创建类似的内容。如果你准备在我们发布步骤说明之前参考解决方案代码,你可以随时查看这里solution-randomize-loot branch

    你可能需要超过本周结束前的时间来完成这项任务。这是正常的,也可能需要更多的时间来解决问题。没有关系

    - +
    Skip to main content

    使用Switchboard进行随机化战利品

    现在我们将深入探讨简单战利品箱的实现解决方案。我们会创建一个新程序,用于创建战利品箱并从中获取物品。

    我们将审查的解决方案代码位于Anchor NFT Staking存储库的solution-naive-loot-boxes分支之一。

    我再次强调,建议你自行尝试操作,而不是直接复制粘贴解决方案代码。

    在programs目录中,你可以使用命令anchor new <program-name>来创建一个新程序,我们将其称为lootbox-program

    如果你仔细观察,Anchor.toml文件中nft-staking程序的ID已经变化了,我们还新增了一个loot box程序的ID。你需要在自己的端更新这两个ID。

    首先,让我们回顾一下对原始质押计划所作的修改。

    如果你向下滚动到UserStakeInfo对象,你会发现我们添加了total_earned字段。它会跟踪用户的质押旅程,随着时间的推移,他们将赚取更多的奖励,并且在达到新的里程碑时,将获得更多的战利品箱物品。

    同样相关的是redeem_amount

    首先,你会注意到有些注释被注释掉了,这仅是为了确保我们有足够的令牌进行测试。在测试时,请确保正确地注释/取消注释代码。

    往下滚动一点,你会看到这一行新添加的内容。

    ctx.accounts.stake_state.total_earned += redeem_amount as u64;

    这是一种跟踪总收益的方法,从0开始,然后你添加已兑换的金额,这将成为新的总收益。

    在下面的解除质押功能中,你还会发现测试说明和赎回金额都发生了变化。

    最后,在这个文件中还有一个最后的更改。如果你的程序与我的完全相同,当我们运行它时,由于添加了这个新字段,我们可能会在堆栈中耗尽空间。我选择了一个随机账户,并在其周围放置了一个盒子,确保它被分配到堆中而不是栈中,以解决这个空间问题。你可以在用户的stake ATA上进行操作,或者选择任何其他账户。

    pub user_stake_ata: Box<Account<'info, TokenAccount>>,

    好的,让我们进入新的战利品箱计划的文件。

    Cargo.toml中,你会注意到我们为我们原始的锚定NFT质押程序添加了一个新的依赖项。

    [dependencies]
    anchor-lang = { version="0.25.0", features=["init-if-needed"] }
    anchor-spl = "0.25.0"
    anchor-nft-staking = { path = "../anchor-nft-staking", features = ["cpi"] }

    现在让我们进入主要的战利品箱程序文件

    在使用语句中,你会注意到我们现在导入了锚定NFT质押,这样我们就可以检查总收益字段了。

    use anchor_lang::prelude::*;
    use anchor_nft_staking::UserStakeInfo;
    use anchor_spl::token;
    use anchor_spl::{
    associated_token::AssociatedToken,
    token::{Burn, Mint, MintTo, Token, TokenAccount},
    };

    这里,我们只有两个指令,open_lootboxretrieve_item_from_lootbox。有两个指令的原因是,当你请求“给我一个随机的战利品”时,程序必须决定要铸造和赠送的所有可能物品,客户端必须传入所有可能的铸造账户。这使程序变得不那么灵活,并增加了检查一堆不同账户以确保有选项的开销,对客户端来说也非常麻烦。因此,我们创建了一个用于打开战利品箱的指令,基本上是在所有可能的铸造选项中给我一个。我们还选择了这个地方作为支付的地方,这是我们将烧毁BLD代币的地方。至于第二个指令,在这一点上,客户端知道他们将获得哪个铸造物品,并可以传入该信息,然后我们可以从中铸造。

    首先,让我们打开战利品箱,看看我们需要的账号。

    #[derive(Accounts)]
    pub struct OpenLootbox<'info> {
    #[account(mut)]
    pub user: Signer<'info>,
    #[account(
    init_if_needed,
    payer = user,
    space = std::mem::size_of::<LootboxPointer>() + 8,
    seeds=["lootbox".as_bytes(), user.key().as_ref()],
    bump
    )]
    pub lootbox_pointer: Account<'info, LootboxPointer>,
    pub system_program: Program<'info, System>,
    pub token_program: Program<'info, Token>,
    // Swap the next two lines out between prod/testing
    // #[account(mut)]
    #[account(
    mut,
    address="6YR1nuLqkk8VC1v42xJaPKvE9X9pnuqVAvthFUSDsMUL".parse::<Pubkey>().unwrap()
    )]
    pub stake_mint: Account<'info, Mint>,
    #[account(
    mut,
    associated_token::mint=stake_mint,
    associated_token::authority=user
    )]
    pub stake_mint_ata: Account<'info, TokenAccount>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    #[account(
    constraint=stake_state.user_pubkey==user.key(),
    )]
    pub stake_state: Account<'info, UserStakeInfo>,
    }

    你会发现一个名为lootbox_pointer的新元素,这是一种全新的类型。它包括一个薄荷属性、一个布尔值用来表示是否已被领取,以及一个is_initialized属性。

    这是一个与用户关联的PDA(Program-derived address),因此其种子是“战利品箱”和用户。通过这样做,当我们选中一个薄荷时,我们不将数据返回给客户端,而是存储在某个账户中。因此,这是一个用户可以查询并检索物品的PDA

    此外,需要注意的是,在某行代码的开头有一个“Swap”注释行。为了使测试正常运行,需要取消这些行的注释,并注释掉其他包含心智地址的stake_mint属性行。

    下面的Rust代码展示了LootboxPointer结构:

    #[account]
    pub struct LootboxPointer {
    mint: Pubkey,
    claimed: bool,
    is_initialized: bool,
    }

    接下来,我们来详细了解这个功能。首先,我们要验证它是否是一个有效的战利品箱。

    用户输入一个盒子号码,然后程序会运行一个无限循环。在每次迭代中,如果BLD令牌的数量过低,我们会返回错误。其他两种可能的路径是:要么将loot_box号码加倍,要么如果在loot_box号码和box_number之间找到匹配,我们要求stake_state PDAs的总收益不少于传入的box_number。简而言之,你必须赚得比盒子号码更多。

    以下是打开战利品箱的函数:

    pub fn open_lootbox(ctx: Context<OpenLootbox>, box_number: u64) -> Result<()> {
    let mut loot_box = 10;
    loop {
    if loot_box > box_number {
    return err!(LootboxError::InvalidLootbox);
    }

    if loot_box == box_number {
    require!(
    ctx.accounts.stake_state.total_earned >= box_number,
    LootboxError::InvalidLootbox
    );
    break;
    } else {
    loot_box = loot_box * 2;
    }
    }

    require!(
    !ctx.accounts.lootbox_pointer.is_initialized || ctx.accounts.lootbox_pointer.claimed,
    LootboxError::InvalidLootbox
    );
    }

    然后我们继续进行代币销毁,销毁与盒子编号所需数量相对应的代币。

    token::burn(
    CpiContext::new(
    ctx.accounts.token_program.to_account_info(),
    Burn {
    mint: ctx.accounts.stake_mint.to_account_info(),
    from: ctx.accounts.stake_mint_ata.to_account_info(),
    authority: ctx.accounts.user.to_account_info(),
    },
    ),
    box_number * u64::pow(10, 2),
    )?;

    该函数还涉及代币销毁操作,即销毁与盒子编号所需数量相匹配的代币。之后,我们将描述可用装备。当前是硬编码的,这是客户端代码中cache.json文件的数据,但有更灵活的方式来实现。

    let available_gear: Vec<Pubkey> = vec![
    "DQmrQJkErmfe6a1fD2hPwdLSnawzkdyrKfSUmd6vkC89"
    .parse::<Pubkey>()
    .unwrap(),
    "A26dg2NBfGgU6gpFPfsiLpxwsV13ZKiD58zgjeQvuad"
    .parse::<Pubkey>()
    .unwrap(),
    "GxR5UVvQDRwB19bCsB1wJh6RtLRZUbEAigtgeAsm6J7N"
    .parse::<Pubkey>()
    .unwrap(),
    "3rL2p6LsGyHVn3iwQQYV9bBmchxMHYPice6ntp7Qw8Pa"
    .parse::<Pubkey>()
    .unwrap(),
    "73JnegAtAWHmBYL7pipcSTpQkkAx77pqCQaEys2Qmrb2"
    .parse::<Pubkey>()
    .unwrap(),
    ];

    随后的代码片段展示了一种非安全的伪随机方法,获取当前时间(以秒为单位),然后对5取模,以确定我们应该选择这5个物品中的哪一个。一旦选择,我们将其分配给战利品盒指针。

    let clock = Clock::get()?;
    let i: usize = (clock.unix_timestamp % 5).try_into().unwrap();
    // Add in randomness later for selecting mint
    let mint = available_gear[i];
    ctx.accounts.lootbox_pointer.mint = mint;
    ctx.accounts.lootbox_pointer.claimed = false;
    ctx.accounts.lootbox_pointer.is_initialized = true;

    Ok(())
    }

    我们将在后续版本中处理真正的随机性,但目前这个版本已经足够。我们还将添加一个检查,以确保用户不能反复打开战利品箱,以获取他们想要的物品。现在,只要用户打开战利品箱,他们就可以看到其中的物品。我们可以检查战利品箱指针是否已初始化,如果没有,则无问题,可以继续进行。虽然每次尝试都需要付费,但是否将其作为功能由你决定。

    好了,现在让我们转到检索指令并查看所需的账户。

    #[derive(Accounts)]
    pub struct RetrieveItem<'info> {
    #[account(mut)]
    pub user: Signer<'info>,
    #[account(
    seeds=["lootbox".as_bytes(), user.key().as_ref()],
    bump,
    constraint=lootbox_pointer.is_initialized
    )]
    pub lootbox_pointer: Account<'info, LootboxPointer>,
    #[account(
    mut,
    constraint=lootbox_pointer.mint==mint.key()
    )]
    pub mint: Account<'info, Mint>,
    #[account(
    init_if_needed,
    payer=user,
    associated_token::mint=mint,
    associated_token::authority=user
    )]
    pub user_gear_ata: Account<'info, TokenAccount>,
    /// CHECK: Mint authority - not used as account
    #[account(
    seeds=["mint".as_bytes()],
    bump
    )]
    pub mint_authority: UncheckedAccount<'info>,
    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub system_program: Program<'info, System>,
    pub rent: Sysvar<'info, Rent>,
    }

    有几件事情我们需要明确。"mint account" 可以理解为他们所要求的装备的存储账户。"mint authority" 是我们在客户端脚本中分配的用于控制铸币的程序派生账户(PDA)。

    关于这部分的逻辑,首先,我们需要确保战利品箱指针还未被认领。

    pub fn retrieve_item_from_lootbox(ctx: Context<RetrieveItem>) -> Result<()> {
    require!(
    !ctx.accounts.lootbox_pointer.claimed,
    LootboxError::AlreadyClaimed
    );

    接下来,我们将战利品铸造给你。

    token::mint_to(
    CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    MintTo {
    mint: ctx.accounts.mint.to_account_info(),
    to: ctx.accounts.user_gear_ata.to_account_info(),
    authority: ctx.accounts.mint_authority.to_account_info(),
    },
    &[&[
    b"mint".as_ref(),
    &[*ctx.bumps.get("mint_authority").unwrap()],
    ]],
    ),
    1,
    )?;

    最后,我们将认领标记设为真实。

        ctx.accounts.lootbox_pointer.claimed = true;

    Ok(())
    }

    别忘了查看我们在文件底部创建的自定义错误代码。

    #[error_code]
    enum LootboxError {
    #[msg("Mint already claimed")]
    AlreadyClaimed,

    #[msg("Haven't staked long enough for this loot box or invalid loot box number")]
    InvalidLootbox,
    }

    这便是流程。如果你还没尝试实施这个,那么尝试一下,并进行一些测试。尽量自己独立完成。

    在这个文件中,你可以找到相关测试。你会注意到我们添加了两个测试,分别是“随机选择一种铸币口味”和“制造所选装备”。请注意在我们标注“Swap”的地方,更改代码行以使测试正常工作。然后运行测试,它们应该都会按预期运行。

    利用Switchboard的验证功能来随机分配战利品🔀

    任务

    既然你已经成功实现了简单的战利品箱,现在我们可以考虑通过`Switchboard`````````````````````来增强随机性的真实性(虽然从技术上说仍是伪随机,但比之前的随机性要好几个数量级)。

    Switchboard是建立在Solana上的分散式预言机网络。预言机是区块链与现实世界之间的连接桥梁,提供了在多个来源中数据达成共识的机制。在随机性方面,这意味着提供了一个可验证的伪随机结果,没有预言机则无法获得。这对于实现不能“作弊”的战利品箱至关重要。

    Oracle交互是一项涵盖我们在整个课程中所学的所有内容的综合练习。通常包括以下几个步骤:

    • Oracle程序进行客户端设置
    • 使用你自己的程序初始化与Oracle特定的账户(通常是PDAs
    • 你的程序向Oracle程序发出CPI调用,请求特定数据,例如,可验证的随机缓冲区
    • Oracle可以调用你的程序以提供所请求信息的指令
    • 执行你的程序对所请求数据进行操作的指令

    文档

    首先,Switchboard的文档在Web3上仍然相对稀缺,但你可以在此处阅读关于Switchboard可验证随机性的简要概述。然后你应该深入他们的集成文档。

    你可能还会有很多疑问。这没关系,不要感到气馁。这是一个培养自主解决问题能力的好机会。

    接下来你可以查看他们的逐步指南,了解获取随机性的过程。这会引导你了解如何设置Switchboard环境、初始化请求客户端、发出CPI指令、在你的程序中添加Switchboard可以调用的指令来提供随机性等步骤。

    最后的备注

    这个任务可能具有挑战性。这是故意设计的,是对过去六周努力理解Solana的工作的总结。我们还提供了一些关于如何在战利品箱计划中使用Switchboard的视频概览。

    你可以随时观看这些视频。通常,我会建议你先完成一些独立工作,但由于Switchboard的文档相对稀缺,所以尽早查看步骤说明可能会有所帮助。然而,我想提醒你,不要仅仅复制粘贴我的解决方案。相反,观看步骤说明后,尽量自己重新创建类似的内容。如果你准备在我们发布步骤说明之前参考解决方案代码,你可以随时查看这里solution-randomize-loot branch

    你可能需要超过本周结束前的时间来完成这项任务。这是正常的,也可能需要更多的时间来解决问题。没有关系

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/ship-week/build-a-loot-box-program/index.html b/Solana-Co-Learn/module6/ship-week/build-a-loot-box-program/index.html index 4de1d43ad..dfaeb672e 100644 --- a/Solana-Co-Learn/module6/ship-week/build-a-loot-box-program/index.html +++ b/Solana-Co-Learn/module6/ship-week/build-a-loot-box-program/index.html @@ -5,14 +5,14 @@ 💰 构建一个战利品箱程序 | All in One Solana - +
    Skip to main content

    💰 构建一个战利品箱程序

    既然你已经让程序正常运转了,那么我们就来调整前端代码,以适应Anchor。这个配置只需一分钟,稍作等待,我们将会调整一些内容。欢迎来到“发货周”!整个周都将致力于让你的项目做好发货准备。对我们来说,这意味着完善buildoors项目。对你来说,同样的情况,但我们希望能看到你加入一些个人风格!

    剩下要做的主要事情就是实现战利品箱。目前,可以创建一个简单的战利品箱实现。

    这意味着:

    • 没有经过验证的随机性 - 你可以选择一个简单的伪随机实现,或者根本不使用随机性。
    • 现在可以使用静态解决方案 - 例如,不必设计成可以随后更新装备类型。暂时保持简单即可。
    • 创造力的展现 - 我说的不仅仅是“使用不同的图片”。请随意构建你自己的架构,并进行真正的创新实验。用密斯·弗里兹尔的名言来说:“冒险一试,犯错误,搞得一团糟!”
    info

    提示 -虽然如此,根据我们对战利品箱计划的处理方式,以下是一些建议(没错,我们将其作为一个独立的程序来处理):

    • 我们使用可替代资产而非非同质化代币(NFT)来分发战利品箱中的装备。
    • 我们刚刚修改了用于创建BLD代币的脚本,使每件装备都能生成一个“可替代资产”代币。
    • 战利品箱其实只是一个概念 - 没有任何代表它的代币或物品。

    为了从多个可能的铸币中分配(随机或其他方式),我们需要设置程序以进行两个单独的交易:

    1. open_lootbox: 它处理燃烧所需的$BLD代币以打开战利品箱,然后伪随机选择要铸造给调用者的装备,但是不立即铸造,而是将选择存储在与用户关联的PDA中。必须这样做,否则你将不得不将所有可能的装备铸造传递给指令,这将非常麻烦。
    2. retrieve_item_from_lootbox: 这个函数会检查之前提到的PDA,并将指定的装备发放给用户。

    再次强调,不要局限于我们的实现方式。在查看我们的解决方案之前,请自己尝试一下。我并不是说只试试20分钟就好了。我花了整整一天的时间才弄明白,所以在寻求我们的解决方案之前,不要害怕独立工作相当长的一段时间。

    祝你好运!

    - +虽然如此,根据我们对战利品箱计划的处理方式,以下是一些建议(没错,我们将其作为一个独立的程序来处理):

    为了从多个可能的铸币中分配(随机或其他方式),我们需要设置程序以进行两个单独的交易:

    1. open_lootbox: 它处理燃烧所需的$BLD代币以打开战利品箱,然后伪随机选择要铸造给调用者的装备,但是不立即铸造,而是将选择存储在与用户关联的PDA中。必须这样做,否则你将不得不将所有可能的装备铸造传递给指令,这将非常麻烦。
    2. retrieve_item_from_lootbox: 这个函数会检查之前提到的PDA,并将指定的装备发放给用户。

    再次强调,不要局限于我们的实现方式。在查看我们的解决方案之前,请自己尝试一下。我并不是说只试试20分钟就好了。我花了整整一天的时间才弄明白,所以在寻求我们的解决方案之前,不要害怕独立工作相当长的一段时间。

    祝你好运!

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/ship-week/create-gear-tokens/index.html b/Solana-Co-Learn/module6/ship-week/create-gear-tokens/index.html index 34478515f..7e0cb7a88 100644 --- a/Solana-Co-Learn/module6/ship-week/create-gear-tokens/index.html +++ b/Solana-Co-Learn/module6/ship-week/create-gear-tokens/index.html @@ -5,13 +5,13 @@ ⚙ 创建齿轮代币 | All in One Solana - +
    -
    Skip to main content

    ⚙ 创建齿轮代币

    让我们一起探讨一种可能的齿轮代币解决方案。

    我们即将深入探讨的解决方案代码位于Buildoors前端代码库solution-simple-gear分支上。如果你还没有尝试自己构建,请尽量避免直接从解决方案代码中复制粘贴。

    我们将会浏览两个不同的代码库。如果你还记得,我们在客户端项目中创建了BLD代币和NFT。幸运的是,我们在那里完成了这项工作,如果我们愿意,我们还可以将其转移到程序项目中。

    你可以在/tokens/gear/assets文件夹中找到齿轮的图像。我们选择将其制作为可替代资产,或带有关联元数据和0位小数的SPL代币,而不是NFT,这样它们就不仅限于一个单位。

    /tokens/gear/index.ts中的脚本负责生成与这些资产相关的货币,并将其存储在同一文件夹中的cache.json文件中。

    在脚本的内部部分,向下滚动你会看到我们的主要函数。

    async function main() {
    const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
    const payer = await initializeKeypair(connection)

    await createGear(
    connection,
    payer,
    new web3.PublicKey("6GE3ki2igpw2ZTAt6BV4pTjF5qvtCbFVQP7SGPJaEuoa"),
    ["Bow", "Glasses", "Hat", "Keyboard", "Mustache"]
    )
    }

    我们传入的公钥是为了我们的程序,以及铸币厂的名称列表,这些名称需要与资产文件夹中的内容相匹配。

    如果你在函数中向上滚动,你会看到它首先用一个空对象开始,其中将放置薄荷糖。

    let collection: any = {}

    然后我们创建了我们的metaplex对象,接着是一个循环,该循环为每个铸币执行脚本的功能。

    它从一个空的薄荷数组开始,这样我们就可以为每个资产添加多个薄荷。

    let mints: Array<string> = []

    接下来我们获取图像缓冲区并将其上传到`Arweave,进行持久化存储。

    const imageBuffer = fs.readFileSync(`tokens/gear/assets/${assets[i]}.png`)
    const file = toMetaplexFile(imageBuffer, `${assets[i]}.png`)
    const imageUri = await metaplex.storage().upload(file)

    在那之后,如果你想要不同的经验等级,我们就循环执行相应的次数,针对这个装备。在我们的示例中,只执行一次,因为经验等级从10开始并结束于10。如果你想要每个等级的五个装备,只需将上限增加到50,即xp <= 50

    for (let xp = 10; xp <= 10; xp += 10)...

    一旦进入循环,我们获取了将在后续分配的Mint Auth,即我们想要进行铸币的程序中的PDA - 用于战利品箱程序的PDA

    const [mintAuth] = await web3.PublicKey.findProgramAddress(
    [Buffer.from("mint")],
    programId
    )

    随后,我们创建了一个全新的代币,并将其小数位设置为0,因为它是一种不可分割的资产。

    const tokenMint = await token.createMint(
    connection,
    payer,
    payer.publicKey,
    payer.publicKey,
    0
    )

    一旦创建了该薄荷,我们将其推入薄荷数组中。

    mints.push(tokenMint.toBase58())

    接下来,我们会上传我们的链下元数据,其中包括名称、描述、图像链接和两个属性。

    const { uri } = await metaplex
    .nfts()
    .uploadMetadata({
    name: assets[i],
    description: "这是用来提升你的buildoor的装备",
    image: imageUri,
    attributes: [
    {
    trait_type: "xp",
    value: `${xp}`,
    },
    ],
    })
    .run()

    然后我们获取该薄荷的元数据PDA

    const metadataPda = await findMetadataPda(tokenMint)

    接下来,我们创建元数据的链上版本。

    const tokenMetadata = {
    name: assets[i],
    symbol: "BLDRGEAR",
    uri: uri,
    sellerFeeBasisPoints: 0,
    creators: null,
    collection: null,
    uses: null,
    } as DataV2

    按照之前的步骤,继续创建我们的V2指令。

    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]
    )

    现在我们将权限更改为mintAuth,即战利品箱程序上的PDA

    await token.setAuthority(
    connection,
    payer,
    tokenMint,
    payer.publicKey,
    token.AuthorityType.MintTokens,
    mintAuth
    )
    }

    最后,在内循环之外,我们将薄荷放入集合中,所以第一个是“Bow”(作为我们的例子)。

    collection[assets[i]] = mints

    最后,在所有的循环之外,我们将整个集合写入文件。对于我们的实现来说,这个集合只有五个项目。

    fs.writeFileSync("tokens/gear/cache.json", JSON.stringify(collection))

    这只是一种方法,它是一个相当简单的解决方案。如果你还没有编写代码,并且你看了这个视频,请尝试自己完成,然后再回来使用解决方案代码(如果需要的话)。这个过程不仅是对代码逻辑的理解和实践,也是一次关于如何将链下数据与链上数据结合的经验学习。

    - +
    Skip to main content

    ⚙ 创建齿轮代币

    让我们一起探讨一种可能的齿轮代币解决方案。

    我们即将深入探讨的解决方案代码位于Buildoors前端代码库solution-simple-gear分支上。如果你还没有尝试自己构建,请尽量避免直接从解决方案代码中复制粘贴。

    我们将会浏览两个不同的代码库。如果你还记得,我们在客户端项目中创建了BLD代币和NFT。幸运的是,我们在那里完成了这项工作,如果我们愿意,我们还可以将其转移到程序项目中。

    你可以在/tokens/gear/assets文件夹中找到齿轮的图像。我们选择将其制作为可替代资产,或带有关联元数据和0位小数的SPL代币,而不是NFT,这样它们就不仅限于一个单位。

    /tokens/gear/index.ts中的脚本负责生成与这些资产相关的货币,并将其存储在同一文件夹中的cache.json文件中。

    在脚本的内部部分,向下滚动你会看到我们的主要函数。

    async function main() {
    const connection = new web3.Connection(web3.clusterApiUrl("devnet"))
    const payer = await initializeKeypair(connection)

    await createGear(
    connection,
    payer,
    new web3.PublicKey("6GE3ki2igpw2ZTAt6BV4pTjF5qvtCbFVQP7SGPJaEuoa"),
    ["Bow", "Glasses", "Hat", "Keyboard", "Mustache"]
    )
    }

    我们传入的公钥是为了我们的程序,以及铸币厂的名称列表,这些名称需要与资产文件夹中的内容相匹配。

    如果你在函数中向上滚动,你会看到它首先用一个空对象开始,其中将放置薄荷糖。

    let collection: any = {}

    然后我们创建了我们的metaplex对象,接着是一个循环,该循环为每个铸币执行脚本的功能。

    它从一个空的薄荷数组开始,这样我们就可以为每个资产添加多个薄荷。

    let mints: Array<string> = []

    接下来我们获取图像缓冲区并将其上传到`Arweave,进行持久化存储。

    const imageBuffer = fs.readFileSync(`tokens/gear/assets/${assets[i]}.png`)
    const file = toMetaplexFile(imageBuffer, `${assets[i]}.png`)
    const imageUri = await metaplex.storage().upload(file)

    在那之后,如果你想要不同的经验等级,我们就循环执行相应的次数,针对这个装备。在我们的示例中,只执行一次,因为经验等级从10开始并结束于10。如果你想要每个等级的五个装备,只需将上限增加到50,即xp <= 50

    for (let xp = 10; xp <= 10; xp += 10)...

    一旦进入循环,我们获取了将在后续分配的Mint Auth,即我们想要进行铸币的程序中的PDA - 用于战利品箱程序的PDA

    const [mintAuth] = await web3.PublicKey.findProgramAddress(
    [Buffer.from("mint")],
    programId
    )

    随后,我们创建了一个全新的代币,并将其小数位设置为0,因为它是一种不可分割的资产。

    const tokenMint = await token.createMint(
    connection,
    payer,
    payer.publicKey,
    payer.publicKey,
    0
    )

    一旦创建了该薄荷,我们将其推入薄荷数组中。

    mints.push(tokenMint.toBase58())

    接下来,我们会上传我们的链下元数据,其中包括名称、描述、图像链接和两个属性。

    const { uri } = await metaplex
    .nfts()
    .uploadMetadata({
    name: assets[i],
    description: "这是用来提升你的buildoor的装备",
    image: imageUri,
    attributes: [
    {
    trait_type: "xp",
    value: `${xp}`,
    },
    ],
    })
    .run()

    然后我们获取该薄荷的元数据PDA

    const metadataPda = await findMetadataPda(tokenMint)

    接下来,我们创建元数据的链上版本。

    const tokenMetadata = {
    name: assets[i],
    symbol: "BLDRGEAR",
    uri: uri,
    sellerFeeBasisPoints: 0,
    creators: null,
    collection: null,
    uses: null,
    } as DataV2

    按照之前的步骤,继续创建我们的V2指令。

    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]
    )

    现在我们将权限更改为mintAuth,即战利品箱程序上的PDA

    await token.setAuthority(
    connection,
    payer,
    tokenMint,
    payer.publicKey,
    token.AuthorityType.MintTokens,
    mintAuth
    )
    }

    最后,在内循环之外,我们将薄荷放入集合中,所以第一个是“Bow”(作为我们的例子)。

    collection[assets[i]] = mints

    最后,在所有的循环之外,我们将整个集合写入文件。对于我们的实现来说,这个集合只有五个项目。

    fs.writeFileSync("tokens/gear/cache.json", JSON.stringify(collection))

    这只是一种方法,它是一个相当简单的解决方案。如果你还没有编写代码,并且你看了这个视频,请尝试自己完成,然后再回来使用解决方案代码(如果需要的话)。这个过程不仅是对代码逻辑的理解和实践,也是一次关于如何将链下数据与链上数据结合的经验学习。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/ship-week/index.html b/Solana-Co-Learn/module6/ship-week/index.html index cb07d3e2d..9e302ba1d 100644 --- a/Solana-Co-Learn/module6/ship-week/index.html +++ b/Solana-Co-Learn/module6/ship-week/index.html @@ -5,13 +5,13 @@ 挑战周 | All in One Solana - +
    -
    Skip to main content
    - +
    Skip to main content
    + \ No newline at end of file diff --git a/Solana-Co-Learn/module6/ship-week/intro-to-ship-week/index.html b/Solana-Co-Learn/module6/ship-week/intro-to-ship-week/index.html index 6c03170eb..653063322 100644 --- a/Solana-Co-Learn/module6/ship-week/intro-to-ship-week/index.html +++ b/Solana-Co-Learn/module6/ship-week/intro-to-ship-week/index.html @@ -5,13 +5,13 @@ 🚢挑战周介绍 | All in One Solana - +
    -
    Skip to main content

    🚢挑战周介绍

    既然你已经让程序正常运转了,那么我们就来调整前端代码,以适应Anchor。这个配置只需一分钟,稍作等待,我们会调整一些内容。欢迎来到你的Solana Core的最后一周!这一周与之前的五周有所不同。我们唯一的焦点是确保我们的项目在核心课程结束时做好发布准备。

    结构方面,不再有正规的课程安排,而是给你一系列任务让你自行完成。今天的任务是构建一个战利品箱解决方案。我们会从简单的部分开始。下一节将有详细的书面说明,还会有一些提示告诉你应该怎么做。发挥你的创造力,根据项目的需要选择最合适的方案。

    我们还将发布解决方案的演示视频,但与以往的视频有所不同。过去,我们会与你一起编码,但本周我们只会解释代码解决方案,这样你就可以更多地自己动手。请记住,我们的解决方案只是众多可能选择中的一个,你完全可以自由发挥,构建你心仪的内容。

    我们已经讲解了很多内容,你现在已经做好了准备,可以独立完成这项工作。如果需要,你可以按照步骤一步一步来操作,或者如果你愿意,你也可以尝试其它方法来使代码正常运作。

    - +
    Skip to main content

    🚢挑战周介绍

    既然你已经让程序正常运转了,那么我们就来调整前端代码,以适应Anchor。这个配置只需一分钟,稍作等待,我们会调整一些内容。欢迎来到你的Solana Core的最后一周!这一周与之前的五周有所不同。我们唯一的焦点是确保我们的项目在核心课程结束时做好发布准备。

    结构方面,不再有正规的课程安排,而是给你一系列任务让你自行完成。今天的任务是构建一个战利品箱解决方案。我们会从简单的部分开始。下一节将有详细的书面说明,还会有一些提示告诉你应该怎么做。发挥你的创造力,根据项目的需要选择最合适的方案。

    我们还将发布解决方案的演示视频,但与以往的视频有所不同。过去,我们会与你一起编码,但本周我们只会解释代码解决方案,这样你就可以更多地自己动手。请记住,我们的解决方案只是众多可能选择中的一个,你完全可以自由发挥,构建你心仪的内容。

    我们已经讲解了很多内容,你现在已经做好了准备,可以独立完成这项工作。如果需要,你可以按照步骤一步一步来操作,或者如果你愿意,你也可以尝试其它方法来使代码正常运作。

    + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/anchor-program-hello/index.html b/Solana-Co-Learn/tags/anchor-program-hello/index.html index 686f45761..5d11c65a5 100644 --- a/Solana-Co-Learn/tags/anchor-program-hello/index.html +++ b/Solana-Co-Learn/tags/anchor-program-hello/index.html @@ -5,13 +5,13 @@ One doc tagged with "anchor-program-hello" | All in One Solana - +
    Skip to main content

    One doc tagged with "anchor-program-hello"

    View All Tags
    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/backpack/index.html b/Solana-Co-Learn/tags/backpack/index.html index 8ec1bf68f..76b855f54 100644 --- a/Solana-Co-Learn/tags/backpack/index.html +++ b/Solana-Co-Learn/tags/backpack/index.html @@ -5,13 +5,13 @@ One doc tagged with "backpack" | All in One Solana - +
    Skip to main content

    One doc tagged with "backpack"

    View All Tags

    Solana钱包使用 - Backpack 🎒

    Solana的钱包种类繁多,如众所周知的Phantom钱包。然而,在此我并不推荐使用Phantom,因为对于开发者来说,它并不够友好。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/basic/index.html b/Solana-Co-Learn/tags/basic/index.html index 9b7f671a4..156a7b798 100644 --- a/Solana-Co-Learn/tags/basic/index.html +++ b/Solana-Co-Learn/tags/basic/index.html @@ -5,13 +5,13 @@ One doc tagged with "basic" | All in One Solana - +
    Skip to main content

    One doc tagged with "basic"

    View All Tags
    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/blockchain/index.html b/Solana-Co-Learn/tags/blockchain/index.html index 7acd249fb..d58d96b09 100644 --- a/Solana-Co-Learn/tags/blockchain/index.html +++ b/Solana-Co-Learn/tags/blockchain/index.html @@ -5,13 +5,13 @@ One doc tagged with "blockchain" | All in One Solana - +
    Skip to main content

    One doc tagged with "blockchain"

    View All Tags
    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/candy-machine/index.html b/Solana-Co-Learn/tags/candy-machine/index.html index 8299af419..4e211f41b 100644 --- a/Solana-Co-Learn/tags/candy-machine/index.html +++ b/Solana-Co-Learn/tags/candy-machine/index.html @@ -5,13 +5,13 @@ 2 docs tagged with "candy-machine" | All in One Solana - +
    Skip to main content

    2 docs tagged with "candy-machine"

    View All Tags

    🍬 创建糖果机

    现在我们已经铸造了一个NFT,接下来我们要学习如何铸造一系列NFT。我们将使用Candy Machine来完成这个任务。Candy Machine是一个Solana程序,它可以让创作者将他们的艺术品和资产上链。虽然还有其他方式可以创建NFT系列,但Candy Machine在Solana上已成为一项标准,因为它具备许多实用功能,如防机器人保护和安全随机化。准备好添加一些内容到我们上一课创建但未使用的文件夹中了吗?

    🍭 糖果机和Sugar CLI

    将自己的脸做成NFT有何不好呢?你可以永久地将自己视为一个早期的建设者,并告诉你的妈妈你已经进入了区块链世界。既然我们已经铸造了一个单独的NFT,现在我们将学习如何铸造一系列的NFT。为了实现这一目标,我们将使用Candy Machine——这是一个Solana程序,让创作者能够将他们的资产上链。尽管这不是创建系列的唯一方法,但在Solana上它已经成为一种标准,因为它拥有一些有用的功能,如防机器人保护和安全随机化。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/candy/index.html b/Solana-Co-Learn/tags/candy/index.html index 2493eed1d..d89e5ddbf 100644 --- a/Solana-Co-Learn/tags/candy/index.html +++ b/Solana-Co-Learn/tags/candy/index.html @@ -5,13 +5,13 @@ One doc tagged with "candy" | All in One Solana - +
    Skip to main content

    One doc tagged with "candy"

    View All Tags

    🖼 从糖果机展示NFTs

    现在我们已经铸造了一个NFT,接下来我们将学习如何铸造一系列的NFT。为此,我们将利用Candy Machine来实现——这是Solana的一个程序,使创作者能够将他们的资产上链。虽然这并非创建系列的唯一方式,但在Solana上它却成了标准,因为它具备了许多有用的功能,例如机器人保护和安全随机化。你是否感受到过看到闪亮的新iPhone时的那股兴奋感?稀有的NFT有点儿类似于此。对于优秀的艺术家而言,仅仅是观看这些NFT也极富乐趣。毕竟,艺术的本质就是用来欣赏的!接下来,我们将探讨如果我们只有Candy Machine的地址,应该如何展示NFTs。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/client-side-development/index.html b/Solana-Co-Learn/tags/client-side-development/index.html index 6c21110fa..8b792e891 100644 --- a/Solana-Co-Learn/tags/client-side-development/index.html +++ b/Solana-Co-Learn/tags/client-side-development/index.html @@ -5,13 +5,13 @@ 3 docs tagged with "client-side-development" | All in One Solana - +
    Skip to main content

    3 docs tagged with "client-side-development"

    View All Tags

    ✍将数据写入区块链

    我们已经熟练掌握了区块链的阅读操作,现在开始学习如何将数据写入Solana区块链。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/custom-instruction/index.html b/Solana-Co-Learn/tags/custom-instruction/index.html index 7b4a7d5b1..06cebc6d9 100644 --- a/Solana-Co-Learn/tags/custom-instruction/index.html +++ b/Solana-Co-Learn/tags/custom-instruction/index.html @@ -5,13 +5,13 @@ 3 docs tagged with "custom-instruction" | All in One Solana - +
    Skip to main content

    3 docs tagged with "custom-instruction"

    View All Tags

    🎥 构建一个电影评论应用

    现在我们已经完成了钱包连接的设置,是时候让我们的ping按钮发挥作用了!我们将整合所有元素,构建一个基于区块链的电影评论应用——它将允许任何人提交对他们最喜欢的电影的评论,有点像烂番茄网站那样。

    📡 Run is back - 反序列化

    现在我们已经完成了钱包连接的设置,是时候让我们的 ping 按钮真正起作用了!向网络账户写入数据只是任务的一半,另一半则是读取这些数据。在第一部分,我们借助Web3.js库中的内置函数来读取内容,这只适用于基础数据,如余额和交易详情。但正如我们在上一部分所见,所有精彩的东西都藏在 PDAs 里。

    🤔 自定义指令

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

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/deploy/index.html b/Solana-Co-Learn/tags/deploy/index.html index 289004fd9..63cf7133f 100644 --- a/Solana-Co-Learn/tags/deploy/index.html +++ b/Solana-Co-Learn/tags/deploy/index.html @@ -5,13 +5,13 @@ One doc tagged with "deploy" | All in One Solana - +
    Skip to main content

    One doc tagged with "deploy"

    View All Tags

    🌐 部署到 Vercel

    这一步是你本周工作中至关重要的一环,即将你的项目从本地环境部署到线上环境。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/displayings-nfts/index.html b/Solana-Co-Learn/tags/displayings-nfts/index.html index 971bd90a9..b27ecc0d5 100644 --- a/Solana-Co-Learn/tags/displayings-nfts/index.html +++ b/Solana-Co-Learn/tags/displayings-nfts/index.html @@ -5,13 +5,13 @@ 6 docs tagged with "displayings-nfts" | All in One Solana - +
    Skip to main content

    6 docs tagged with "displayings-nfts"

    View All Tags

    🍬 创建糖果机

    现在我们已经铸造了一个NFT,接下来我们要学习如何铸造一系列NFT。我们将使用Candy Machine来完成这个任务。Candy Machine是一个Solana程序,它可以让创作者将他们的艺术品和资产上链。虽然还有其他方式可以创建NFT系列,但Candy Machine在Solana上已成为一项标准,因为它具备许多实用功能,如防机器人保护和安全随机化。准备好添加一些内容到我们上一课创建但未使用的文件夹中了吗?

    🎨 创建奖励代币

    既然我们已经铸造了一个NFT,那么接下来我们要探讨如何铸造一系列的NFT。为了达成这个目标,我们将采用Candy Machine——一款在Solana上广泛使用的程序,允许创作者将其资产上链。Candy Machine在Solana上受到欢迎的原因在于,它具备了如机器人防护和安全随机化等实用功能。现在我们可以回归到我们自定义的NFT质押应用上来,借助我们在代币程序和Candy Machine上的经验来构建这个应用。

    🎨 创建铸币用户界面

    现在我们成功创建了代币和非同质化代币(NFT),让我们继续着手构建我们的铸币用户界面。这样一来,我们就能直观地与智能合约互动,并允许他人在我们的浏览器上铸造我们的NFT。是不是非常酷?你可能已经注意到,你的网站上现有一个名为 minting 的按钮,但它目前尚未实现任何功能。让我们从定义一个函数开始,然后添加逻辑来允许我们铸造NFT。如果你没有起始代码,可以在这里克隆。

    💃 展示NFTs

    既然我们已经铸造了一个NFT,现在我们将进一步探讨如何铸造一整套NFT。我们将借助Candy Machine来实现这个任务——这是一个Solana程序,可以让创作者轻松地将他们的资产上链。当然,这并不是在Solana上创建系列的唯一方法,但它确实成为了标准,因为它具备了许多实用功能,例如防机器人保护和安全随机化。毕竟,如果你不能向人们展示你的NFT,那它还有什么价值呢!在这一节,我们将引导你展示你的作品——首先在钱包中展示,然后在Candy Machine中展示。

    📱 在钱包中展示NFTs

    现在我们已经铸造了一个NFT,接下来我们要探索如何铸造一系列的NFT。我们将使用Candy Machine来完成这项任务,这是一款Solana程序,能让创作者方便地将他们的资产上链。虽然这不是创建系列的唯一方式,但在Solana上它已经成为标准,因为它具有诸如防机器人保护和安全随机化等有用的功能。你懂的,模板时间到了。然而,随着我们构建的项目越来越复杂,我们的模板也会变得更先进。这次我们将基于Solana dApp脚手架构建一个模板。与之前的模板一样,它是一个由create-next-app创建的Next.js应用程序。不过这次,它具有更多功能。不用担心!我们依然会使用相同的工具。

    🖼 从糖果机展示NFTs

    现在我们已经铸造了一个NFT,接下来我们将学习如何铸造一系列的NFT。为此,我们将利用Candy Machine来实现——这是Solana的一个程序,使创作者能够将他们的资产上链。虽然这并非创建系列的唯一方式,但在Solana上它却成了标准,因为它具备了许多有用的功能,例如机器人保护和安全随机化。你是否感受到过看到闪亮的新iPhone时的那股兴奋感?稀有的NFT有点儿类似于此。对于优秀的艺术家而言,仅仅是观看这些NFT也极富乐趣。毕竟,艺术的本质就是用来欣赏的!接下来,我们将探讨如果我们只有Candy Machine的地址,应该如何展示NFTs。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/error-handle-and-data-validation/index.html b/Solana-Co-Learn/tags/error-handle-and-data-validation/index.html index 0a1034c85..e594c1aaf 100644 --- a/Solana-Co-Learn/tags/error-handle-and-data-validation/index.html +++ b/Solana-Co-Learn/tags/error-handle-and-data-validation/index.html @@ -5,13 +5,13 @@ One doc tagged with "error-handle-and-data-validation" | All in One Solana - +
    Skip to main content

    One doc tagged with "error-handle-and-data-validation"

    View All Tags

    ❗ 错误处理和数据验证

    本节课将为你介绍一些程序安全方面的基本注意事项。虽然这并非全面的概述,但它能让你像攻击者那样思考,思索重要的问题:我如何破解这个程序?

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/frontend/index.html b/Solana-Co-Learn/tags/frontend/index.html index 9c3d246e7..0a08e4054 100644 --- a/Solana-Co-Learn/tags/frontend/index.html +++ b/Solana-Co-Learn/tags/frontend/index.html @@ -5,13 +5,13 @@ 2 docs tagged with "frontend" | All in One Solana - +
    Skip to main content

    2 docs tagged with "frontend"

    View All Tags

    🎨 创建铸币用户界面

    现在我们成功创建了代币和非同质化代币(NFT),让我们继续着手构建我们的铸币用户界面。这样一来,我们就能直观地与智能合约互动,并允许他人在我们的浏览器上铸造我们的NFT。是不是非常酷?你可能已经注意到,你的网站上现有一个名为 minting 的按钮,但它目前尚未实现任何功能。让我们从定义一个函数开始,然后添加逻辑来允许我们铸造NFT。如果你没有起始代码,可以在这里克隆。

    💻 构建 NFT 铸造者前端

    欢迎来到第一周的挑战环节。每周,你都会有一个特定的部分,用来将你所学的内容应用到自定义的NFT质押应用程序上,并且还有战利品箱子等你拿!

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/how-staking-works/index.html b/Solana-Co-Learn/tags/how-staking-works/index.html index 531b083d1..f8f63659c 100644 --- a/Solana-Co-Learn/tags/how-staking-works/index.html +++ b/Solana-Co-Learn/tags/how-staking-works/index.html @@ -5,13 +5,13 @@ One doc tagged with "how-staking-works" | All in One Solana - +
    Skip to main content

    One doc tagged with "how-staking-works"

    View All Tags

    🕒 质押工作机制详解

    恭喜你已经接近第三周的完成了!现在让我们将你学到的所有知识运用到你正在进行的NFT项目(buildoors项目)的相关质押计划中。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/index.html b/Solana-Co-Learn/tags/index.html index caf0efdd9..8fa5b5748 100644 --- a/Solana-Co-Learn/tags/index.html +++ b/Solana-Co-Learn/tags/index.html @@ -5,13 +5,13 @@ Tags | All in One Solana - +
    Skip to main content
    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/intro-rust/index.html b/Solana-Co-Learn/tags/intro-rust/index.html index b1b7f58b4..32103034d 100644 --- a/Solana-Co-Learn/tags/intro-rust/index.html +++ b/Solana-Co-Learn/tags/intro-rust/index.html @@ -5,13 +5,13 @@ 3 docs tagged with "intro-rust" | All in One Solana - +
    Skip to main content

    3 docs tagged with "intro-rust"

    View All Tags

    ✨ 魔法互联网计算机

    我们将在游乐场中编写一个简单的Hello World程序。它仅会在交易日志中记录一条消息。至今为止,我们已经完成了许多酷炫的项目,包括建立各种类型的客户端,创建NFT收藏品,铸造SPL代币,甚至构建用户界面让其他人与之互动。然而,我们迄今为止所做的一切都是基于现有的程序。

    👋 与你部署的程序互动

    我们将在Solana的游乐场上创建一个简单的Hello World程序。它只会在交易日志中记录一条消息。现在我们的程序已经部署完成了,是时候与之互动了。别忘了,在之前的阶段,你已经多次实现过这个过程!你可以像之前一样通过create-solana-client设置本地客户端,或者直接使用Solana的游乐场。

    📝 你好,世界

    我们将在游乐场上制作一个简单的Hello World程序,这个程序只会在交易日志中记录一条消息,相当有趣。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/local-development/index.html b/Solana-Co-Learn/tags/local-development/index.html index 551638b72..daac57bb6 100644 --- a/Solana-Co-Learn/tags/local-development/index.html +++ b/Solana-Co-Learn/tags/local-development/index.html @@ -5,13 +5,13 @@ One doc tagged with "local-development" | All in One Solana - +
    Skip to main content

    One doc tagged with "local-development"

    View All Tags
    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/metaplex/index.html b/Solana-Co-Learn/tags/metaplex/index.html index 8ae649649..3339019c9 100644 --- a/Solana-Co-Learn/tags/metaplex/index.html +++ b/Solana-Co-Learn/tags/metaplex/index.html @@ -5,13 +5,13 @@ 7 docs tagged with "metaplex" | All in One Solana - +
    Skip to main content

    7 docs tagged with "metaplex"

    View All Tags

    🍬 创建糖果机

    现在我们已经铸造了一个NFT,接下来我们要学习如何铸造一系列NFT。我们将使用Candy Machine来完成这个任务。Candy Machine是一个Solana程序,它可以让创作者将他们的艺术品和资产上链。虽然还有其他方式可以创建NFT系列,但Candy Machine在Solana上已成为一项标准,因为它具备许多实用功能,如防机器人保护和安全随机化。准备好添加一些内容到我们上一课创建但未使用的文件夹中了吗?

    🍭 糖果机和Sugar CLI

    将自己的脸做成NFT有何不好呢?你可以永久地将自己视为一个早期的建设者,并告诉你的妈妈你已经进入了区块链世界。既然我们已经铸造了一个单独的NFT,现在我们将学习如何铸造一系列的NFT。为了实现这一目标,我们将使用Candy Machine——这是一个Solana程序,让创作者能够将他们的资产上链。尽管这不是创建系列的唯一方法,但在Solana上它已经成为一种标准,因为它拥有一些有用的功能,如防机器人保护和安全随机化。

    🎨 创建奖励代币

    既然我们已经铸造了一个NFT,那么接下来我们要探讨如何铸造一系列的NFT。为了达成这个目标,我们将采用Candy Machine——一款在Solana上广泛使用的程序,允许创作者将其资产上链。Candy Machine在Solana上受到欢迎的原因在于,它具备了如机器人防护和安全随机化等实用功能。现在我们可以回归到我们自定义的NFT质押应用上来,借助我们在代币程序和Candy Machine上的经验来构建这个应用。

    🎨 创建铸币用户界面

    现在我们成功创建了代币和非同质化代币(NFT),让我们继续着手构建我们的铸币用户界面。这样一来,我们就能直观地与智能合约互动,并允许他人在我们的浏览器上铸造我们的NFT。是不是非常酷?你可能已经注意到,你的网站上现有一个名为 minting 的按钮,但它目前尚未实现任何功能。让我们从定义一个函数开始,然后添加逻辑来允许我们铸造NFT。如果你没有起始代码,可以在这里克隆。

    💃 展示NFTs

    既然我们已经铸造了一个NFT,现在我们将进一步探讨如何铸造一整套NFT。我们将借助Candy Machine来实现这个任务——这是一个Solana程序,可以让创作者轻松地将他们的资产上链。当然,这并不是在Solana上创建系列的唯一方法,但它确实成为了标准,因为它具备了许多实用功能,例如防机器人保护和安全随机化。毕竟,如果你不能向人们展示你的NFT,那它还有什么价值呢!在这一节,我们将引导你展示你的作品——首先在钱包中展示,然后在Candy Machine中展示。

    📱 在钱包中展示NFTs

    现在我们已经铸造了一个NFT,接下来我们要探索如何铸造一系列的NFT。我们将使用Candy Machine来完成这项任务,这是一款Solana程序,能让创作者方便地将他们的资产上链。虽然这不是创建系列的唯一方式,但在Solana上它已经成为标准,因为它具有诸如防机器人保护和安全随机化等有用的功能。你懂的,模板时间到了。然而,随着我们构建的项目越来越复杂,我们的模板也会变得更先进。这次我们将基于Solana dApp脚手架构建一个模板。与之前的模板一样,它是一个由create-next-app创建的Next.js应用程序。不过这次,它具有更多功能。不用担心!我们依然会使用相同的工具。

    🖼 从糖果机展示NFTs

    现在我们已经铸造了一个NFT,接下来我们将学习如何铸造一系列的NFT。为此,我们将利用Candy Machine来实现——这是Solana的一个程序,使创作者能够将他们的资产上链。虽然这并非创建系列的唯一方式,但在Solana上它却成了标准,因为它具备了许多有用的功能,例如机器人保护和安全随机化。你是否感受到过看到闪亮的新iPhone时的那股兴奋感?稀有的NFT有点儿类似于此。对于优秀的艺术家而言,仅仅是观看这些NFT也极富乐趣。毕竟,艺术的本质就是用来欣赏的!接下来,我们将探讨如果我们只有Candy Machine的地址,应该如何展示NFTs。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/mint-spl-token/index.html b/Solana-Co-Learn/tags/mint-spl-token/index.html index a0eaf8604..d6a2e60ac 100644 --- a/Solana-Co-Learn/tags/mint-spl-token/index.html +++ b/Solana-Co-Learn/tags/mint-spl-token/index.html @@ -5,13 +5,13 @@ One doc tagged with "mint-spl-token" | All in One Solana - +
    Skip to main content

    One doc tagged with "mint-spl-token"

    View All Tags

    🏧 在Solana上铸造代币

    话不多说,让我们来创造一些神奇的互联网货币吧。在我们的最终项目中,我们将创建一个代币,你将随着抵押你的社区NFT而逐渐获得它。在那之前,让我们先玩一下这个铸币过程的实际构建部分。现在是激发你的想象力,尽情享受的好时机。也许你一直想创建自己的模因币——现在是你的机会了 🚀。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/native-program-hello/index.html b/Solana-Co-Learn/tags/native-program-hello/index.html index 60476edf5..f1d86e7d2 100644 --- a/Solana-Co-Learn/tags/native-program-hello/index.html +++ b/Solana-Co-Learn/tags/native-program-hello/index.html @@ -5,13 +5,13 @@ One doc tagged with "native-program-hello" | All in One Solana - +
    Skip to main content

    One doc tagged with "native-program-hello"

    View All Tags
    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/native-solana-development/index.html b/Solana-Co-Learn/tags/native-solana-development/index.html index 5bba1caa8..c3cd79d6e 100644 --- a/Solana-Co-Learn/tags/native-solana-development/index.html +++ b/Solana-Co-Learn/tags/native-solana-development/index.html @@ -5,13 +5,13 @@ 3 docs tagged with "native-solana-development" | All in One Solana - +
    Skip to main content

    3 docs tagged with "native-solana-development"

    View All Tags

    🎂 Rust的分层蛋糕

    我们将在游乐场上制作一个简单的Hello World程序,仅仅会在交易日志中记录一条消息。招呼已经打过了。现在是时候学习如何处理指令数据,就像在客户端开发中一样。

    🎥 构建一个电影评论程序

    还记得我们在第一节中互动开发的电影评论节目吗?现在我们要继续深入开发它。当然,你可以随意评论任何内容,不仅限于电影,毕竟我并不是你的长辈,你自由发挥就好。

    🤠 状态管理

    你还记得我们在第一节中互动的电影评论程序吗?现在我们要在这里构建它。你想评论的不一定只是电影,我可不会限制你。状态是指存储在链上的程序数据。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/native-solana-program/index.html b/Solana-Co-Learn/tags/native-solana-program/index.html index 9f5bf1fa8..bed2e26cc 100644 --- a/Solana-Co-Learn/tags/native-solana-program/index.html +++ b/Solana-Co-Learn/tags/native-solana-program/index.html @@ -5,13 +5,13 @@ 7 docs tagged with "native-solana-program" | All in One Solana - +
    Skip to main content

    7 docs tagged with "native-solana-program"

    View All Tags

    ❗ 错误处理和数据验证

    本节课将为你介绍一些程序安全方面的基本注意事项。虽然这并非全面的概述,但它能让你像攻击者那样思考,思索重要的问题:我如何破解这个程序?

    🎂 Rust的分层蛋糕

    我们将在游乐场上制作一个简单的Hello World程序,仅仅会在交易日志中记录一条消息。招呼已经打过了。现在是时候学习如何处理指令数据,就像在客户端开发中一样。

    🎥 构建一个电影评论程序

    还记得我们在第一节中互动开发的电影评论节目吗?现在我们要继续深入开发它。当然,你可以随意评论任何内容,不仅限于电影,毕竟我并不是你的长辈,你自由发挥就好。

    🔑 保障我们程序的安全

    是时候保障我们的Solana电影数据库程序不受到干扰了。我们将加入一些基础的安全防护,进行输入验证,并增添一个 updatemoviereview 指令。

    🕒 质押工作机制详解

    恭喜你已经接近第三周的完成了!现在让我们将你学到的所有知识运用到你正在进行的NFT项目(buildoors项目)的相关质押计划中。

    🤠 状态管理

    你还记得我们在第一节中互动的电影评论程序吗?现在我们要在这里构建它。你想评论的不一定只是电影,我可不会限制你。状态是指存储在链上的程序数据。

    🛠️ 构建NFT质押程序

    今天,我们将编写质押程序,并实现所有必要的质押功能,暂时不涉及任何代币转账。我将陪伴你,一步一步讲解整个过程,解释每个环节,以便你了解正在进行的操作。首先,让我们进入Solana Playground,点击create a new project,并创建一个名为src的新文件夹,其中包括一个名为lib.rs的文件。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/nft-staking/index.html b/Solana-Co-Learn/tags/nft-staking/index.html index 3985b0857..5f6a9d269 100644 --- a/Solana-Co-Learn/tags/nft-staking/index.html +++ b/Solana-Co-Learn/tags/nft-staking/index.html @@ -5,13 +5,13 @@ 2 docs tagged with "nft-staking" | All in One Solana - +
    Skip to main content

    2 docs tagged with "nft-staking"

    View All Tags

    🕒 质押工作机制详解

    恭喜你已经接近第三周的完成了!现在让我们将你学到的所有知识运用到你正在进行的NFT项目(buildoors项目)的相关质押计划中。

    🛠️ 构建NFT质押程序

    今天,我们将编写质押程序,并实现所有必要的质押功能,暂时不涉及任何代币转账。我将陪伴你,一步一步讲解整个过程,解释每个环节,以便你了解正在进行的操作。首先,让我们进入Solana Playground,点击create a new project,并创建一个名为src的新文件夹,其中包括一个名为lib.rs的文件。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/nft/index.html b/Solana-Co-Learn/tags/nft/index.html index b41e5e6cc..19e0b6a16 100644 --- a/Solana-Co-Learn/tags/nft/index.html +++ b/Solana-Co-Learn/tags/nft/index.html @@ -5,13 +5,13 @@ 9 docs tagged with "nft" | All in One Solana - +
    Skip to main content

    9 docs tagged with "nft"

    View All Tags

    🍬 创建糖果机

    现在我们已经铸造了一个NFT,接下来我们要学习如何铸造一系列NFT。我们将使用Candy Machine来完成这个任务。Candy Machine是一个Solana程序,它可以让创作者将他们的艺术品和资产上链。虽然还有其他方式可以创建NFT系列,但Candy Machine在Solana上已成为一项标准,因为它具备许多实用功能,如防机器人保护和安全随机化。准备好添加一些内容到我们上一课创建但未使用的文件夹中了吗?

    🍭 糖果机和Sugar CLI

    将自己的脸做成NFT有何不好呢?你可以永久地将自己视为一个早期的建设者,并告诉你的妈妈你已经进入了区块链世界。既然我们已经铸造了一个单独的NFT,现在我们将学习如何铸造一系列的NFT。为了实现这一目标,我们将使用Candy Machine——这是一个Solana程序,让创作者能够将他们的资产上链。尽管这不是创建系列的唯一方法,但在Solana上它已经成为一种标准,因为它拥有一些有用的功能,如防机器人保护和安全随机化。

    🎨 Solana上的NFT

    我们来了,不过花了不了多长时间。猴子画像、猩猩、岩石,以及其他一些看起来丑陋却能卖到10万美元的动物主题头像。这就是NFT。

    🎨 创建奖励代币

    既然我们已经铸造了一个NFT,那么接下来我们要探讨如何铸造一系列的NFT。为了达成这个目标,我们将采用Candy Machine——一款在Solana上广泛使用的程序,允许创作者将其资产上链。Candy Machine在Solana上受到欢迎的原因在于,它具备了如机器人防护和安全随机化等实用功能。现在我们可以回归到我们自定义的NFT质押应用上来,借助我们在代币程序和Candy Machine上的经验来构建这个应用。

    🎨 创建铸币用户界面

    现在我们成功创建了代币和非同质化代币(NFT),让我们继续着手构建我们的铸币用户界面。这样一来,我们就能直观地与智能合约互动,并允许他人在我们的浏览器上铸造我们的NFT。是不是非常酷?你可能已经注意到,你的网站上现有一个名为 minting 的按钮,但它目前尚未实现任何功能。让我们从定义一个函数开始,然后添加逻辑来允许我们铸造NFT。如果你没有起始代码,可以在这里克隆。

    💃 展示NFTs

    既然我们已经铸造了一个NFT,现在我们将进一步探讨如何铸造一整套NFT。我们将借助Candy Machine来实现这个任务——这是一个Solana程序,可以让创作者轻松地将他们的资产上链。当然,这并不是在Solana上创建系列的唯一方法,但它确实成为了标准,因为它具备了许多实用功能,例如防机器人保护和安全随机化。毕竟,如果你不能向人们展示你的NFT,那它还有什么价值呢!在这一节,我们将引导你展示你的作品——首先在钱包中展示,然后在Candy Machine中展示。

    📱 在钱包中展示NFTs

    现在我们已经铸造了一个NFT,接下来我们要探索如何铸造一系列的NFT。我们将使用Candy Machine来完成这项任务,这是一款Solana程序,能让创作者方便地将他们的资产上链。虽然这不是创建系列的唯一方式,但在Solana上它已经成为标准,因为它具有诸如防机器人保护和安全随机化等有用的功能。你懂的,模板时间到了。然而,随着我们构建的项目越来越复杂,我们的模板也会变得更先进。这次我们将基于Solana dApp脚手架构建一个模板。与之前的模板一样,它是一个由create-next-app创建的Next.js应用程序。不过这次,它具有更多功能。不用担心!我们依然会使用相同的工具。

    🖼 从糖果机展示NFTs

    现在我们已经铸造了一个NFT,接下来我们将学习如何铸造一系列的NFT。为此,我们将利用Candy Machine来实现——这是Solana的一个程序,使创作者能够将他们的资产上链。虽然这并非创建系列的唯一方式,但在Solana上它却成了标准,因为它具备了许多有用的功能,例如机器人保护和安全随机化。你是否感受到过看到闪亮的新iPhone时的那股兴奋感?稀有的NFT有点儿类似于此。对于优秀的艺术家而言,仅仅是观看这些NFT也极富乐趣。毕竟,艺术的本质就是用来欣赏的!接下来,我们将探讨如果我们只有Candy Machine的地址,应该如何展示NFTs。

    🤨 NFT你的脸

    有什么比将你的脸做成NFT更有趣的选择呢?你可以将自己永远铭记为早期的开拓者,并骄傲地告诉你的妈妈你已经成为了区块链的一部分。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/nfts-and-minting-with-metaplex/index.html b/Solana-Co-Learn/tags/nfts-and-minting-with-metaplex/index.html index 8742978d0..b010bea91 100644 --- a/Solana-Co-Learn/tags/nfts-and-minting-with-metaplex/index.html +++ b/Solana-Co-Learn/tags/nfts-and-minting-with-metaplex/index.html @@ -5,13 +5,13 @@ 3 docs tagged with "nfts-and-minting-with-metaplex" | All in One Solana - +
    Skip to main content

    3 docs tagged with "nfts-and-minting-with-metaplex"

    View All Tags

    🍭 糖果机和Sugar CLI

    将自己的脸做成NFT有何不好呢?你可以永久地将自己视为一个早期的建设者,并告诉你的妈妈你已经进入了区块链世界。既然我们已经铸造了一个单独的NFT,现在我们将学习如何铸造一系列的NFT。为了实现这一目标,我们将使用Candy Machine——这是一个Solana程序,让创作者能够将他们的资产上链。尽管这不是创建系列的唯一方法,但在Solana上它已经成为一种标准,因为它拥有一些有用的功能,如防机器人保护和安全随机化。

    🎨 Solana上的NFT

    我们来了,不过花了不了多长时间。猴子画像、猩猩、岩石,以及其他一些看起来丑陋却能卖到10万美元的动物主题头像。这就是NFT。

    🤨 NFT你的脸

    有什么比将你的脸做成NFT更有趣的选择呢?你可以将自己永远铭记为早期的开拓者,并骄傲地告诉你的妈妈你已经成为了区块链的一部分。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/program/index.html b/Solana-Co-Learn/tags/program/index.html index b8398a19f..82708c829 100644 --- a/Solana-Co-Learn/tags/program/index.html +++ b/Solana-Co-Learn/tags/program/index.html @@ -5,13 +5,13 @@ 9 docs tagged with "program" | All in One Solana - +
    Skip to main content

    9 docs tagged with "program"

    View All Tags

    🎂 Rust的分层蛋糕

    我们将在游乐场上制作一个简单的Hello World程序,仅仅会在交易日志中记录一条消息。招呼已经打过了。现在是时候学习如何处理指令数据,就像在客户端开发中一样。

    🎥 构建一个电影评论程序

    还记得我们在第一节中互动开发的电影评论节目吗?现在我们要继续深入开发它。当然,你可以随意评论任何内容,不仅限于电影,毕竟我并不是你的长辈,你自由发挥就好。

    👋 与你部署的程序互动

    我们将在Solana的游乐场上创建一个简单的Hello World程序。它只会在交易日志中记录一条消息。现在我们的程序已经部署完成了,是时候与之互动了。别忘了,在之前的阶段,你已经多次实现过这个过程!你可以像之前一样通过create-solana-client设置本地客户端,或者直接使用Solana的游乐场。

    🤠 状态管理

    你还记得我们在第一节中互动的电影评论程序吗?现在我们要在这里构建它。你想评论的不一定只是电影,我可不会限制你。状态是指存储在链上的程序数据。

    🛠️ 构建NFT质押程序

    今天,我们将编写质押程序,并实现所有必要的质押功能,暂时不涉及任何代币转账。我将陪伴你,一步一步讲解整个过程,解释每个环节,以便你了解正在进行的操作。首先,让我们进入Solana Playground,点击create a new project,并创建一个名为src的新文件夹,其中包括一个名为lib.rs的文件。

    Solang solidity合约实现 - hello, World

    欢迎来到Solana入门指南!Solang是一个Solidity编译器,它允许你使用Solidity编程语言编写Solana程序,其他区块链中称为“智能合约”。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/rpc/index.html b/Solana-Co-Learn/tags/rpc/index.html index 28e63351e..f832fbc33 100644 --- a/Solana-Co-Learn/tags/rpc/index.html +++ b/Solana-Co-Learn/tags/rpc/index.html @@ -5,13 +5,13 @@ 6 docs tagged with "rpc" | All in One Solana - +
    Skip to main content

    6 docs tagged with "rpc"

    View All Tags

    ✍将数据写入区块链

    我们已经熟练掌握了区块链的阅读操作,现在开始学习如何将数据写入Solana区块链。

    🎥 构建一个电影评论应用

    现在我们已经完成了钱包连接的设置,是时候让我们的ping按钮发挥作用了!我们将整合所有元素,构建一个基于区块链的电影评论应用——它将允许任何人提交对他们最喜欢的电影的评论,有点像烂番茄网站那样。

    📡 Run is back - 反序列化

    现在我们已经完成了钱包连接的设置,是时候让我们的 ping 按钮真正起作用了!向网络账户写入数据只是任务的一半,另一半则是读取这些数据。在第一部分,我们借助Web3.js库中的内置函数来读取内容,这只适用于基础数据,如余额和交易详情。但正如我们在上一部分所见,所有精彩的东西都藏在 PDAs 里。

    🤔 自定义指令

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

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/rust-layer-cake/index.html b/Solana-Co-Learn/tags/rust-layer-cake/index.html index 37029d6ee..18125bfe6 100644 --- a/Solana-Co-Learn/tags/rust-layer-cake/index.html +++ b/Solana-Co-Learn/tags/rust-layer-cake/index.html @@ -5,13 +5,13 @@ One doc tagged with "rust-layer-cake" | All in One Solana - +
    Skip to main content

    One doc tagged with "rust-layer-cake"

    View All Tags

    🎂 Rust的分层蛋糕

    我们将在游乐场上制作一个简单的Hello World程序,仅仅会在交易日志中记录一条消息。招呼已经打过了。现在是时候学习如何处理指令数据,就像在客户端开发中一样。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/security-and-validation/index.html b/Solana-Co-Learn/tags/security-and-validation/index.html index f706df31e..dd8148e11 100644 --- a/Solana-Co-Learn/tags/security-and-validation/index.html +++ b/Solana-Co-Learn/tags/security-and-validation/index.html @@ -5,13 +5,13 @@ 2 docs tagged with "security-and-validation" | All in One Solana - +
    Skip to main content

    2 docs tagged with "security-and-validation"

    View All Tags

    ❗ 错误处理和数据验证

    本节课将为你介绍一些程序安全方面的基本注意事项。虽然这并非全面的概述,但它能让你像攻击者那样思考,思索重要的问题:我如何破解这个程序?

    🔑 保障我们程序的安全

    是时候保障我们的Solana电影数据库程序不受到干扰了。我们将加入一些基础的安全防护,进行输入验证,并增添一个 updatemoviereview 指令。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/solana/index.html b/Solana-Co-Learn/tags/solana/index.html index 274e84e87..86331afa8 100644 --- a/Solana-Co-Learn/tags/solana/index.html +++ b/Solana-Co-Learn/tags/solana/index.html @@ -5,13 +5,13 @@ 38 docs tagged with "solana" | All in One Solana - +
    Skip to main content

    38 docs tagged with "solana"

    View All Tags

    ✍将数据写入区块链

    我们已经熟练掌握了区块链的阅读操作,现在开始学习如何将数据写入Solana区块链。

    ✨ 魔法互联网计算机

    我们将在游乐场中编写一个简单的Hello World程序。它仅会在交易日志中记录一条消息。至今为止,我们已经完成了许多酷炫的项目,包括建立各种类型的客户端,创建NFT收藏品,铸造SPL代币,甚至构建用户界面让其他人与之互动。然而,我们迄今为止所做的一切都是基于现有的程序。

    ❗ 错误处理和数据验证

    本节课将为你介绍一些程序安全方面的基本注意事项。虽然这并非全面的概述,但它能让你像攻击者那样思考,思索重要的问题:我如何破解这个程序?

    🌐 部署到 Vercel

    这一步是你本周工作中至关重要的一环,即将你的项目从本地环境部署到线上环境。

    🍬 创建糖果机

    现在我们已经铸造了一个NFT,接下来我们要学习如何铸造一系列NFT。我们将使用Candy Machine来完成这个任务。Candy Machine是一个Solana程序,它可以让创作者将他们的艺术品和资产上链。虽然还有其他方式可以创建NFT系列,但Candy Machine在Solana上已成为一项标准,因为它具备许多实用功能,如防机器人保护和安全随机化。准备好添加一些内容到我们上一课创建但未使用的文件夹中了吗?

    🍭 糖果机和Sugar CLI

    将自己的脸做成NFT有何不好呢?你可以永久地将自己视为一个早期的建设者,并告诉你的妈妈你已经进入了区块链世界。既然我们已经铸造了一个单独的NFT,现在我们将学习如何铸造一系列的NFT。为了实现这一目标,我们将使用Candy Machine——这是一个Solana程序,让创作者能够将他们的资产上链。尽管这不是创建系列的唯一方法,但在Solana上它已经成为一种标准,因为它拥有一些有用的功能,如防机器人保护和安全随机化。

    🎂 Rust的分层蛋糕

    我们将在游乐场上制作一个简单的Hello World程序,仅仅会在交易日志中记录一条消息。招呼已经打过了。现在是时候学习如何处理指令数据,就像在客户端开发中一样。

    🎥 构建一个电影评论应用

    现在我们已经完成了钱包连接的设置,是时候让我们的ping按钮发挥作用了!我们将整合所有元素,构建一个基于区块链的电影评论应用——它将允许任何人提交对他们最喜欢的电影的评论,有点像烂番茄网站那样。

    🎥 构建一个电影评论程序

    还记得我们在第一节中互动开发的电影评论节目吗?现在我们要继续深入开发它。当然,你可以随意评论任何内容,不仅限于电影,毕竟我并不是你的长辈,你自由发挥就好。

    🎨 Solana上的NFT

    我们来了,不过花了不了多长时间。猴子画像、猩猩、岩石,以及其他一些看起来丑陋却能卖到10万美元的动物主题头像。这就是NFT。

    🎨 创建奖励代币

    既然我们已经铸造了一个NFT,那么接下来我们要探讨如何铸造一系列的NFT。为了达成这个目标,我们将采用Candy Machine——一款在Solana上广泛使用的程序,允许创作者将其资产上链。Candy Machine在Solana上受到欢迎的原因在于,它具备了如机器人防护和安全随机化等实用功能。现在我们可以回归到我们自定义的NFT质押应用上来,借助我们在代币程序和Candy Machine上的经验来构建这个应用。

    🎨 创建铸币用户界面

    现在我们成功创建了代币和非同质化代币(NFT),让我们继续着手构建我们的铸币用户界面。这样一来,我们就能直观地与智能合约互动,并允许他人在我们的浏览器上铸造我们的NFT。是不是非常酷?你可能已经注意到,你的网站上现有一个名为 minting 的按钮,但它目前尚未实现任何功能。让我们从定义一个函数开始,然后添加逻辑来允许我们铸造NFT。如果你没有起始代码,可以在这里克隆。

    🏧 在Solana上铸造代币

    话不多说,让我们来创造一些神奇的互联网货币吧。在我们的最终项目中,我们将创建一个代币,你将随着抵押你的社区NFT而逐渐获得它。在那之前,让我们先玩一下这个铸币过程的实际构建部分。现在是激发你的想象力,尽情享受的好时机。也许你一直想创建自己的模因币——现在是你的机会了 🚀。

    👋 与你部署的程序互动

    我们将在Solana的游乐场上创建一个简单的Hello World程序。它只会在交易日志中记录一条消息。现在我们的程序已经部署完成了,是时候与之互动了。别忘了,在之前的阶段,你已经多次实现过这个过程!你可以像之前一样通过create-solana-client设置本地客户端,或者直接使用Solana的游乐场。

    💃 展示NFTs

    既然我们已经铸造了一个NFT,现在我们将进一步探讨如何铸造一整套NFT。我们将借助Candy Machine来实现这个任务——这是一个Solana程序,可以让创作者轻松地将他们的资产上链。当然,这并不是在Solana上创建系列的唯一方法,但它确实成为了标准,因为它具备了许多实用功能,例如防机器人保护和安全随机化。毕竟,如果你不能向人们展示你的NFT,那它还有什么价值呢!在这一节,我们将引导你展示你的作品——首先在钱包中展示,然后在Candy Machine中展示。

    💵 Token Program

    作为区块链最基本的承诺,这些代币也许是你安装钱包的主要原因,它们是区块链上资产最纯粹的表现形式,从合成股票到数百种狗币。

    💻 构建 NFT 铸造者前端

    欢迎来到第一周的挑战环节。每周,你都会有一个特定的部分,用来将你所学的内容应用到自定义的NFT质押应用程序上,并且还有战利品箱子等你拿!

    📝 你好,世界

    我们将在游乐场上制作一个简单的Hello World程序,这个程序只会在交易日志中记录一条消息,相当有趣。

    📡 Run is back - 反序列化

    现在我们已经完成了钱包连接的设置,是时候让我们的 ping 按钮真正起作用了!向网络账户写入数据只是任务的一半,另一半则是读取这些数据。在第一部分,我们借助Web3.js库中的内置函数来读取内容,这只适用于基础数据,如余额和交易详情。但正如我们在上一部分所见,所有精彩的东西都藏在 PDAs 里。

    📱 在钱包中展示NFTs

    现在我们已经铸造了一个NFT,接下来我们要探索如何铸造一系列的NFT。我们将使用Candy Machine来完成这项任务,这是一款Solana程序,能让创作者方便地将他们的资产上链。虽然这不是创建系列的唯一方式,但在Solana上它已经成为标准,因为它具有诸如防机器人保护和安全随机化等有用的功能。你懂的,模板时间到了。然而,随着我们构建的项目越来越复杂,我们的模板也会变得更先进。这次我们将基于Solana dApp脚手架构建一个模板。与之前的模板一样,它是一个由create-next-app创建的Next.js应用程序。不过这次,它具有更多功能。不用担心!我们依然会使用相同的工具。

    🔌 连接到钱包

    现在我们已经知道如何使用代码与网络交互,通过直接使用私钥来初始化账户。显然,在正常的去中心化应用(dapp)中,这样做是不可行的(永远不要将你的私钥暴露给任何人或任何dapp)。

    🔑 保障我们程序的安全

    是时候保障我们的Solana电影数据库程序不受到干扰了。我们将加入一些基础的安全防护,进行输入验证,并增添一个 updatemoviereview 指令。

    🕒 质押工作机制详解

    恭喜你已经接近第三周的完成了!现在让我们将你学到的所有知识运用到你正在进行的NFT项目(buildoors项目)的相关质押计划中。

    🖼 从糖果机展示NFTs

    现在我们已经铸造了一个NFT,接下来我们将学习如何铸造一系列的NFT。为此,我们将利用Candy Machine来实现——这是Solana的一个程序,使创作者能够将他们的资产上链。虽然这并非创建系列的唯一方式,但在Solana上它却成了标准,因为它具备了许多有用的功能,例如机器人保护和安全随机化。你是否感受到过看到闪亮的新iPhone时的那股兴奋感?稀有的NFT有点儿类似于此。对于优秀的艺术家而言,仅仅是观看这些NFT也极富乐趣。毕竟,艺术的本质就是用来欣赏的!接下来,我们将探讨如果我们只有Candy Machine的地址,应该如何展示NFTs。

    🤔 自定义指令

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

    🤠 状态管理

    你还记得我们在第一节中互动的电影评论程序吗?现在我们要在这里构建它。你想评论的不一定只是电影,我可不会限制你。状态是指存储在链上的程序数据。

    🤨 NFT你的脸

    有什么比将你的脸做成NFT更有趣的选择呢?你可以将自己永远铭记为早期的开拓者,并骄傲地告诉你的妈妈你已经成为了区块链的一部分。

    🦺 与程序进行交互

    在成功设置了钱包连接后,我们可以让ping按钮真正执行操作了。以下是如何实现的详细说明。

    🧬 为你的代币赋予身份

    现在是时候让代币与它们的创造者(也就是你)相遇了。我们将在之前构建的基础上继续前进。如果需要,你可以从这个链接获取起始代码(确保你处于 solution-without-burn 分支)。

    🧮 令牌元数据

    Token元数据指的是代币的基本信息,例如名称、符号和标志。注意你钱包中的各种代币都拥有这些特性,除了你自己创建的代币。

    🛠️ 构建NFT质押程序

    今天,我们将编写质押程序,并实现所有必要的质押功能,暂时不涉及任何代币转账。我将陪伴你,一步一步讲解整个过程,解释每个环节,以便你了解正在进行的操作。首先,让我们进入Solana Playground,点击create a new project,并创建一个名为src的新文件夹,其中包括一个名为lib.rs的文件。

    Solana钱包使用 - Backpack 🎒

    Solana的钱包种类繁多,如众所周知的Phantom钱包。然而,在此我并不推荐使用Phantom,因为对于开发者来说,它并不够友好。

    Solang solidity合约实现 - hello, World

    欢迎来到Solana入门指南!Solang是一个Solidity编译器,它允许你使用Solidity编程语言编写Solana程序,其他区块链中称为“智能合约”。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/solang-program-hello/index.html b/Solana-Co-Learn/tags/solang-program-hello/index.html index 54633c155..904a8bdd9 100644 --- a/Solana-Co-Learn/tags/solang-program-hello/index.html +++ b/Solana-Co-Learn/tags/solang-program-hello/index.html @@ -5,13 +5,13 @@ One doc tagged with "solang-program-hello" | All in One Solana - +
    Skip to main content

    One doc tagged with "solang-program-hello"

    View All Tags

    Solang solidity合约实现 - hello, World

    欢迎来到Solana入门指南!Solang是一个Solidity编译器,它允许你使用Solidity编程语言编写Solana程序,其他区块链中称为“智能合约”。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/spl-token/index.html b/Solana-Co-Learn/tags/spl-token/index.html index df3feaabf..18b7a836a 100644 --- a/Solana-Co-Learn/tags/spl-token/index.html +++ b/Solana-Co-Learn/tags/spl-token/index.html @@ -5,13 +5,13 @@ 5 docs tagged with "spl-token" | All in One Solana - +
    Skip to main content

    5 docs tagged with "spl-token"

    View All Tags

    🎨 创建奖励代币

    既然我们已经铸造了一个NFT,那么接下来我们要探讨如何铸造一系列的NFT。为了达成这个目标,我们将采用Candy Machine——一款在Solana上广泛使用的程序,允许创作者将其资产上链。Candy Machine在Solana上受到欢迎的原因在于,它具备了如机器人防护和安全随机化等实用功能。现在我们可以回归到我们自定义的NFT质押应用上来,借助我们在代币程序和Candy Machine上的经验来构建这个应用。

    🏧 在Solana上铸造代币

    话不多说,让我们来创造一些神奇的互联网货币吧。在我们的最终项目中,我们将创建一个代币,你将随着抵押你的社区NFT而逐渐获得它。在那之前,让我们先玩一下这个铸币过程的实际构建部分。现在是激发你的想象力,尽情享受的好时机。也许你一直想创建自己的模因币——现在是你的机会了 🚀。

    💵 Token Program

    作为区块链最基本的承诺,这些代币也许是你安装钱包的主要原因,它们是区块链上资产最纯粹的表现形式,从合成股票到数百种狗币。

    🧬 为你的代币赋予身份

    现在是时候让代币与它们的创造者(也就是你)相遇了。我们将在之前构建的基础上继续前进。如果需要,你可以从这个链接获取起始代码(确保你处于 solution-without-burn 分支)。

    🧮 令牌元数据

    Token元数据指的是代币的基本信息,例如名称、符号和标志。注意你钱包中的各种代币都拥有这些特性,除了你自己创建的代币。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/srcure-our-program/index.html b/Solana-Co-Learn/tags/srcure-our-program/index.html index ff0097977..23d447869 100644 --- a/Solana-Co-Learn/tags/srcure-our-program/index.html +++ b/Solana-Co-Learn/tags/srcure-our-program/index.html @@ -5,13 +5,13 @@ One doc tagged with "srcure-our-program" | All in One Solana - +
    Skip to main content

    One doc tagged with "srcure-our-program"

    View All Tags

    🔑 保障我们程序的安全

    是时候保障我们的Solana电影数据库程序不受到干扰了。我们将加入一些基础的安全防护,进行输入验证,并增添一个 updatemoviereview 指令。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/start-your-own-custom-project/index.html b/Solana-Co-Learn/tags/start-your-own-custom-project/index.html index 33a12eceb..4368b741f 100644 --- a/Solana-Co-Learn/tags/start-your-own-custom-project/index.html +++ b/Solana-Co-Learn/tags/start-your-own-custom-project/index.html @@ -5,13 +5,13 @@ 2 docs tagged with "start-your-own-custom-project" | All in One Solana - +
    Skip to main content

    2 docs tagged with "start-your-own-custom-project"

    View All Tags

    🌐 部署到 Vercel

    这一步是你本周工作中至关重要的一环,即将你的项目从本地环境部署到线上环境。

    💻 构建 NFT 铸造者前端

    欢迎来到第一周的挑战环节。每周,你都会有一个特定的部分,用来将你所学的内容应用到自定义的NFT质押应用程序上,并且还有战利品箱子等你拿!

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/state-management/index.html b/Solana-Co-Learn/tags/state-management/index.html index 702a040c9..ed845b6af 100644 --- a/Solana-Co-Learn/tags/state-management/index.html +++ b/Solana-Co-Learn/tags/state-management/index.html @@ -5,13 +5,13 @@ One doc tagged with "state-management" | All in One Solana - +
    Skip to main content

    One doc tagged with "state-management"

    View All Tags

    🤠 状态管理

    你还记得我们在第一节中互动的电影评论程序吗?现在我们要在这里构建它。你想评论的不一定只是电影,我可不会限制你。状态是指存储在链上的程序数据。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/sugar-cli/index.html b/Solana-Co-Learn/tags/sugar-cli/index.html index e2a89bdc2..8b3932f00 100644 --- a/Solana-Co-Learn/tags/sugar-cli/index.html +++ b/Solana-Co-Learn/tags/sugar-cli/index.html @@ -5,13 +5,13 @@ One doc tagged with "sugar-cli" | All in One Solana - +
    Skip to main content

    One doc tagged with "sugar-cli"

    View All Tags

    🍭 糖果机和Sugar CLI

    将自己的脸做成NFT有何不好呢?你可以永久地将自己视为一个早期的建设者,并告诉你的妈妈你已经进入了区块链世界。既然我们已经铸造了一个单独的NFT,现在我们将学习如何铸造一系列的NFT。为了实现这一目标,我们将使用Candy Machine——这是一个Solana程序,让创作者能够将他们的资产上链。尽管这不是创建系列的唯一方法,但在Solana上它已经成为一种标准,因为它拥有一些有用的功能,如防机器人保护和安全随机化。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/token-metadata/index.html b/Solana-Co-Learn/tags/token-metadata/index.html index 57424294f..aecea3c98 100644 --- a/Solana-Co-Learn/tags/token-metadata/index.html +++ b/Solana-Co-Learn/tags/token-metadata/index.html @@ -5,13 +5,13 @@ One doc tagged with "token-metadata" | All in One Solana - +
    Skip to main content

    One doc tagged with "token-metadata"

    View All Tags

    🧮 令牌元数据

    Token元数据指的是代币的基本信息,例如名称、符号和标志。注意你钱包中的各种代币都拥有这些特性,除了你自己创建的代币。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/token-program/index.html b/Solana-Co-Learn/tags/token-program/index.html index 6794e87ac..54753d4cf 100644 --- a/Solana-Co-Learn/tags/token-program/index.html +++ b/Solana-Co-Learn/tags/token-program/index.html @@ -5,13 +5,13 @@ One doc tagged with "token-program" | All in One Solana - +
    Skip to main content

    One doc tagged with "token-program"

    View All Tags

    💵 Token Program

    作为区块链最基本的承诺,这些代币也许是你安装钱包的主要原因,它们是区块链上资产最纯粹的表现形式,从合成股票到数百种狗币。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/wallet-and-frontend/index.html b/Solana-Co-Learn/tags/wallet-and-frontend/index.html index 4b1b07006..be09375ab 100644 --- a/Solana-Co-Learn/tags/wallet-and-frontend/index.html +++ b/Solana-Co-Learn/tags/wallet-and-frontend/index.html @@ -5,13 +5,13 @@ 2 docs tagged with "wallet-and-frontend" | All in One Solana - +
    Skip to main content

    2 docs tagged with "wallet-and-frontend"

    View All Tags

    🔌 连接到钱包

    现在我们已经知道如何使用代码与网络交互,通过直接使用私钥来初始化账户。显然,在正常的去中心化应用(dapp)中,这样做是不可行的(永远不要将你的私钥暴露给任何人或任何dapp)。

    🦺 与程序进行交互

    在成功设置了钱包连接后,我们可以让ping按钮真正执行操作了。以下是如何实现的详细说明。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/wallet-usage/index.html b/Solana-Co-Learn/tags/wallet-usage/index.html index b5cdbcfed..efdf2d6c7 100644 --- a/Solana-Co-Learn/tags/wallet-usage/index.html +++ b/Solana-Co-Learn/tags/wallet-usage/index.html @@ -5,13 +5,13 @@ One doc tagged with "wallet-usage" | All in One Solana - +
    Skip to main content

    One doc tagged with "wallet-usage"

    View All Tags

    Solana钱包使用 - Backpack 🎒

    Solana的钱包种类繁多,如众所周知的Phantom钱包。然而,在此我并不推荐使用Phantom,因为对于开发者来说,它并不够友好。

    - + \ No newline at end of file diff --git a/Solana-Co-Learn/tags/wallet/index.html b/Solana-Co-Learn/tags/wallet/index.html index 539189cd5..aa4866dad 100644 --- a/Solana-Co-Learn/tags/wallet/index.html +++ b/Solana-Co-Learn/tags/wallet/index.html @@ -5,13 +5,13 @@ One doc tagged with "wallet" | All in One Solana - +
    Skip to main content

    One doc tagged with "wallet"

    View All Tags

    📱 在钱包中展示NFTs

    现在我们已经铸造了一个NFT,接下来我们要探索如何铸造一系列的NFT。我们将使用Candy Machine来完成这项任务,这是一款Solana程序,能让创作者方便地将他们的资产上链。虽然这不是创建系列的唯一方式,但在Solana上它已经成为标准,因为它具有诸如防机器人保护和安全随机化等有用的功能。你懂的,模板时间到了。然而,随着我们构建的项目越来越复杂,我们的模板也会变得更先进。这次我们将基于Solana dApp脚手架构建一个模板。与之前的模板一样,它是一个由create-next-app创建的Next.js应用程序。不过这次,它具有更多功能。不用担心!我们依然会使用相同的工具。

    - + \ No newline at end of file diff --git a/assets/images/close-0f372b199e28778bfccf280dd97f0794.png b/assets/images/close-0f372b199e28778bfccf280dd97f0794.png deleted file mode 100644 index f3b607f98ef18aabdb51399ed875dc161e0cb31c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479689 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 W 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 z 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�YI>1naLnUUP|e>9ECLZP=GdJD(-K{+&g%3mLa+pd z*qJ1nBJj0t(9DnK->+}D#0#dr-|5*JaVxdyW5}&ux~K;%1Q(lx$m>U5UKX-w^7&Q% zX78K92d zb-(^8*F81Zq#xh*p@}H>lS=8s!2?g=z(0ulp>*Zkmg%^+*3(_crP%KC1v>asBMexB z#4ESP3an3X`Qj-uZY6K`gC@3xvIvki0;bve=*y1Z1A7vST@}>C4w|n zS39~U^PBXTgtDV``JX+@4c*JucNZho)nT`!bbIJjmIgAggefx2 z`np43W3OL>byzyD1LHdG(?|6P&rf#&FL|{3ux@>b_#mTni$Grnb?Ag$C4F3bOck18 zI7;|ooHN*x6HtT|>K~J^_KRp5Q}@?y!^K!h)j#RRY53%B(Qgela4ZpwVyM?1dU9

    w2UGT9Kmh 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

    i$2j0m?W3jl~NU`RxZ2c`&GO&*L``SQ?e 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 z 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 z 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 z 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 GyZ;AtYlWcz diff --git a/assets/images/close2-0d45330a967878bbbfbae556b00f4905.png b/assets/images/close2-0d45330a967878bbbfbae556b00f4905.png deleted file mode 100644 index 891acdd72e83cf74501f1c4277767ca236d49fe8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 414705 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%0Dc{R_J1w()ailx-6uo7v!xxf6rM+o>bIrQ( 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�g%` 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

  • ~rp<&$w7UDOe9d7CKlzcx4{GoAnCPUgajGp6qd|N-GP23ju3D!n% z)A{X#^0t0iD6Z*z*5-h;h-ugO+7v76b@RD-qztHx*6&u+uo~Ia%oxZF6t=QR`5hpr z0iaBDCn+7VFX7r5GkC(Z{ShH0C%1h3#%X$lQnZel=nxd4ZUOI0Q|n2R1Y;ds!rmgS z`@Wc-4`65OUCdTVTGktnFL;pJylOHg+EH@d)ADh=l|A7!iT1+!vKHr^7 ze44BVHZ8h-dRNO{;1h$xmHPQCQH6qa)pMTLu%3R$g;XM>SF$UvP=3gH&$^>QrR&le zLts=Tr~qTM*u`9rJ%#x~^3ojm>ZRRFYde_Mf{%tE8LC`F+p_KsySyv7Zonlg>KH=N z*Evv?wD;MhEfn3)VF@X&9Pz#kKS;zof}A`=5RovnV0s6%%x+O@3m%%h_FO#y%&_kg zNYz2xx4IX!(3B7OZzk&^5V?XxkU6}iZA#ivfxvSPT$R~5GBUhEsy@InooY0iAEfh) zJaY&5d@OS)h_;4b17%^q$AosPL~K6kg^^aRb(DG8su2bnDE<%ft-E5ZgTbv8cY_qa z&ZYwSAnq_Zz*!mh9_OnbF_Ot~_&{-&7dAb;{X-{)uR}Q#gN^wP-Ts2%a|ixQtxoIjp5Y zsVcIUI@bLBhOB}k%Bj=ml>5uL&kCOC>5S*xw|&Q?vskrKVV5f_>xPA2VJd~wE7Z|J z7hU~Q>pEZgeaLYUfGCLE@~a+rK8gip5Q%gwtWE5?$k~KJ{z|4O43wd;=hZ*gEYh)= zLJH^@@SRb+@@4FVN&u4Lod&{+DGnCZnPIqhRM|Ch_I-RlBBAn~<5VF`%q$N(4o0V< z9YBy^OW^zk3X;XIKEONjQkS+OGpT-&w-+sMxIGEn0RgHA?hI%DIv$igR0t!WpdA88 zE-%4iyL%@KnKCFNx-kTg9hMPAWabqd{Pqhx76B90I^7qJ}iRs(gHqnx(mnXnL%xV%o!rEEz;<$#Pg`~;hxcJ&t=Cz<&0GYtp0`%y+ z2&0&+@1Q=rc6sYx?L6i zUWvw5#ifUXu8L|ZKY5qKvI`&T#=vy>iqUL10=USW^h(F`82*n@O-s|(;35jUseU`; zZA8`vLl|%ri9$8NO$-Mc)d0=_6GZtAyJ{K;Jm`&ry!$6ITiX1rBUo--g*^C8X`6l zsc}NMZ-G}^DlAvzqu-zMD@3jSY|%$L!uoBV-3xg+fA%f;(S>uHojuMqhUYLDmP>5- z)m2B-c{LDPVg5Mh4hfiT{ac-2xECDr&&B(d9bacs2c0AR(5rwUJ?H{BCl%^-V|Oal zZDQp-fl2$~Iu<4a5W8*s$Uhv*lgz9c`{lZV~08Km> diff --git a/assets/images/example-instruction-8f202d0e3ebf42c9ca5e6ed8139c7588.png b/assets/images/example-instruction-8f202d0e3ebf42c9ca5e6ed8139c7588.png deleted file mode 100644 index 28d86809e5586d0a3a2602036a6845eb991619b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 390867 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֗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%0A+A&Z5QVl^w@F#sc}52*4U8bYe3Ku;l3? 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%0A$=Xefi@a8>Hvp65`~DO7BQSVET4VNY-_K#|17 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

    + \ No newline at end of file diff --git a/cookbook-zh/references/gaming/distribution/index.html b/cookbook-zh/references/gaming/distribution/index.html index b05112236..bbddd4883 100644 --- a/cookbook-zh/references/gaming/distribution/index.html +++ b/cookbook-zh/references/gaming/distribution/index.html @@ -5,13 +5,13 @@ Distribution | All in One Solana - +
    -

    Distribution

    Distribution of your game depends highly on the platform you are using. With Solana, there are game SDKs you can build for IOS, Android, Web and Native Windows or Mac. Using the Unity SDK you could even connect Nintendo Switch or XBox to Solana theoretically. Many game companies are pivoting to a mobile first approach because there are so many people with mobile phones in the world. Mobile comes with its own complications though, so you should pick what fits best to your game.

    Solana has a distinct edge over other blockchain platforms due to its offering of a crypto-native mobile phone, named Saga, that comes equipped with an innovative dApps store. This store enables the distribution of crypto games without the limitations imposed by conventional app stores such as Google or Apple.

    Publishing Platforms

    Platforms where you can host your games

    PlatformDescription
    FractalA game publishing platform that supports Solana and Ethereum. They also have their own wallet and account handling and there is an SDK for high scores and tournaments.
    ElixirPlatform for web3 games that also offers a PC launcher
    Self HostingJust host your game yourself. For example using Vercel which can be easily setup so that a new version get deployed as soon as you push to your repository. Other options are github pages or Google Firebase
    Solana mobile DApp StoreThe Solana alternative to Google Play and the Apple App Store. A crypto first variant of a dApp store, which is open source free for everyone to use.
    Apple App StoreThe Apple app store has a high reach and is trusted by its customers. The entrance barrier for crypto games is high though. The rules are very strict for everything that tries to circumvent the fees that Apple takes for in app purchases. A soon as an NFT provides benefits for the player for example Apple requires you for example to have them purchased via their in app purchase system.
    Google Play StoreGoogle is much more crypto friendly and games with NFTs and wallet deep links for example have had a track record of being approved for the official play store.
    xNFT BackpackBackpack is a Solana wallet which allows you to release apps as xNFTs. They appear in the users wallet as soon as they purchase them as applications. The Unity SDK has a xNFT export and any other web app can be published as xNFT as well.
    - +

    Distribution

    Distribution of your game depends highly on the platform you are using. With Solana, there are game SDKs you can build for IOS, Android, Web and Native Windows or Mac. Using the Unity SDK you could even connect Nintendo Switch or XBox to Solana theoretically. Many game companies are pivoting to a mobile first approach because there are so many people with mobile phones in the world. Mobile comes with its own complications though, so you should pick what fits best to your game.

    Solana has a distinct edge over other blockchain platforms due to its offering of a crypto-native mobile phone, named Saga, that comes equipped with an innovative dApps store. This store enables the distribution of crypto games without the limitations imposed by conventional app stores such as Google or Apple.

    Publishing Platforms

    Platforms where you can host your games

    PlatformDescription
    FractalA game publishing platform that supports Solana and Ethereum. They also have their own wallet and account handling and there is an SDK for high scores and tournaments.
    ElixirPlatform for web3 games that also offers a PC launcher
    Self HostingJust host your game yourself. For example using Vercel which can be easily setup so that a new version get deployed as soon as you push to your repository. Other options are github pages or Google Firebase
    Solana mobile DApp StoreThe Solana alternative to Google Play and the Apple App Store. A crypto first variant of a dApp store, which is open source free for everyone to use.
    Apple App StoreThe Apple app store has a high reach and is trusted by its customers. The entrance barrier for crypto games is high though. The rules are very strict for everything that tries to circumvent the fees that Apple takes for in app purchases. A soon as an NFT provides benefits for the player for example Apple requires you for example to have them purchased via their in app purchase system.
    Google Play StoreGoogle is much more crypto friendly and games with NFTs and wallet deep links for example have had a track record of being approved for the official play store.
    xNFT BackpackBackpack is a Solana wallet which allows you to release apps as xNFTs. They appear in the users wallet as soon as they purchase them as applications. The Unity SDK has a xNFT export and any other web app can be published as xNFT as well.
    + \ No newline at end of file diff --git a/cookbook-zh/references/gaming/energy-system/index.html b/cookbook-zh/references/gaming/energy-system/index.html index 3c2672f9d..36087a0f5 100644 --- a/cookbook-zh/references/gaming/energy-system/index.html +++ b/cookbook-zh/references/gaming/energy-system/index.html @@ -5,7 +5,7 @@ Energy System | All in One Solana - + @@ -19,8 +19,8 @@ The is a common technique in game development.


    const TIME_TO_REFILL_ENERGY: i64 = 60;
    const MAX_ENERGY: u64 = 10;

    pub fn update_energy(ctx: &mut ChopTree) -> Result<()> {
    let mut time_passed: i64 = &Clock::get()?.unix_timestamp - &ctx.player.last_login;
    let mut time_spent: i64 = 0;
    while time_passed > TIME_TO_REFILL_ENERGY {
    ctx.player.energy = ctx.player.energy + 1;
    time_passed -= TIME_TO_REFILL_ENERGY;
    time_spent += TIME_TO_REFILL_ENERGY;
    if ctx.player.energy == MAX_ENERGY {
    break;
    }
    }

    if ctx.player.energy >= MAX_ENERGY {
    ctx.player.last_login = Clock::get()?.unix_timestamp;
    } else {
    ctx.player.last_login += time_spent;
    }

    Ok(())
    }

    Js client

    Here is a complete example based on the Solana dapp scaffold with a react client: Source

    Create connection

    In the Anchor.ts file we create a connection:

    export const connection = new Connection(
    "https://api.devnet.solana.com",
    "confirmed"
    );

    Notice that the confirmation parameter is set to 'confirmed'. This means that we wait until the transactions are confirmed instead of finalized. This means that we wait until the super majority of the network said that the transaction is valid. This takes around 400ms and there was never a confirmed transaction which did not get finalized. So for games this is the perfect confirmation flag.

    Initialize player data

    First thing we do is find the program address for the player account using the seed string playerand the player's public key. Then we call initPlayer to create the account.

    const [pda] = PublicKey.findProgramAddressSync(
    [Buffer.from("player", "utf8"), publicKey.toBuffer()],
    new PublicKey(LUMBERJACK_PROGRAM_ID)
    );

    const transaction = program.methods
    .initPlayer()
    .accounts({
    player: pda,
    signer: publicKey,
    systemProgram: SystemProgram.programId,
    })
    .transaction();

    const tx = await transaction;
    const txSig = await sendTransaction(tx, connection, {
    skipPreflight: true,
    });

    await connection.confirmTransaction(txSig, "confirmed");

    Subscribe to account updates

    Here you can see how to get account data in the js client and how to subscribe to an account. connection.onAccountChange creates a socket connection to the RPC node which will push any changes that happen to the account to the client. This is faster than fetching new account data after every change. -We can then use the program.coder to decode the account data into the TS types and directly use it in the game.

    useEffect(() => {
    if (!publicKey) {return;}
    const [pda] = PublicKey.findProgramAddressSync(
    [Buffer.from("player", "utf8"), publicKey.toBuffer()],
    new PublicKey(LUMBERJACK_PROGRAM_ID)
    );
    try {
    program.account.playerData.fetch(pda).then((data) => {
    setGameState(data);
    });
    } catch (e) {
    window.alert("No player data found, please init!");
    }

    connection.onAccountChange(pda, (account) => {
    setGameState(program.coder.accounts.decode("playerData", account.data));
    });

    }, [publicKey]);

    Calculate energy and show count down

    In the javascript client we can then perform the same logic as in the program to precalculate how much energy the player would have at this point in time and show a countdown timer for the player so that he knows when the next energy will be available:

    useEffect(() => {
    const interval = setInterval(async () => {
    if (gameState == null || gameState.lastLogin == undefined || gameState.energy >= 10) {return;}
    const lastLoginTime = gameState.lastLogin * 1000;
    let timePassed = ((Date.now() - lastLoginTime) / 1000);
    while (timePassed > TIME_TO_REFILL_ENERGY && gameState.energy < MAX_ENERGY) {
    gameState.energy = (parseInt(gameState.energy) + 1);
    gameState.lastLogin = parseInt(gameState.lastLogin) + TIME_TO_REFILL_ENERGY;
    timePassed -= TIME_TO_REFILL_ENERGY;
    }
    setTimePassed(timePassed);
    let nextEnergyIn = Math.floor(TIME_TO_REFILL_ENERGY - timePassed);
    if (nextEnergyIn < TIME_TO_REFILL_ENERGY && nextEnergyIn > 0) {
    setEnergyNextIn(nextEnergyIn);
    } else {
    setEnergyNextIn(0);
    }

    }, 1000);

    return () => clearInterval(interval);
    }, [gameState, timePassed]);

    ...

    {(gameState && <div className="flex flex-col items-center">
    {("Wood: " + gameState.wood + " Energy: " + gameState.energy + " Next energy in: " + nextEnergyIn )}
    </div>)}

    With this you can now build any energy based game and even if someone builds a bot for the game the most he can do is play optimally, which maybe even easier to achieve when playing normally depending on the logic of your game.

    This game becomes even better when combined with the Token example and you actually drop some spl token to the players.

    - +We can then use the program.coder to decode the account data into the TS types and directly use it in the game.

    useEffect(() => {
    if (!publicKey) {return;}
    const [pda] = PublicKey.findProgramAddressSync(
    [Buffer.from("player", "utf8"), publicKey.toBuffer()],
    new PublicKey(LUMBERJACK_PROGRAM_ID)
    );
    try {
    program.account.playerData.fetch(pda).then((data) => {
    setGameState(data);
    });
    } catch (e) {
    window.alert("No player data found, please init!");
    }

    connection.onAccountChange(pda, (account) => {
    setGameState(program.coder.accounts.decode("playerData", account.data));
    });

    }, [publicKey]);

    Calculate energy and show count down

    In the javascript client we can then perform the same logic as in the program to precalculate how much energy the player would have at this point in time and show a countdown timer for the player so that he knows when the next energy will be available:

    useEffect(() => {
    const interval = setInterval(async () => {
    if (gameState == null || gameState.lastLogin == undefined || gameState.energy >= 10) {return;}
    const lastLoginTime = gameState.lastLogin * 1000;
    let timePassed = ((Date.now() - lastLoginTime) / 1000);
    while (timePassed > TIME_TO_REFILL_ENERGY && gameState.energy < MAX_ENERGY) {
    gameState.energy = (parseInt(gameState.energy) + 1);
    gameState.lastLogin = parseInt(gameState.lastLogin) + TIME_TO_REFILL_ENERGY;
    timePassed -= TIME_TO_REFILL_ENERGY;
    }
    setTimePassed(timePassed);
    let nextEnergyIn = Math.floor(TIME_TO_REFILL_ENERGY - timePassed);
    if (nextEnergyIn < TIME_TO_REFILL_ENERGY && nextEnergyIn > 0) {
    setEnergyNextIn(nextEnergyIn);
    } else {
    setEnergyNextIn(0);
    }

    }, 1000);

    return () => clearInterval(interval);
    }, [gameState, timePassed]);

    ...

    {(gameState && <div className="flex flex-col items-center">
    {("Wood: " + gameState.wood + " Energy: " + gameState.energy + " Next energy in: " + nextEnergyIn )}
    </div>)}

    With this you can now build any energy based game and even if someone builds a bot for the game the most he can do is play optimally, which maybe even easier to achieve when playing normally depending on the logic of your game.

    This game becomes even better when combined with the Token example and you actually drop some spl token to the players.

    + \ No newline at end of file diff --git a/cookbook-zh/references/gaming/game-examples/index.html b/cookbook-zh/references/gaming/game-examples/index.html index 15c343286..deec97b2d 100644 --- a/cookbook-zh/references/gaming/game-examples/index.html +++ b/cookbook-zh/references/gaming/game-examples/index.html @@ -5,7 +5,7 @@ Learn by example | All in One Solana - + @@ -15,8 +15,8 @@ A simple multiplayer game written in Anchor

    Tutorial

    Source

    On Chain Chess

    Chess Complete on chain playable chess game written in Anchor. Send someone a link to start a game. Looking for contributors.

    Live Version

    Source

    Multiplayer Game using voting system

    Pokemon voting system A game where collectively people vote on moves in a game boy game. Every move is recorded and each move can be minted as an NFTs.

    Live Version

    Source

    Entity component system example

    Kyoudai Clash is an on chain realtime -Using the jump crypto Arc framework which is an on chain entity component system for Solana.

    xNFT Version

    Source

    Adventure killing monsters and gaining xp

    Lumia online was a hackthon submission and is a nice reference for a little adventure game.

    xNFT Version

    Source

    Real-time pvp on chain game

    SolHunter

    Real-time Solana Battle Royal Game. Using Anchor program, UnitySDK, WebSocket account subscription. Players can spawn their characters represented as one of their NFTs on a grid and move around. If a player hits another player or chest he collect its Sol. The grid is implemented as a two dimensional array where every tile saves the players wallet key and the NFT public key.

    Example

    Source

    - +Using the jump crypto Arc framework which is an on chain entity component system for Solana.

    xNFT Version

    Source

    Adventure killing monsters and gaining xp

    Lumia online was a hackthon submission and is a nice reference for a little adventure game.

    xNFT Version

    Source

    Real-time pvp on chain game

    SolHunter

    Real-time Solana Battle Royal Game. Using Anchor program, UnitySDK, WebSocket account subscription. Players can spawn their characters represented as one of their NFTs on a grid and move around. If a player hits another player or chest he collect its Sol. The grid is implemented as a two dimensional array where every tile saves the players wallet key and the NFT public key.

    Example

    Source

    + \ No newline at end of file diff --git a/cookbook-zh/references/gaming/game-sdks/index.html b/cookbook-zh/references/gaming/game-sdks/index.html index f122a5ae9..67f244172 100644 --- a/cookbook-zh/references/gaming/game-sdks/index.html +++ b/cookbook-zh/references/gaming/game-sdks/index.html @@ -5,7 +5,7 @@ Solana Gaming SDKs | All in One Solana - + @@ -19,8 +19,8 @@ The fastest way to set it up is:

    npx create-solana-dapp your-app

    This will generate a great starting application with wallet-adapter support. A benefit of using Next.js is that you can use the same code in the backend and in the frontend, speeding up development.

    Web3Js
    Solana Cookbook

    Python

    Python is an easy to learn programming language which is often used in AI programming. There is a framework called Seahorse which lets you build smart contracts in Python.

    Anchor Playground Example
    -Source and Docs

    Native C#

    The original port of Web3js to C#. It comes with a bunch of functionality like transactions, RPC functions and anchor client code generation.

    Source and Docs

    - +Source and Docs

    Native C#

    The original port of Web3js to C#. It comes with a bunch of functionality like transactions, RPC functions and anchor client code generation.

    Source and Docs

    + \ No newline at end of file diff --git a/cookbook-zh/references/gaming/hello-world/index.html b/cookbook-zh/references/gaming/hello-world/index.html index 5057c2aef..afc142a28 100644 --- a/cookbook-zh/references/gaming/hello-world/index.html +++ b/cookbook-zh/references/gaming/hello-world/index.html @@ -5,14 +5,14 @@ Hello world example | All in One Solana - +

    Building an on-chain game on Solana

    Getting started with your first Solana game

    Video Walkthrough:

    YouTube video player

    Live Version. (use devnet in the embedded version)

    Tiny Adventure

    Tiny Adventure is a beginner-friendly Solana program created using the Anchor framework. The goal of this program is to show you how to create a simple game that allows players to track their position and move left or right.

    The Tiny Adventure Program consists of only 3 instructions:

    • initialize - This instruction sets up an on-chain account to store the player's position
    • move_left - This instruction lets the player move their position to the left
    • move_right - This instruction lets the player move their position to the right

    In the upcoming sections, we'll walk through the process of building this game step by step. -You can find the complete source code, available to deploy from your browser, in this Solana Playground example.

    If need to familiarize yourself with the Anchor framework, feel free to check out the Anchor module of the Solana Course to get started.

    Getting Started

    To start building the Tiny Adventure game, follow these steps:

    Visit Solana Playground and create a new Anchor project. If you're new to Solana Playground, you'll also need to create a Playground Wallet. Here is an example of how to use Solana Playground:

    solpg.gif

    After creating a new project, replace the default starter code with the code below:

    use anchor_lang::prelude::*;

    declare_id!("11111111111111111111111111111111");

    #[program]
    mod tiny_adventure {
    use super::*;
    }

    fn print_player(player_position: u8) {
    if player_position == 0 {
    msg!("A Journey Begins!");
    msg!("o.......");
    } else if player_position == 1 {
    msg!("..o.....");
    } else if player_position == 2 {
    msg!("....o...");
    } else if player_position == 3 {
    msg!("........\\o/");
    msg!("You have reached the end! Super!");
    }
    }

    In this game, the player starts at position 0 and can move left or right. To show the player's progress throughout the game, we'll use message logs to display their journey.

    Defining the Game Data Account

    The first step in building the game is to define a structure for the on-chain account that will store the player's position.

    The GameDataAccount struct contains a single field, player_position, which stores the player's current position as an unsigned 8-bit integer.

    use anchor_lang::prelude::*;

    declare_id!("11111111111111111111111111111111");

    #[program]
    mod tiny_adventure {
    use super::*;

    }

    ...

    // Define the Game Data Account structure
    #[account]
    pub struct GameDataAccount {
    player_position: u8,
    }

    Initialize Instruction

    After defining the program account, let’s implement the initialize instruction. This instruction initializes the GameDataAccount if it doesn't already exist, sets the player_position to 0, and print some message logs.

    The initialize instruction requires 3 accounts:

    • new_game_data_account - the GameDataAccount we are initializing
    • signer - the player paying for the initialization of the GameDataAccount
    • system_program - a required account when creating a new account
    #[program]
    pub mod tiny_adventure {
    use super::*;

    // Instruction to initialize GameDataAccount and set position to 0
    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
    ctx.accounts.new_game_data_account.player_position = 0;
    msg!("A Journey Begins!");
    msg!("o.......");
    Ok(())
    }
    }

    // Specify the accounts required by the initialize instruction
    #[derive(Accounts)]
    pub struct Initialize<'info> {
    #[account(
    init_if_needed,
    seeds = [b"level1"],
    bump,
    payer = signer,
    space = 8 + 1
    )]
    pub new_game_data_account: Account<'info, GameDataAccount>,
    #[account(mut)]
    pub signer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    ...

    In this example, a Program Derived Address (PDA) is used for the GameDataAccount address. This enables us to deterministically locate the address later on. It is important to note that the PDA in this example is generated with a single fixed value as the seed (level1), limiting our program to creating only one GameDataAccount. The init_if_needed constraint then ensures that the GameDataAccount is initialized only if it doesn't already exist.

    It is worth noting that the current implementation does not have any restrictions on who can modify the GameDataAccount. This effectively transforms the game into a multiplayer experience where everyone can control the player's movement.

    Alternatively, you can use the signer's address as an extra seed in the initialize instruction, which would enable each player to create their own GameDataAccount.

    Move Left Instruction

    Now that we can initialize a GameDataAccount account, let’s implement the move_left instruction. This lets a player update their player_position. In this example, moving left simply means decrementing the player_position by 1. We'll also set the minimum position to 0.

    The only account needed for this instruction is the GameDataAccount.

    #[program]
    pub mod tiny_adventure {
    use super::*;
    ...

    // Instruction to move left
    pub fn move_left(ctx: Context<MoveLeft>) -> Result<()> {
    let game_data_account = &mut ctx.accounts.game_data_account;
    if game_data_account.player_position == 0 {
    msg!("You are back at the start.");
    } else {
    game_data_account.player_position -= 1;
    print_player(game_data_account.player_position);
    }
    Ok(())
    }
    }

    // Specify the account required by the move_left instruction
    #[derive(Accounts)]
    pub struct MoveLeft<'info> {
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    }

    ...

    Move Right Instruction

    Lastly, let’s implement the move_right instruction. Similarly, moving right will simply mean incrementing the player_position by 1. We’ll also limit the maximum position to 3.

    Just like before, the only account needed for this instruction is the GameDataAccount.

    #[program]
    pub mod tiny_adventure {
    use super::*;
    ...

    // Instruction to move right
    pub fn move_right(ctx: Context<MoveRight>) -> Result<()> {
    let game_data_account = &mut ctx.accounts.game_data_account;
    if game_data_account.player_position == 3 {
    msg!("You have reached the end! Super!");
    } else {
    game_data_account.player_position = game_data_account.player_position + 1;
    print_player(game_data_account.player_position);
    }
    Ok(())
    }
    }

    // Specify the account required by the move_right instruction
    #[derive(Accounts)]
    pub struct MoveRight<'info> {
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    }

    ...

    Build and Deploy

    We've now completed the Tiny Adventure program! Your final program should resemble the following:

    use anchor_lang::prelude::*;

    // This is your program's public key and it will update
    // automatically when you build the project.
    declare_id!("BouPBVWkdVHbxsdzqeMwkjqd5X67RX5nwMEwxn8MDpor");

    #[program]
    mod tiny_adventure {
    use super::*;

    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
    ctx.accounts.new_game_data_account.player_position = 0;
    msg!("A Journey Begins!");
    msg!("o.......");
    Ok(())
    }

    pub fn move_left(ctx: Context<MoveLeft>) -> Result<()> {
    let game_data_account = &mut ctx.accounts.game_data_account;
    if game_data_account.player_position == 0 {
    msg!("You are back at the start.");
    } else {
    game_data_account.player_position -= 1;
    print_player(game_data_account.player_position);
    }
    Ok(())
    }

    pub fn move_right(ctx: Context<MoveRight>) -> Result<()> {
    let game_data_account = &mut ctx.accounts.game_data_account;
    if game_data_account.player_position == 3 {
    msg!("You have reached the end! Super!");
    } else {
    game_data_account.player_position = game_data_account.player_position + 1;
    print_player(game_data_account.player_position);
    }
    Ok(())
    }
    }

    fn print_player(player_position: u8) {
    if player_position == 0 {
    msg!("A Journey Begins!");
    msg!("o.......");
    } else if player_position == 1 {
    msg!("..o.....");
    } else if player_position == 2 {
    msg!("....o...");
    } else if player_position == 3 {
    msg!("........\\o/");
    msg!("You have reached the end! Super!");
    }
    }

    #[derive(Accounts)]
    pub struct Initialize<'info> {
    #[account(
    init_if_needed,
    seeds = [b"level1"],
    bump,
    payer = signer,
    space = 8 + 1
    )]
    pub new_game_data_account: Account<'info, GameDataAccount>,
    #[account(mut)]
    pub signer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    #[derive(Accounts)]
    pub struct MoveLeft<'info> {
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    }

    #[derive(Accounts)]
    pub struct MoveRight<'info> {
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    }

    #[account]
    pub struct GameDataAccount {
    player_position: u8,
    }

    With the program completed, it's time to build and deploy it on Solana Playground!

    If this is your first time using Solana Playground, create a Playground Wallet first and ensure that you're connected to a Devnet endpoint. Then, run solana airdrop 2 until you have 6 SOL. Once you have enough SOL, build and deploy the program.

    Get Started with the Client

    This next section will guide you through a simple client-side implementation for interacting with the game. We'll break down the code and provide detailed explanations for each step. In Solana Playground, navigate to the client.ts file and add the code snippets from the following sections.

    First, let’s derive the PDA for the GameDataAccount. A PDA is a unique address in the format of a public key, derived using the program's ID and additional seeds. Feel free to check out the PDA lessons of the Solana Course for more details.

    // The PDA adress everyone will be able to control the character if the interact with your program
    const [globalLevel1GameDataAccount, bump] =
    await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("level1", "utf8")],
    pg.program.programId
    );

    Next, let’s try to fetch the game data account using the PDA from the previous step. If the account doesn't exist, we'll create it by invoking the initialize instruction from our program.

    let txHash;
    let gameDateAccount;
    try {
    gameDateAccount = await pg.program.account.gameDataAccount.fetch(
    globalLevel1GameDataAccount
    );
    } catch {
    // Check if the account is already initialized, other wise initialize it
    txHash = await pg.program.methods
    .initialize()
    .accounts({
    newGameDataAccount: globalLevel1GameDataAccount,
    signer: pg.wallet.publicKey,
    systemProgram: web3.SystemProgram.programId,
    })
    .signers([pg.wallet.keypair])
    .rpc();

    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
    await pg.connection.confirmTransaction(txHash);
    console.log("A journey begins...");
    console.log("o........");
    }

    Now we are ready to interact with the game by moving left or right. This is done by invoking the moveLeft or moveRight instructions from the program and submitting a transaction to the Solana network. You can repeat this step as many times as you'd like.

    // Here you can play around now, move left and right
    txHash = await pg.program.methods
    //.moveLeft()
    .moveRight()
    .accounts({
    gameDataAccount: globalLevel1GameDataAccount,
    })
    .signers([pg.wallet.keypair])
    .rpc();
    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
    await pg.connection.confirmTransaction(txHash);

    gameDateAccount = await pg.program.account.gameDataAccount.fetch(
    globalLevel1GameDataAccount
    );

    console.log("Player position is:", gameDateAccount.playerPosition.toString());

    Lastly, let’s use a switch statement to log the character's position based on the playerPosition value stored in the gameDateAccount. We’ll use this as a visual representation of the character's movement in the game.

    switch (gameDateAccount.playerPosition) {
    case 0:
    console.log("A journey begins...");
    console.log("o........");
    break;
    case 1:
    console.log("....o....");
    break;
    case 2:
    console.log("......o..");
    break;
    case 3:
    console.log(".........\\o/");
    break;
    }

    Finally, run the client by clicking the “Run” button in Solana Playground. The output should be similar to the following:

    Running client...
    client.ts:
    My address: 8ujtDmwpkQ4Bp4GU4zUWmzf65sc21utdcxFAELESca22
    My balance: 4.649749614 SOL
    Use 'solana confirm -v 4MRXEWfGqvmro1KsKb94Zz8qTZsPa9x99oMFbLBz2WicLnr8vdYYsQwT5u3pK5Vt1i9BDrVH5qqTXwtif6sCRJCy' to see the logs
    Player position is: 1
    ....o....

    Congratulations! You have successfully built, deployed, and invoked the Tiny Adventure game from the client. To further illustrate the possibilities, check out this demo that demonstrates how to interact with the Tiny Adventure program through a Next.js frontend.

    Where to Go from Here

    With the basic game complete, unleash your creativity and practice building independently by implementing your own ideas to enrich the game experience. Here are a few suggestions:

    1. Modify the in-game texts to create an intriguing story. Invite a friend to play through your custom narrative and observe the on-chain transactions as they unfold!
    2. Add a chest that rewards players with Sol Rewards or let the player collect coins Interact with tokens as they progress through the game.
    3. Create a grid that allows the player to move up, down, left, and right, and introduce multiple players for a more dynamic experience.

    In the next installment, Tiny Adventure Two, we'll learn how to store SOL in the program and distribute it to players as rewards.

    - +You can find the complete source code, available to deploy from your browser, in this Solana Playground example.

    If need to familiarize yourself with the Anchor framework, feel free to check out the Anchor module of the Solana Course to get started.

    Getting Started

    To start building the Tiny Adventure game, follow these steps:

    Visit Solana Playground and create a new Anchor project. If you're new to Solana Playground, you'll also need to create a Playground Wallet. Here is an example of how to use Solana Playground:

    solpg.gif

    After creating a new project, replace the default starter code with the code below:

    use anchor_lang::prelude::*;

    declare_id!("11111111111111111111111111111111");

    #[program]
    mod tiny_adventure {
    use super::*;
    }

    fn print_player(player_position: u8) {
    if player_position == 0 {
    msg!("A Journey Begins!");
    msg!("o.......");
    } else if player_position == 1 {
    msg!("..o.....");
    } else if player_position == 2 {
    msg!("....o...");
    } else if player_position == 3 {
    msg!("........\\o/");
    msg!("You have reached the end! Super!");
    }
    }

    In this game, the player starts at position 0 and can move left or right. To show the player's progress throughout the game, we'll use message logs to display their journey.

    Defining the Game Data Account

    The first step in building the game is to define a structure for the on-chain account that will store the player's position.

    The GameDataAccount struct contains a single field, player_position, which stores the player's current position as an unsigned 8-bit integer.

    use anchor_lang::prelude::*;

    declare_id!("11111111111111111111111111111111");

    #[program]
    mod tiny_adventure {
    use super::*;

    }

    ...

    // Define the Game Data Account structure
    #[account]
    pub struct GameDataAccount {
    player_position: u8,
    }

    Initialize Instruction

    After defining the program account, let’s implement the initialize instruction. This instruction initializes the GameDataAccount if it doesn't already exist, sets the player_position to 0, and print some message logs.

    The initialize instruction requires 3 accounts:

    • new_game_data_account - the GameDataAccount we are initializing
    • signer - the player paying for the initialization of the GameDataAccount
    • system_program - a required account when creating a new account
    #[program]
    pub mod tiny_adventure {
    use super::*;

    // Instruction to initialize GameDataAccount and set position to 0
    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
    ctx.accounts.new_game_data_account.player_position = 0;
    msg!("A Journey Begins!");
    msg!("o.......");
    Ok(())
    }
    }

    // Specify the accounts required by the initialize instruction
    #[derive(Accounts)]
    pub struct Initialize<'info> {
    #[account(
    init_if_needed,
    seeds = [b"level1"],
    bump,
    payer = signer,
    space = 8 + 1
    )]
    pub new_game_data_account: Account<'info, GameDataAccount>,
    #[account(mut)]
    pub signer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    ...

    In this example, a Program Derived Address (PDA) is used for the GameDataAccount address. This enables us to deterministically locate the address later on. It is important to note that the PDA in this example is generated with a single fixed value as the seed (level1), limiting our program to creating only one GameDataAccount. The init_if_needed constraint then ensures that the GameDataAccount is initialized only if it doesn't already exist.

    It is worth noting that the current implementation does not have any restrictions on who can modify the GameDataAccount. This effectively transforms the game into a multiplayer experience where everyone can control the player's movement.

    Alternatively, you can use the signer's address as an extra seed in the initialize instruction, which would enable each player to create their own GameDataAccount.

    Move Left Instruction

    Now that we can initialize a GameDataAccount account, let’s implement the move_left instruction. This lets a player update their player_position. In this example, moving left simply means decrementing the player_position by 1. We'll also set the minimum position to 0.

    The only account needed for this instruction is the GameDataAccount.

    #[program]
    pub mod tiny_adventure {
    use super::*;
    ...

    // Instruction to move left
    pub fn move_left(ctx: Context<MoveLeft>) -> Result<()> {
    let game_data_account = &mut ctx.accounts.game_data_account;
    if game_data_account.player_position == 0 {
    msg!("You are back at the start.");
    } else {
    game_data_account.player_position -= 1;
    print_player(game_data_account.player_position);
    }
    Ok(())
    }
    }

    // Specify the account required by the move_left instruction
    #[derive(Accounts)]
    pub struct MoveLeft<'info> {
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    }

    ...

    Move Right Instruction

    Lastly, let’s implement the move_right instruction. Similarly, moving right will simply mean incrementing the player_position by 1. We’ll also limit the maximum position to 3.

    Just like before, the only account needed for this instruction is the GameDataAccount.

    #[program]
    pub mod tiny_adventure {
    use super::*;
    ...

    // Instruction to move right
    pub fn move_right(ctx: Context<MoveRight>) -> Result<()> {
    let game_data_account = &mut ctx.accounts.game_data_account;
    if game_data_account.player_position == 3 {
    msg!("You have reached the end! Super!");
    } else {
    game_data_account.player_position = game_data_account.player_position + 1;
    print_player(game_data_account.player_position);
    }
    Ok(())
    }
    }

    // Specify the account required by the move_right instruction
    #[derive(Accounts)]
    pub struct MoveRight<'info> {
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    }

    ...

    Build and Deploy

    We've now completed the Tiny Adventure program! Your final program should resemble the following:

    use anchor_lang::prelude::*;

    // This is your program's public key and it will update
    // automatically when you build the project.
    declare_id!("BouPBVWkdVHbxsdzqeMwkjqd5X67RX5nwMEwxn8MDpor");

    #[program]
    mod tiny_adventure {
    use super::*;

    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
    ctx.accounts.new_game_data_account.player_position = 0;
    msg!("A Journey Begins!");
    msg!("o.......");
    Ok(())
    }

    pub fn move_left(ctx: Context<MoveLeft>) -> Result<()> {
    let game_data_account = &mut ctx.accounts.game_data_account;
    if game_data_account.player_position == 0 {
    msg!("You are back at the start.");
    } else {
    game_data_account.player_position -= 1;
    print_player(game_data_account.player_position);
    }
    Ok(())
    }

    pub fn move_right(ctx: Context<MoveRight>) -> Result<()> {
    let game_data_account = &mut ctx.accounts.game_data_account;
    if game_data_account.player_position == 3 {
    msg!("You have reached the end! Super!");
    } else {
    game_data_account.player_position = game_data_account.player_position + 1;
    print_player(game_data_account.player_position);
    }
    Ok(())
    }
    }

    fn print_player(player_position: u8) {
    if player_position == 0 {
    msg!("A Journey Begins!");
    msg!("o.......");
    } else if player_position == 1 {
    msg!("..o.....");
    } else if player_position == 2 {
    msg!("....o...");
    } else if player_position == 3 {
    msg!("........\\o/");
    msg!("You have reached the end! Super!");
    }
    }

    #[derive(Accounts)]
    pub struct Initialize<'info> {
    #[account(
    init_if_needed,
    seeds = [b"level1"],
    bump,
    payer = signer,
    space = 8 + 1
    )]
    pub new_game_data_account: Account<'info, GameDataAccount>,
    #[account(mut)]
    pub signer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    #[derive(Accounts)]
    pub struct MoveLeft<'info> {
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    }

    #[derive(Accounts)]
    pub struct MoveRight<'info> {
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    }

    #[account]
    pub struct GameDataAccount {
    player_position: u8,
    }

    With the program completed, it's time to build and deploy it on Solana Playground!

    If this is your first time using Solana Playground, create a Playground Wallet first and ensure that you're connected to a Devnet endpoint. Then, run solana airdrop 2 until you have 6 SOL. Once you have enough SOL, build and deploy the program.

    Get Started with the Client

    This next section will guide you through a simple client-side implementation for interacting with the game. We'll break down the code and provide detailed explanations for each step. In Solana Playground, navigate to the client.ts file and add the code snippets from the following sections.

    First, let’s derive the PDA for the GameDataAccount. A PDA is a unique address in the format of a public key, derived using the program's ID and additional seeds. Feel free to check out the PDA lessons of the Solana Course for more details.

    // The PDA adress everyone will be able to control the character if the interact with your program
    const [globalLevel1GameDataAccount, bump] =
    await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("level1", "utf8")],
    pg.program.programId
    );

    Next, let’s try to fetch the game data account using the PDA from the previous step. If the account doesn't exist, we'll create it by invoking the initialize instruction from our program.

    let txHash;
    let gameDateAccount;
    try {
    gameDateAccount = await pg.program.account.gameDataAccount.fetch(
    globalLevel1GameDataAccount
    );
    } catch {
    // Check if the account is already initialized, other wise initialize it
    txHash = await pg.program.methods
    .initialize()
    .accounts({
    newGameDataAccount: globalLevel1GameDataAccount,
    signer: pg.wallet.publicKey,
    systemProgram: web3.SystemProgram.programId,
    })
    .signers([pg.wallet.keypair])
    .rpc();

    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
    await pg.connection.confirmTransaction(txHash);
    console.log("A journey begins...");
    console.log("o........");
    }

    Now we are ready to interact with the game by moving left or right. This is done by invoking the moveLeft or moveRight instructions from the program and submitting a transaction to the Solana network. You can repeat this step as many times as you'd like.

    // Here you can play around now, move left and right
    txHash = await pg.program.methods
    //.moveLeft()
    .moveRight()
    .accounts({
    gameDataAccount: globalLevel1GameDataAccount,
    })
    .signers([pg.wallet.keypair])
    .rpc();
    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
    await pg.connection.confirmTransaction(txHash);

    gameDateAccount = await pg.program.account.gameDataAccount.fetch(
    globalLevel1GameDataAccount
    );

    console.log("Player position is:", gameDateAccount.playerPosition.toString());

    Lastly, let’s use a switch statement to log the character's position based on the playerPosition value stored in the gameDateAccount. We’ll use this as a visual representation of the character's movement in the game.

    switch (gameDateAccount.playerPosition) {
    case 0:
    console.log("A journey begins...");
    console.log("o........");
    break;
    case 1:
    console.log("....o....");
    break;
    case 2:
    console.log("......o..");
    break;
    case 3:
    console.log(".........\\o/");
    break;
    }

    Finally, run the client by clicking the “Run” button in Solana Playground. The output should be similar to the following:

    Running client...
    client.ts:
    My address: 8ujtDmwpkQ4Bp4GU4zUWmzf65sc21utdcxFAELESca22
    My balance: 4.649749614 SOL
    Use 'solana confirm -v 4MRXEWfGqvmro1KsKb94Zz8qTZsPa9x99oMFbLBz2WicLnr8vdYYsQwT5u3pK5Vt1i9BDrVH5qqTXwtif6sCRJCy' to see the logs
    Player position is: 1
    ....o....

    Congratulations! You have successfully built, deployed, and invoked the Tiny Adventure game from the client. To further illustrate the possibilities, check out this demo that demonstrates how to interact with the Tiny Adventure program through a Next.js frontend.

    Where to Go from Here

    With the basic game complete, unleash your creativity and practice building independently by implementing your own ideas to enrich the game experience. Here are a few suggestions:

    1. Modify the in-game texts to create an intriguing story. Invite a friend to play through your custom narrative and observe the on-chain transactions as they unfold!
    2. Add a chest that rewards players with Sol Rewards or let the player collect coins Interact with tokens as they progress through the game.
    3. Create a grid that allows the player to move up, down, left, and right, and introduce multiple players for a more dynamic experience.

    In the next installment, Tiny Adventure Two, we'll learn how to store SOL in the program and distribute it to players as rewards.

    + \ No newline at end of file diff --git a/cookbook-zh/references/gaming/index.html b/cookbook-zh/references/gaming/index.html index b2a20c372..3d9a0c31d 100644 --- a/cookbook-zh/references/gaming/index.html +++ b/cookbook-zh/references/gaming/index.html @@ -5,13 +5,13 @@ 游戏 | All in One Solana - + - + + \ No newline at end of file diff --git a/cookbook-zh/references/gaming/interact-with-tokens/index.html b/cookbook-zh/references/gaming/interact-with-tokens/index.html index ec46c6a49..90970266f 100644 --- a/cookbook-zh/references/gaming/interact-with-tokens/index.html +++ b/cookbook-zh/references/gaming/interact-with-tokens/index.html @@ -5,13 +5,13 @@ How interact with tokens in program | All in One Solana - +
    -

    Using tokens in games on Solana

    Tokens on Solana can serve various purposes, such as in-game rewards, incentives, or other applications. For example, you can create tokens and distribute them to players when they complete specific in-game actions.

    Create, Mint, and Burn Tokens with Anchor

    In this tutorial, we will build a game using Anchor to introduce the basics of interacting with the Token Program on Solana. The game will be structured around four main actions: creating a new token mint, initializing player accounts, rewarding players for defeating enemies, and allowing players to heal by burning tokens.

    The program consists of 4 instructions:

    • create_mint - This instruction creates a new token mint with a Program Derived Address (PDA) as the mint authority and creates the metadata account for the mint. We will add a constraint that allows only an "admin" to invoke this instruction
    • init_player - This instruction initializes a new player account with a starting health of 100
    • kill_enemy - This instruction deducts 10 health points from the player account upon “defeating an enemy” and mints 1 token as a reward for the player
    • heal - This instruction allows a player to burn 1 token to restore their health back to 100

    For a high-level overview of the relationship among user wallets, token mints, token accounts, and token metadata accounts, consider exploring this portion of the Metaplex documentation.

    Getting Started

    To start building the program, follow these steps:

    Visit the Solana Playground and create a new Anchor project. If you're new to Solana Playground, you'll also need to create a Playground Wallet.

    After creating a new project, replace the default starter code with the code below:

    use anchor_lang::prelude::*;
    use anchor_spl::{
    associated_token::AssociatedToken,
    metadata::{create_metadata_accounts_v3, CreateMetadataAccountsV3, Metadata},
    token::{burn, mint_to, Burn, Mint, MintTo, Token, TokenAccount},
    };
    use mpl_token_metadata::{pda::find_metadata_account, state::DataV2};
    use solana_program::{pubkey, pubkey::Pubkey};

    declare_id!("11111111111111111111111111111111");

    #[program]
    pub mod anchor_token {
    use super::*;
    }

    Here we are simply bringing into scope the crates and corresponding modules we will be using for this program. We’ll be using the anchor_spl and mpl_token_metadata crates to help us interact with the Token program and the Token Metadata program.

    Create Mint instruction

    First, let’s implement an instruction to create a new token mint and its metadata account. The on-chain token metadata, including the name, symbol, and URI, will be provided as parameters to the instruction.

    Additionally, we'll only allow an "admin" to invoke this instruction by defining an ADMIN_PUBKEY constant and using it as a constraint. Be sure to replace the ADMIN_PUBKEY with your Solana Playground wallet public key.

    The create_mint instruction requires the following accounts:

    • admin - the ADMIN_PUBKEY that signs the transaction and pays for the initialization of the accounts
    • reward_token_mint - the new token mint we are initializing, using a PDA as both the mint account’s address and its mint authority
    • metadata_account - the metadata account we are initializing for the token mint
    • token_program - required for interacting with instructions on the Token program
    • token_metadata_program - required account for interacting with instructions on the Token Metadata program
    • system_program- a required account when creating a new account
    • rent - Sysvar Rent, a required account when creating the metadata account
    // Only this public key can call this instruction
    const ADMIN_PUBKEY: Pubkey = pubkey!("REPLACE_WITH_YOUR_WALLET_PUBKEY");

    #[program]
    pub mod anchor_token {
    use super::*;

    // Create new token mint with PDA as mint authority
    pub fn create_mint(
    ctx: Context<CreateMint>,
    uri: String,
    name: String,
    symbol: String,
    ) -> Result<()> {
    // PDA seeds and bump to "sign" for CPI
    let seeds = b"reward";
    let bump = *ctx.bumps.get("reward_token_mint").unwrap();
    let signer: &[&[&[u8]]] = &[&[seeds, &[bump]]];

    // On-chain token metadata for the mint
    let data_v2 = DataV2 {
    name: name,
    symbol: symbol,
    uri: uri,
    seller_fee_basis_points: 0,
    creators: None,
    collection: None,
    uses: None,
    };

    // CPI Context
    let cpi_ctx = CpiContext::new_with_signer(
    ctx.accounts.token_metadata_program.to_account_info(),
    CreateMetadataAccountsV3 {
    metadata: ctx.accounts.metadata_account.to_account_info(), // the metadata account being created
    mint: ctx.accounts.reward_token_mint.to_account_info(), // the mint account of the metadata account
    mint_authority: ctx.accounts.reward_token_mint.to_account_info(), // the mint authority of the mint account
    update_authority: ctx.accounts.reward_token_mint.to_account_info(), // the update authority of the metadata account
    payer: ctx.accounts.admin.to_account_info(), // the payer for creating the metadata account
    system_program: ctx.accounts.system_program.to_account_info(), // the system program account
    rent: ctx.accounts.rent.to_account_info(), // the rent sysvar account
    },
    signer,
    );

    create_metadata_accounts_v3(
    cpi_ctx, // cpi context
    data_v2, // token metadata
    true, // is_mutable
    true, // update_authority_is_signer
    None, // collection details
    )?;

    Ok(())
    }
    }

    #[derive(Accounts)]
    pub struct CreateMint<'info> {
    #[account(
    mut,
    address = ADMIN_PUBKEY
    )]
    pub admin: Signer<'info>,

    // The PDA is both the address of the mint account and the mint authority
    #[account(
    init,
    seeds = [b"reward"],
    bump,
    payer = admin,
    mint::decimals = 9,
    mint::authority = reward_token_mint,

    )]
    pub reward_token_mint: Account<'info, Mint>,

    ///CHECK: Using "address" constraint to validate metadata account address
    #[account(
    mut,
    address=find_metadata_account(&reward_token_mint.key()).0
    )]
    pub metadata_account: UncheckedAccount<'info>,

    pub token_program: Program<'info, Token>,
    pub token_metadata_program: Program<'info, Metadata>,
    pub system_program: Program<'info, System>,
    pub rent: Sysvar<'info, Rent>,
    }

    The create_mint instruction creates a new token mint, using a Program Derived Address (PDA) as both the address of the token mint and its mint authority. The instruction takes a URI (off-chain metadata), name, and symbol as parameters.

    This instruction then creates a metadata account for the token mint through a Cross-Program Invocation (CPI) calling the create_metadata_accounts_v3 instruction from the Token Metadata program.

    The PDA is used to "sign" the CPI since it is the mint authority, which is a required signer when creating the metadata account for a mint. The instruction data (URI, name, symbol) is included in the DataV2 struct to specify the new token mint's metadata.

    We also verify that the address of the admin account signing the transaction matches the value of the ADMIN_PUBKEY constant to ensure only the intended wallet can invoke this instruction.

    const ADMIN_PUBKEY: Pubkey = pubkey!("REPLACE_WITH_YOUR_WALLET_PUBKEY");

    Init Player Instruction

    Next, let's implement the init_player instruction which creates a new player account with an initial health of 100. The constant MAX_HEALTH is set to 100 to represent the starting health.

    The init_player instruction requires the following accounts:

    • player_data - the new player account we are initializing, which will store the player's health
    • player - the user who signs the transaction and pays for the initialization of the account
    • system_program - a required account when creating a new account
    // Player max health
    const MAX_HEALTH: u8 = 100;

    #[program]
    pub mod anchor_token {
    use super::*;
    ...

    // Create new player account
    pub fn init_player(ctx: Context<InitPlayer>) -> Result<()> {
    ctx.accounts.player_data.health = MAX_HEALTH;
    Ok(())
    }
    }
    ...

    #[derive(Accounts)]
    pub struct InitPlayer<'info> {
    #[account(
    init,
    payer = player,
    space = 8 + 8,
    seeds = [b"player".as_ref(), player.key().as_ref()],
    bump,
    )]
    pub player_data: Account<'info, PlayerData>,
    #[account(mut)]
    pub player: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    #[account]
    pub struct PlayerData {
    pub health: u8,
    }

    The player_data account is initialized using a Program Derived Address (PDA) with the player public key as one of the seeds. This ensures that each player_data account is unique and associated with the player, allowing every player to create their own player_data account.

    Kill Enemy Instruction

    Next, let's implement the kill_enemy instruction which reduces the player's health by 10 and mints 1 token to the player's token account as a reward.

    The kill_enemy instruction requires the following accounts:

    • player - the player receiving the token
    • player_data - the player data account storing the player’s current health
    • player_token_account - the player's associated token account where tokens will be minted
    • reward_token_mint - the token mint account, specifying the type of token that will be minted
    • token_program - required for interacting with instructions on the token program
    • associated_token_program - required when working with associated token accounts
    • system_program - a required account when creating a new account
    #[program]
    pub mod anchor_token {
    use super::*;
    ...

    // Mint token to player token account
    pub fn kill_enemy(ctx: Context<KillEnemy>) -> Result<()> {
    // Check if player has enough health
    if ctx.accounts.player_data.health == 0 {
    return err!(ErrorCode::NotEnoughHealth);
    }
    // Subtract 10 health from player
    ctx.accounts.player_data.health = ctx.accounts.player_data.health.checked_sub(10).unwrap();

    // PDA seeds and bump to "sign" for CPI
    let seeds = b"reward";
    let bump = *ctx.bumps.get("reward_token_mint").unwrap();
    let signer: &[&[&[u8]]] = &[&[seeds, &[bump]]];

    // CPI Context
    let cpi_ctx = CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    MintTo {
    mint: ctx.accounts.reward_token_mint.to_account_info(),
    to: ctx.accounts.player_token_account.to_account_info(),
    authority: ctx.accounts.reward_token_mint.to_account_info(),
    },
    signer,
    );

    // Mint 1 token, accounting for decimals of mint
    let amount = (1u64)
    .checked_mul(10u64.pow(ctx.accounts.reward_token_mint.decimals as u32))
    .unwrap();

    mint_to(cpi_ctx, amount)?;
    Ok(())
    }
    }
    ...

    #[derive(Accounts)]
    pub struct KillEnemy<'info> {
    #[account(mut)]
    pub player: Signer<'info>,

    #[account(
    mut,
    seeds = [b"player".as_ref(), player.key().as_ref()],
    bump,
    )]
    pub player_data: Account<'info, PlayerData>,

    // Initialize player token account if it doesn't exist
    #[account(
    init_if_needed,
    payer = player,
    associated_token::mint = reward_token_mint,
    associated_token::authority = player
    )]
    pub player_token_account: Account<'info, TokenAccount>,

    #[account(
    mut,
    seeds = [b"reward"],
    bump,
    )]
    pub reward_token_mint: Account<'info, Mint>,

    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub system_program: Program<'info, System>,
    }

    #[error_code]
    pub enum ErrorCode {
    #[msg("Not enough health")]
    NotEnoughHealth,
    }

    The player's health is reduced by 10 to represent the “battle with the enemy”. We’ll also check the player's current health and return a custom Anchor error if the player has 0 health.

    The instruction then uses a cross-program invocation (CPI) to call the mint_to instruction from the Token program and mints 1 token of the reward_token_mint to the player_token_account as a reward for killing the enemy.

    Since the mint authority for the token mint is a Program Derived Address (PDA), we can mint tokens directly by calling this instruction without additional signers. The program can "sign" on behalf of the PDA, allowing token minting without explicitly requiring extra signers.

    Heal Instruction

    Next, let's implement the heal instruction which allows a player to burn 1 token and restore their health to its maximum value.

    The heal instruction requires the following accounts:

    • player - the player executing the healing action
    • player_data - the player data account storing the player’s current health
    • player_token_account - the player's associated token account where the tokens will be burned
    • reward_token_mint - the token mint account, specifying the type of token that will be burned
    • token_program - required for interacting with instructions on the token program
    • associated_token_program - required when working with associated token accounts
    #[program]
    pub mod anchor_token {
    use super::*;
    ...

    // Burn token to health player
    pub fn heal(ctx: Context<Heal>) -> Result<()> {
    ctx.accounts.player_data.health = MAX_HEALTH;

    // CPI Context
    let cpi_ctx = CpiContext::new(
    ctx.accounts.token_program.to_account_info(),
    Burn {
    mint: ctx.accounts.reward_token_mint.to_account_info(),
    from: ctx.accounts.player_token_account.to_account_info(),
    authority: ctx.accounts.player.to_account_info(),
    },
    );

    // Burn 1 token, accounting for decimals of mint
    let amount = (1u64)
    .checked_mul(10u64.pow(ctx.accounts.reward_token_mint.decimals as u32))
    .unwrap();

    burn(cpi_ctx, amount)?;
    Ok(())
    }
    }
    ...

    #[derive(Accounts)]
    pub struct Heal<'info> {
    #[account(mut)]
    pub player: Signer<'info>,

    #[account(
    mut,
    seeds = [b"player".as_ref(), player.key().as_ref()],
    bump,
    )]
    pub player_data: Account<'info, PlayerData>,

    #[account(
    mut,
    associated_token::mint = reward_token_mint,
    associated_token::authority = player
    )]
    pub player_token_account: Account<'info, TokenAccount>,

    #[account(
    mut,
    seeds = [b"reward"],
    bump,
    )]
    pub reward_token_mint: Account<'info, Mint>,

    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    }

    The player's health is restored to its maximum value using the heal instruction. The instruction then uses a cross-program invocation (CPI) to call the burn instruction from the Token program, which burns 1 token from the player_token_account to heal the player.

    Build and Deploy

    Great job! You've now completed the program! Go ahead and build and deploy it using the Solana Playground. Your final program should look like this:

    use anchor_lang::prelude::*;
    use anchor_spl::{
    associated_token::AssociatedToken,
    metadata::{create_metadata_accounts_v3, CreateMetadataAccountsV3, Metadata},
    token::{burn, mint_to, Burn, Mint, MintTo, Token, TokenAccount},
    };
    use mpl_token_metadata::{pda::find_metadata_account, state::DataV2};
    use solana_program::{pubkey, pubkey::Pubkey};

    declare_id!("CCLnXJAJYFjCHLCugpBCEQKrpiSApiRM4UxkBUHJRrv4");

    const ADMIN_PUBKEY: Pubkey = pubkey!("REPLACE_WITH_YOUR_WALLET_PUBKEY");
    const MAX_HEALTH: u8 = 100;

    #[program]
    pub mod anchor_token {
    use super::*;

    // Create new token mint with PDA as mint authority
    pub fn create_mint(
    ctx: Context<CreateMint>,
    uri: String,
    name: String,
    symbol: String,
    ) -> Result<()> {
    // PDA seeds and bump to "sign" for CPI
    let seeds = b"reward";
    let bump = *ctx.bumps.get("reward_token_mint").unwrap();
    let signer: &[&[&[u8]]] = &[&[seeds, &[bump]]];

    // On-chain token metadata for the mint
    let data_v2 = DataV2 {
    name: name,
    symbol: symbol,
    uri: uri,
    seller_fee_basis_points: 0,
    creators: None,
    collection: None,
    uses: None,
    };

    // CPI Context
    let cpi_ctx = CpiContext::new_with_signer(
    ctx.accounts.token_metadata_program.to_account_info(),
    CreateMetadataAccountsV3 {
    metadata: ctx.accounts.metadata_account.to_account_info(), // the metadata account being created
    mint: ctx.accounts.reward_token_mint.to_account_info(), // the mint account of the metadata account
    mint_authority: ctx.accounts.reward_token_mint.to_account_info(), // the mint authority of the mint account
    update_authority: ctx.accounts.reward_token_mint.to_account_info(), // the update authority of the metadata account
    payer: ctx.accounts.admin.to_account_info(), // the payer for creating the metadata account
    system_program: ctx.accounts.system_program.to_account_info(), // the system program account
    rent: ctx.accounts.rent.to_account_info(), // the rent sysvar account
    },
    signer,
    );

    create_metadata_accounts_v3(
    cpi_ctx, // cpi context
    data_v2, // token metadata
    true, // is_mutable
    true, // update_authority_is_signer
    None, // collection details
    )?;

    Ok(())
    }

    // Create new player account
    pub fn init_player(ctx: Context<InitPlayer>) -> Result<()> {
    ctx.accounts.player_data.health = MAX_HEALTH;
    Ok(())
    }

    // Mint tokens to player token account
    pub fn kill_enemy(ctx: Context<KillEnemy>) -> Result<()> {
    // Check if player has enough health
    if ctx.accounts.player_data.health == 0 {
    return err!(ErrorCode::NotEnoughHealth);
    }
    // Subtract 10 health from player
    ctx.accounts.player_data.health = ctx.accounts.player_data.health.checked_sub(10).unwrap();

    // PDA seeds and bump to "sign" for CPI
    let seeds = b"reward";
    let bump = *ctx.bumps.get("reward_token_mint").unwrap();
    let signer: &[&[&[u8]]] = &[&[seeds, &[bump]]];

    // CPI Context
    let cpi_ctx = CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    MintTo {
    mint: ctx.accounts.reward_token_mint.to_account_info(),
    to: ctx.accounts.player_token_account.to_account_info(),
    authority: ctx.accounts.reward_token_mint.to_account_info(),
    },
    signer,
    );

    // Mint 1 token, accounting for decimals of mint
    let amount = (1u64)
    .checked_mul(10u64.pow(ctx.accounts.reward_token_mint.decimals as u32))
    .unwrap();

    mint_to(cpi_ctx, amount)?;
    Ok(())
    }

    // Burn Token to health player
    pub fn heal(ctx: Context<Heal>) -> Result<()> {
    ctx.accounts.player_data.health = MAX_HEALTH;

    // CPI Context
    let cpi_ctx = CpiContext::new(
    ctx.accounts.token_program.to_account_info(),
    Burn {
    mint: ctx.accounts.reward_token_mint.to_account_info(),
    from: ctx.accounts.player_token_account.to_account_info(),
    authority: ctx.accounts.player.to_account_info(),
    },
    );

    // Burn 1 token, accounting for decimals of mint
    let amount = (1u64)
    .checked_mul(10u64.pow(ctx.accounts.reward_token_mint.decimals as u32))
    .unwrap();

    burn(cpi_ctx, amount)?;
    Ok(())
    }
    }

    #[derive(Accounts)]
    pub struct CreateMint<'info> {
    #[account(
    mut,
    address = ADMIN_PUBKEY
    )]
    pub admin: Signer<'info>,

    // The PDA is both the address of the mint account and the mint authority
    #[account(
    init,
    seeds = [b"reward"],
    bump,
    payer = admin,
    mint::decimals = 9,
    mint::authority = reward_token_mint,

    )]
    pub reward_token_mint: Account<'info, Mint>,

    ///CHECK: Using "address" constraint to validate metadata account address
    #[account(
    mut,
    address=find_metadata_account(&reward_token_mint.key()).0
    )]
    pub metadata_account: UncheckedAccount<'info>,

    pub token_program: Program<'info, Token>,
    pub token_metadata_program: Program<'info, Metadata>,
    pub system_program: Program<'info, System>,
    pub rent: Sysvar<'info, Rent>,
    }

    #[derive(Accounts)]
    pub struct InitPlayer<'info> {
    #[account(
    init,
    payer = player,
    space = 8 + 8,
    seeds = [b"player".as_ref(), player.key().as_ref()],
    bump,
    )]
    pub player_data: Account<'info, PlayerData>,
    #[account(mut)]
    pub player: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    #[derive(Accounts)]
    pub struct KillEnemy<'info> {
    #[account(mut)]
    pub player: Signer<'info>,

    #[account(
    mut,
    seeds = [b"player".as_ref(), player.key().as_ref()],
    bump,
    )]
    pub player_data: Account<'info, PlayerData>,

    // Initialize player token account if it doesn't exist
    #[account(
    init_if_needed,
    payer = player,
    associated_token::mint = reward_token_mint,
    associated_token::authority = player
    )]
    pub player_token_account: Account<'info, TokenAccount>,

    #[account(
    mut,
    seeds = [b"reward"],
    bump,
    )]
    pub reward_token_mint: Account<'info, Mint>,

    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub system_program: Program<'info, System>,
    }

    #[derive(Accounts)]
    pub struct Heal<'info> {
    #[account(mut)]
    pub player: Signer<'info>,

    #[account(
    mut,
    seeds = [b"player".as_ref(), player.key().as_ref()],
    bump,
    )]
    pub player_data: Account<'info, PlayerData>,

    #[account(
    mut,
    associated_token::mint = reward_token_mint,
    associated_token::authority = player
    )]
    pub player_token_account: Account<'info, TokenAccount>,

    #[account(
    mut,
    seeds = [b"reward"],
    bump,
    )]
    pub reward_token_mint: Account<'info, Mint>,

    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    }

    #[account]
    pub struct PlayerData {
    pub health: u8,
    }

    #[error_code]
    pub enum ErrorCode {
    #[msg("Not enough health")]
    NotEnoughHealth,
    }

    Get Started with the Client

    In this section, we'll walk you through a simple client-side implementation for interacting with the program. To get started, navigate to the client.ts file in Solana Playground, remove the placeholder code, and add the code snippets from the following sections.

    Start by adding the following code for the setup.

    import { Metaplex } from "@metaplex-foundation/js";
    import { getMint, getAssociatedTokenAddressSync } from "@solana/spl-token";

    // metaplex token metadata program ID
    const TOKEN_METADATA_PROGRAM_ID = new web3.PublicKey(
    "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"
    );

    // metaplex setup
    const metaplex = Metaplex.make(pg.connection);

    // token metadata
    const metadata = {
    uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json",
    name: "Solana Gold",
    symbol: "GOLDSOL",
    };

    // reward token mint PDA
    const [rewardTokenMintPda] = anchor.web3.PublicKey.findProgramAddressSync(
    [Buffer.from("reward")],
    pg.PROGRAM_ID
    );

    // player data account PDA
    const [playerPDA] = anchor.web3.PublicKey.findProgramAddressSync(
    [Buffer.from("player"), pg.wallet.publicKey.toBuffer()],
    pg.PROGRAM_ID
    );

    // reward token mint metadata account address
    const rewardTokenMintMetadataPDA = await metaplex
    .nfts()
    .pdas()
    .metadata({ mint: rewardTokenMintPda });

    // player token account address
    const playerTokenAccount = getAssociatedTokenAddressSync(
    rewardTokenMintPda,
    pg.wallet.publicKey
    );

    Next, add the following two helper functions. These functions will be used to confirm transactions and fetch account data.

    async function logTransaction(txHash) {
    const { blockhash, lastValidBlockHeight } =
    await pg.connection.getLatestBlockhash();

    await pg.connection.confirmTransaction({
    blockhash,
    lastValidBlockHeight,
    signature: txHash,
    });

    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
    }

    async function fetchAccountData() {
    const [playerBalance, playerData] = await Promise.all([
    pg.connection.getTokenAccountBalance(playerTokenAccount),
    pg.program.account.playerData.fetch(playerPDA),
    ]);

    console.log("Player Token Balance: ", playerBalance.value.uiAmount);
    console.log("Player Health: ", playerData.health);
    }

    Next, invoke the createMint instruction to create a new token mint if it does not already exist.

    let txHash;

    try {
    const mintData = await getMint(pg.connection, rewardTokenMintPda);
    console.log("Mint Already Exists");
    } catch {
    txHash = await pg.program.methods
    .createMint(metadata.uri, metadata.name, metadata.symbol)
    .accounts({
    rewardTokenMint: rewardTokenMintPda,
    metadataAccount: rewardTokenMintMetadataPDA,
    tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID,
    })
    .rpc();
    await logTransaction(txHash);
    }
    console.log("Token Mint: ", rewardTokenMintPda.toString());

    Next, call the initPlayer instruction to create a new player account if one does not already exist.

    try {
    const playerData = await pg.program.account.playerData.fetch(playerPDA);
    console.log("Player Already Exists");
    console.log("Player Health: ", playerData.health);
    } catch {
    txHash = await pg.program.methods
    .initPlayer()
    .accounts({
    playerData: playerPDA,
    player: pg.wallet.publicKey,
    })
    .rpc();
    await logTransaction(txHash);
    console.log("Player Account Created");
    }

    Next, invoke the killEnemy instruction.

    txHash = await pg.program.methods
    .killEnemy()
    .accounts({
    playerData: playerPDA,
    playerTokenAccount: playerTokenAccount,
    rewardTokenMint: rewardTokenMintPda,
    })
    .rpc();
    await logTransaction(txHash);
    console.log("Enemy Defeated");
    await fetchAccountData();

    Next, invoke the heal instruction.

    txHash = await pg.program.methods
    .heal()
    .accounts({
    playerData: playerPDA,
    playerTokenAccount: playerTokenAccount,
    rewardTokenMint: rewardTokenMintPda,
    })
    .rpc();
    await logTransaction(txHash);
    console.log("Player Healed");
    await fetchAccountData();

    Finally, run the client by clicking the “Run” button in Solana Playground. You can copy the Token Mint address printed to the console and verify on Solana Explorer that the token now has metadata. The output should be similar to the following:

    Running client...
    client.ts:
    Use 'solana confirm -v 3AWnpt2Wy6jQckue4QeKsgDNKhKkhpewPmRtxvJpzxGgvK9XK9KEpTiUzAQ5vSC6CUoUjc6xWZCtrihVrFy8sACC' to see the logs
    Token Mint: 3eS7hdyeVX5g8JGhn3Z7qFXJaewoJ8hzgvubovQsPm4S
    Use 'solana confirm -v 63jbBr5U4LG75TiiHfz65q7yKJfHDhGP2ocCiDat5M2k4cWtUMAx9sHvxhnEguLDKXMbDUQKUt1nhvyQkXoDhxst' to see the logs
    Player Account Created
    Use 'solana confirm -v 2ziK41WLoxfEHvtUgc5c1SyKCAr5FvAS54ARBJrjqh9GDwzYqu7qWCwHJCgMZyFEVovYK5nUZhDRHPTMrTjq1Mm6' to see the logs
    Enemy Defeated
    Player Token Balance: 1
    Player Health: 90
    Use 'solana confirm -v 2QoAH22Q3xXz9t2TYRycQMqpEmauaRvmUfZ7ZNKUEoUyHWqpjW972VD3eZyeJrXsviaiCC3g6TE54oKmKbFQf2Q7' to see the logs
    Player Healed
    Player Token Balance: 0
    Player Health: 100
    - +

    Using tokens in games on Solana

    Tokens on Solana can serve various purposes, such as in-game rewards, incentives, or other applications. For example, you can create tokens and distribute them to players when they complete specific in-game actions.

    Create, Mint, and Burn Tokens with Anchor

    In this tutorial, we will build a game using Anchor to introduce the basics of interacting with the Token Program on Solana. The game will be structured around four main actions: creating a new token mint, initializing player accounts, rewarding players for defeating enemies, and allowing players to heal by burning tokens.

    The program consists of 4 instructions:

    • create_mint - This instruction creates a new token mint with a Program Derived Address (PDA) as the mint authority and creates the metadata account for the mint. We will add a constraint that allows only an "admin" to invoke this instruction
    • init_player - This instruction initializes a new player account with a starting health of 100
    • kill_enemy - This instruction deducts 10 health points from the player account upon “defeating an enemy” and mints 1 token as a reward for the player
    • heal - This instruction allows a player to burn 1 token to restore their health back to 100

    For a high-level overview of the relationship among user wallets, token mints, token accounts, and token metadata accounts, consider exploring this portion of the Metaplex documentation.

    Getting Started

    To start building the program, follow these steps:

    Visit the Solana Playground and create a new Anchor project. If you're new to Solana Playground, you'll also need to create a Playground Wallet.

    After creating a new project, replace the default starter code with the code below:

    use anchor_lang::prelude::*;
    use anchor_spl::{
    associated_token::AssociatedToken,
    metadata::{create_metadata_accounts_v3, CreateMetadataAccountsV3, Metadata},
    token::{burn, mint_to, Burn, Mint, MintTo, Token, TokenAccount},
    };
    use mpl_token_metadata::{pda::find_metadata_account, state::DataV2};
    use solana_program::{pubkey, pubkey::Pubkey};

    declare_id!("11111111111111111111111111111111");

    #[program]
    pub mod anchor_token {
    use super::*;
    }

    Here we are simply bringing into scope the crates and corresponding modules we will be using for this program. We’ll be using the anchor_spl and mpl_token_metadata crates to help us interact with the Token program and the Token Metadata program.

    Create Mint instruction

    First, let’s implement an instruction to create a new token mint and its metadata account. The on-chain token metadata, including the name, symbol, and URI, will be provided as parameters to the instruction.

    Additionally, we'll only allow an "admin" to invoke this instruction by defining an ADMIN_PUBKEY constant and using it as a constraint. Be sure to replace the ADMIN_PUBKEY with your Solana Playground wallet public key.

    The create_mint instruction requires the following accounts:

    • admin - the ADMIN_PUBKEY that signs the transaction and pays for the initialization of the accounts
    • reward_token_mint - the new token mint we are initializing, using a PDA as both the mint account’s address and its mint authority
    • metadata_account - the metadata account we are initializing for the token mint
    • token_program - required for interacting with instructions on the Token program
    • token_metadata_program - required account for interacting with instructions on the Token Metadata program
    • system_program- a required account when creating a new account
    • rent - Sysvar Rent, a required account when creating the metadata account
    // Only this public key can call this instruction
    const ADMIN_PUBKEY: Pubkey = pubkey!("REPLACE_WITH_YOUR_WALLET_PUBKEY");

    #[program]
    pub mod anchor_token {
    use super::*;

    // Create new token mint with PDA as mint authority
    pub fn create_mint(
    ctx: Context<CreateMint>,
    uri: String,
    name: String,
    symbol: String,
    ) -> Result<()> {
    // PDA seeds and bump to "sign" for CPI
    let seeds = b"reward";
    let bump = *ctx.bumps.get("reward_token_mint").unwrap();
    let signer: &[&[&[u8]]] = &[&[seeds, &[bump]]];

    // On-chain token metadata for the mint
    let data_v2 = DataV2 {
    name: name,
    symbol: symbol,
    uri: uri,
    seller_fee_basis_points: 0,
    creators: None,
    collection: None,
    uses: None,
    };

    // CPI Context
    let cpi_ctx = CpiContext::new_with_signer(
    ctx.accounts.token_metadata_program.to_account_info(),
    CreateMetadataAccountsV3 {
    metadata: ctx.accounts.metadata_account.to_account_info(), // the metadata account being created
    mint: ctx.accounts.reward_token_mint.to_account_info(), // the mint account of the metadata account
    mint_authority: ctx.accounts.reward_token_mint.to_account_info(), // the mint authority of the mint account
    update_authority: ctx.accounts.reward_token_mint.to_account_info(), // the update authority of the metadata account
    payer: ctx.accounts.admin.to_account_info(), // the payer for creating the metadata account
    system_program: ctx.accounts.system_program.to_account_info(), // the system program account
    rent: ctx.accounts.rent.to_account_info(), // the rent sysvar account
    },
    signer,
    );

    create_metadata_accounts_v3(
    cpi_ctx, // cpi context
    data_v2, // token metadata
    true, // is_mutable
    true, // update_authority_is_signer
    None, // collection details
    )?;

    Ok(())
    }
    }

    #[derive(Accounts)]
    pub struct CreateMint<'info> {
    #[account(
    mut,
    address = ADMIN_PUBKEY
    )]
    pub admin: Signer<'info>,

    // The PDA is both the address of the mint account and the mint authority
    #[account(
    init,
    seeds = [b"reward"],
    bump,
    payer = admin,
    mint::decimals = 9,
    mint::authority = reward_token_mint,

    )]
    pub reward_token_mint: Account<'info, Mint>,

    ///CHECK: Using "address" constraint to validate metadata account address
    #[account(
    mut,
    address=find_metadata_account(&reward_token_mint.key()).0
    )]
    pub metadata_account: UncheckedAccount<'info>,

    pub token_program: Program<'info, Token>,
    pub token_metadata_program: Program<'info, Metadata>,
    pub system_program: Program<'info, System>,
    pub rent: Sysvar<'info, Rent>,
    }

    The create_mint instruction creates a new token mint, using a Program Derived Address (PDA) as both the address of the token mint and its mint authority. The instruction takes a URI (off-chain metadata), name, and symbol as parameters.

    This instruction then creates a metadata account for the token mint through a Cross-Program Invocation (CPI) calling the create_metadata_accounts_v3 instruction from the Token Metadata program.

    The PDA is used to "sign" the CPI since it is the mint authority, which is a required signer when creating the metadata account for a mint. The instruction data (URI, name, symbol) is included in the DataV2 struct to specify the new token mint's metadata.

    We also verify that the address of the admin account signing the transaction matches the value of the ADMIN_PUBKEY constant to ensure only the intended wallet can invoke this instruction.

    const ADMIN_PUBKEY: Pubkey = pubkey!("REPLACE_WITH_YOUR_WALLET_PUBKEY");

    Init Player Instruction

    Next, let's implement the init_player instruction which creates a new player account with an initial health of 100. The constant MAX_HEALTH is set to 100 to represent the starting health.

    The init_player instruction requires the following accounts:

    • player_data - the new player account we are initializing, which will store the player's health
    • player - the user who signs the transaction and pays for the initialization of the account
    • system_program - a required account when creating a new account
    // Player max health
    const MAX_HEALTH: u8 = 100;

    #[program]
    pub mod anchor_token {
    use super::*;
    ...

    // Create new player account
    pub fn init_player(ctx: Context<InitPlayer>) -> Result<()> {
    ctx.accounts.player_data.health = MAX_HEALTH;
    Ok(())
    }
    }
    ...

    #[derive(Accounts)]
    pub struct InitPlayer<'info> {
    #[account(
    init,
    payer = player,
    space = 8 + 8,
    seeds = [b"player".as_ref(), player.key().as_ref()],
    bump,
    )]
    pub player_data: Account<'info, PlayerData>,
    #[account(mut)]
    pub player: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    #[account]
    pub struct PlayerData {
    pub health: u8,
    }

    The player_data account is initialized using a Program Derived Address (PDA) with the player public key as one of the seeds. This ensures that each player_data account is unique and associated with the player, allowing every player to create their own player_data account.

    Kill Enemy Instruction

    Next, let's implement the kill_enemy instruction which reduces the player's health by 10 and mints 1 token to the player's token account as a reward.

    The kill_enemy instruction requires the following accounts:

    • player - the player receiving the token
    • player_data - the player data account storing the player’s current health
    • player_token_account - the player's associated token account where tokens will be minted
    • reward_token_mint - the token mint account, specifying the type of token that will be minted
    • token_program - required for interacting with instructions on the token program
    • associated_token_program - required when working with associated token accounts
    • system_program - a required account when creating a new account
    #[program]
    pub mod anchor_token {
    use super::*;
    ...

    // Mint token to player token account
    pub fn kill_enemy(ctx: Context<KillEnemy>) -> Result<()> {
    // Check if player has enough health
    if ctx.accounts.player_data.health == 0 {
    return err!(ErrorCode::NotEnoughHealth);
    }
    // Subtract 10 health from player
    ctx.accounts.player_data.health = ctx.accounts.player_data.health.checked_sub(10).unwrap();

    // PDA seeds and bump to "sign" for CPI
    let seeds = b"reward";
    let bump = *ctx.bumps.get("reward_token_mint").unwrap();
    let signer: &[&[&[u8]]] = &[&[seeds, &[bump]]];

    // CPI Context
    let cpi_ctx = CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    MintTo {
    mint: ctx.accounts.reward_token_mint.to_account_info(),
    to: ctx.accounts.player_token_account.to_account_info(),
    authority: ctx.accounts.reward_token_mint.to_account_info(),
    },
    signer,
    );

    // Mint 1 token, accounting for decimals of mint
    let amount = (1u64)
    .checked_mul(10u64.pow(ctx.accounts.reward_token_mint.decimals as u32))
    .unwrap();

    mint_to(cpi_ctx, amount)?;
    Ok(())
    }
    }
    ...

    #[derive(Accounts)]
    pub struct KillEnemy<'info> {
    #[account(mut)]
    pub player: Signer<'info>,

    #[account(
    mut,
    seeds = [b"player".as_ref(), player.key().as_ref()],
    bump,
    )]
    pub player_data: Account<'info, PlayerData>,

    // Initialize player token account if it doesn't exist
    #[account(
    init_if_needed,
    payer = player,
    associated_token::mint = reward_token_mint,
    associated_token::authority = player
    )]
    pub player_token_account: Account<'info, TokenAccount>,

    #[account(
    mut,
    seeds = [b"reward"],
    bump,
    )]
    pub reward_token_mint: Account<'info, Mint>,

    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub system_program: Program<'info, System>,
    }

    #[error_code]
    pub enum ErrorCode {
    #[msg("Not enough health")]
    NotEnoughHealth,
    }

    The player's health is reduced by 10 to represent the “battle with the enemy”. We’ll also check the player's current health and return a custom Anchor error if the player has 0 health.

    The instruction then uses a cross-program invocation (CPI) to call the mint_to instruction from the Token program and mints 1 token of the reward_token_mint to the player_token_account as a reward for killing the enemy.

    Since the mint authority for the token mint is a Program Derived Address (PDA), we can mint tokens directly by calling this instruction without additional signers. The program can "sign" on behalf of the PDA, allowing token minting without explicitly requiring extra signers.

    Heal Instruction

    Next, let's implement the heal instruction which allows a player to burn 1 token and restore their health to its maximum value.

    The heal instruction requires the following accounts:

    • player - the player executing the healing action
    • player_data - the player data account storing the player’s current health
    • player_token_account - the player's associated token account where the tokens will be burned
    • reward_token_mint - the token mint account, specifying the type of token that will be burned
    • token_program - required for interacting with instructions on the token program
    • associated_token_program - required when working with associated token accounts
    #[program]
    pub mod anchor_token {
    use super::*;
    ...

    // Burn token to health player
    pub fn heal(ctx: Context<Heal>) -> Result<()> {
    ctx.accounts.player_data.health = MAX_HEALTH;

    // CPI Context
    let cpi_ctx = CpiContext::new(
    ctx.accounts.token_program.to_account_info(),
    Burn {
    mint: ctx.accounts.reward_token_mint.to_account_info(),
    from: ctx.accounts.player_token_account.to_account_info(),
    authority: ctx.accounts.player.to_account_info(),
    },
    );

    // Burn 1 token, accounting for decimals of mint
    let amount = (1u64)
    .checked_mul(10u64.pow(ctx.accounts.reward_token_mint.decimals as u32))
    .unwrap();

    burn(cpi_ctx, amount)?;
    Ok(())
    }
    }
    ...

    #[derive(Accounts)]
    pub struct Heal<'info> {
    #[account(mut)]
    pub player: Signer<'info>,

    #[account(
    mut,
    seeds = [b"player".as_ref(), player.key().as_ref()],
    bump,
    )]
    pub player_data: Account<'info, PlayerData>,

    #[account(
    mut,
    associated_token::mint = reward_token_mint,
    associated_token::authority = player
    )]
    pub player_token_account: Account<'info, TokenAccount>,

    #[account(
    mut,
    seeds = [b"reward"],
    bump,
    )]
    pub reward_token_mint: Account<'info, Mint>,

    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    }

    The player's health is restored to its maximum value using the heal instruction. The instruction then uses a cross-program invocation (CPI) to call the burn instruction from the Token program, which burns 1 token from the player_token_account to heal the player.

    Build and Deploy

    Great job! You've now completed the program! Go ahead and build and deploy it using the Solana Playground. Your final program should look like this:

    use anchor_lang::prelude::*;
    use anchor_spl::{
    associated_token::AssociatedToken,
    metadata::{create_metadata_accounts_v3, CreateMetadataAccountsV3, Metadata},
    token::{burn, mint_to, Burn, Mint, MintTo, Token, TokenAccount},
    };
    use mpl_token_metadata::{pda::find_metadata_account, state::DataV2};
    use solana_program::{pubkey, pubkey::Pubkey};

    declare_id!("CCLnXJAJYFjCHLCugpBCEQKrpiSApiRM4UxkBUHJRrv4");

    const ADMIN_PUBKEY: Pubkey = pubkey!("REPLACE_WITH_YOUR_WALLET_PUBKEY");
    const MAX_HEALTH: u8 = 100;

    #[program]
    pub mod anchor_token {
    use super::*;

    // Create new token mint with PDA as mint authority
    pub fn create_mint(
    ctx: Context<CreateMint>,
    uri: String,
    name: String,
    symbol: String,
    ) -> Result<()> {
    // PDA seeds and bump to "sign" for CPI
    let seeds = b"reward";
    let bump = *ctx.bumps.get("reward_token_mint").unwrap();
    let signer: &[&[&[u8]]] = &[&[seeds, &[bump]]];

    // On-chain token metadata for the mint
    let data_v2 = DataV2 {
    name: name,
    symbol: symbol,
    uri: uri,
    seller_fee_basis_points: 0,
    creators: None,
    collection: None,
    uses: None,
    };

    // CPI Context
    let cpi_ctx = CpiContext::new_with_signer(
    ctx.accounts.token_metadata_program.to_account_info(),
    CreateMetadataAccountsV3 {
    metadata: ctx.accounts.metadata_account.to_account_info(), // the metadata account being created
    mint: ctx.accounts.reward_token_mint.to_account_info(), // the mint account of the metadata account
    mint_authority: ctx.accounts.reward_token_mint.to_account_info(), // the mint authority of the mint account
    update_authority: ctx.accounts.reward_token_mint.to_account_info(), // the update authority of the metadata account
    payer: ctx.accounts.admin.to_account_info(), // the payer for creating the metadata account
    system_program: ctx.accounts.system_program.to_account_info(), // the system program account
    rent: ctx.accounts.rent.to_account_info(), // the rent sysvar account
    },
    signer,
    );

    create_metadata_accounts_v3(
    cpi_ctx, // cpi context
    data_v2, // token metadata
    true, // is_mutable
    true, // update_authority_is_signer
    None, // collection details
    )?;

    Ok(())
    }

    // Create new player account
    pub fn init_player(ctx: Context<InitPlayer>) -> Result<()> {
    ctx.accounts.player_data.health = MAX_HEALTH;
    Ok(())
    }

    // Mint tokens to player token account
    pub fn kill_enemy(ctx: Context<KillEnemy>) -> Result<()> {
    // Check if player has enough health
    if ctx.accounts.player_data.health == 0 {
    return err!(ErrorCode::NotEnoughHealth);
    }
    // Subtract 10 health from player
    ctx.accounts.player_data.health = ctx.accounts.player_data.health.checked_sub(10).unwrap();

    // PDA seeds and bump to "sign" for CPI
    let seeds = b"reward";
    let bump = *ctx.bumps.get("reward_token_mint").unwrap();
    let signer: &[&[&[u8]]] = &[&[seeds, &[bump]]];

    // CPI Context
    let cpi_ctx = CpiContext::new_with_signer(
    ctx.accounts.token_program.to_account_info(),
    MintTo {
    mint: ctx.accounts.reward_token_mint.to_account_info(),
    to: ctx.accounts.player_token_account.to_account_info(),
    authority: ctx.accounts.reward_token_mint.to_account_info(),
    },
    signer,
    );

    // Mint 1 token, accounting for decimals of mint
    let amount = (1u64)
    .checked_mul(10u64.pow(ctx.accounts.reward_token_mint.decimals as u32))
    .unwrap();

    mint_to(cpi_ctx, amount)?;
    Ok(())
    }

    // Burn Token to health player
    pub fn heal(ctx: Context<Heal>) -> Result<()> {
    ctx.accounts.player_data.health = MAX_HEALTH;

    // CPI Context
    let cpi_ctx = CpiContext::new(
    ctx.accounts.token_program.to_account_info(),
    Burn {
    mint: ctx.accounts.reward_token_mint.to_account_info(),
    from: ctx.accounts.player_token_account.to_account_info(),
    authority: ctx.accounts.player.to_account_info(),
    },
    );

    // Burn 1 token, accounting for decimals of mint
    let amount = (1u64)
    .checked_mul(10u64.pow(ctx.accounts.reward_token_mint.decimals as u32))
    .unwrap();

    burn(cpi_ctx, amount)?;
    Ok(())
    }
    }

    #[derive(Accounts)]
    pub struct CreateMint<'info> {
    #[account(
    mut,
    address = ADMIN_PUBKEY
    )]
    pub admin: Signer<'info>,

    // The PDA is both the address of the mint account and the mint authority
    #[account(
    init,
    seeds = [b"reward"],
    bump,
    payer = admin,
    mint::decimals = 9,
    mint::authority = reward_token_mint,

    )]
    pub reward_token_mint: Account<'info, Mint>,

    ///CHECK: Using "address" constraint to validate metadata account address
    #[account(
    mut,
    address=find_metadata_account(&reward_token_mint.key()).0
    )]
    pub metadata_account: UncheckedAccount<'info>,

    pub token_program: Program<'info, Token>,
    pub token_metadata_program: Program<'info, Metadata>,
    pub system_program: Program<'info, System>,
    pub rent: Sysvar<'info, Rent>,
    }

    #[derive(Accounts)]
    pub struct InitPlayer<'info> {
    #[account(
    init,
    payer = player,
    space = 8 + 8,
    seeds = [b"player".as_ref(), player.key().as_ref()],
    bump,
    )]
    pub player_data: Account<'info, PlayerData>,
    #[account(mut)]
    pub player: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    #[derive(Accounts)]
    pub struct KillEnemy<'info> {
    #[account(mut)]
    pub player: Signer<'info>,

    #[account(
    mut,
    seeds = [b"player".as_ref(), player.key().as_ref()],
    bump,
    )]
    pub player_data: Account<'info, PlayerData>,

    // Initialize player token account if it doesn't exist
    #[account(
    init_if_needed,
    payer = player,
    associated_token::mint = reward_token_mint,
    associated_token::authority = player
    )]
    pub player_token_account: Account<'info, TokenAccount>,

    #[account(
    mut,
    seeds = [b"reward"],
    bump,
    )]
    pub reward_token_mint: Account<'info, Mint>,

    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    pub system_program: Program<'info, System>,
    }

    #[derive(Accounts)]
    pub struct Heal<'info> {
    #[account(mut)]
    pub player: Signer<'info>,

    #[account(
    mut,
    seeds = [b"player".as_ref(), player.key().as_ref()],
    bump,
    )]
    pub player_data: Account<'info, PlayerData>,

    #[account(
    mut,
    associated_token::mint = reward_token_mint,
    associated_token::authority = player
    )]
    pub player_token_account: Account<'info, TokenAccount>,

    #[account(
    mut,
    seeds = [b"reward"],
    bump,
    )]
    pub reward_token_mint: Account<'info, Mint>,

    pub token_program: Program<'info, Token>,
    pub associated_token_program: Program<'info, AssociatedToken>,
    }

    #[account]
    pub struct PlayerData {
    pub health: u8,
    }

    #[error_code]
    pub enum ErrorCode {
    #[msg("Not enough health")]
    NotEnoughHealth,
    }

    Get Started with the Client

    In this section, we'll walk you through a simple client-side implementation for interacting with the program. To get started, navigate to the client.ts file in Solana Playground, remove the placeholder code, and add the code snippets from the following sections.

    Start by adding the following code for the setup.

    import { Metaplex } from "@metaplex-foundation/js";
    import { getMint, getAssociatedTokenAddressSync } from "@solana/spl-token";

    // metaplex token metadata program ID
    const TOKEN_METADATA_PROGRAM_ID = new web3.PublicKey(
    "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"
    );

    // metaplex setup
    const metaplex = Metaplex.make(pg.connection);

    // token metadata
    const metadata = {
    uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json",
    name: "Solana Gold",
    symbol: "GOLDSOL",
    };

    // reward token mint PDA
    const [rewardTokenMintPda] = anchor.web3.PublicKey.findProgramAddressSync(
    [Buffer.from("reward")],
    pg.PROGRAM_ID
    );

    // player data account PDA
    const [playerPDA] = anchor.web3.PublicKey.findProgramAddressSync(
    [Buffer.from("player"), pg.wallet.publicKey.toBuffer()],
    pg.PROGRAM_ID
    );

    // reward token mint metadata account address
    const rewardTokenMintMetadataPDA = await metaplex
    .nfts()
    .pdas()
    .metadata({ mint: rewardTokenMintPda });

    // player token account address
    const playerTokenAccount = getAssociatedTokenAddressSync(
    rewardTokenMintPda,
    pg.wallet.publicKey
    );

    Next, add the following two helper functions. These functions will be used to confirm transactions and fetch account data.

    async function logTransaction(txHash) {
    const { blockhash, lastValidBlockHeight } =
    await pg.connection.getLatestBlockhash();

    await pg.connection.confirmTransaction({
    blockhash,
    lastValidBlockHeight,
    signature: txHash,
    });

    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
    }

    async function fetchAccountData() {
    const [playerBalance, playerData] = await Promise.all([
    pg.connection.getTokenAccountBalance(playerTokenAccount),
    pg.program.account.playerData.fetch(playerPDA),
    ]);

    console.log("Player Token Balance: ", playerBalance.value.uiAmount);
    console.log("Player Health: ", playerData.health);
    }

    Next, invoke the createMint instruction to create a new token mint if it does not already exist.

    let txHash;

    try {
    const mintData = await getMint(pg.connection, rewardTokenMintPda);
    console.log("Mint Already Exists");
    } catch {
    txHash = await pg.program.methods
    .createMint(metadata.uri, metadata.name, metadata.symbol)
    .accounts({
    rewardTokenMint: rewardTokenMintPda,
    metadataAccount: rewardTokenMintMetadataPDA,
    tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID,
    })
    .rpc();
    await logTransaction(txHash);
    }
    console.log("Token Mint: ", rewardTokenMintPda.toString());

    Next, call the initPlayer instruction to create a new player account if one does not already exist.

    try {
    const playerData = await pg.program.account.playerData.fetch(playerPDA);
    console.log("Player Already Exists");
    console.log("Player Health: ", playerData.health);
    } catch {
    txHash = await pg.program.methods
    .initPlayer()
    .accounts({
    playerData: playerPDA,
    player: pg.wallet.publicKey,
    })
    .rpc();
    await logTransaction(txHash);
    console.log("Player Account Created");
    }

    Next, invoke the killEnemy instruction.

    txHash = await pg.program.methods
    .killEnemy()
    .accounts({
    playerData: playerPDA,
    playerTokenAccount: playerTokenAccount,
    rewardTokenMint: rewardTokenMintPda,
    })
    .rpc();
    await logTransaction(txHash);
    console.log("Enemy Defeated");
    await fetchAccountData();

    Next, invoke the heal instruction.

    txHash = await pg.program.methods
    .heal()
    .accounts({
    playerData: playerPDA,
    playerTokenAccount: playerTokenAccount,
    rewardTokenMint: rewardTokenMintPda,
    })
    .rpc();
    await logTransaction(txHash);
    console.log("Player Healed");
    await fetchAccountData();

    Finally, run the client by clicking the “Run” button in Solana Playground. You can copy the Token Mint address printed to the console and verify on Solana Explorer that the token now has metadata. The output should be similar to the following:

    Running client...
    client.ts:
    Use 'solana confirm -v 3AWnpt2Wy6jQckue4QeKsgDNKhKkhpewPmRtxvJpzxGgvK9XK9KEpTiUzAQ5vSC6CUoUjc6xWZCtrihVrFy8sACC' to see the logs
    Token Mint: 3eS7hdyeVX5g8JGhn3Z7qFXJaewoJ8hzgvubovQsPm4S
    Use 'solana confirm -v 63jbBr5U4LG75TiiHfz65q7yKJfHDhGP2ocCiDat5M2k4cWtUMAx9sHvxhnEguLDKXMbDUQKUt1nhvyQkXoDhxst' to see the logs
    Player Account Created
    Use 'solana confirm -v 2ziK41WLoxfEHvtUgc5c1SyKCAr5FvAS54ARBJrjqh9GDwzYqu7qWCwHJCgMZyFEVovYK5nUZhDRHPTMrTjq1Mm6' to see the logs
    Enemy Defeated
    Player Token Balance: 1
    Player Health: 90
    Use 'solana confirm -v 2QoAH22Q3xXz9t2TYRycQMqpEmauaRvmUfZ7ZNKUEoUyHWqpjW972VD3eZyeJrXsviaiCC3g6TE54oKmKbFQf2Q7' to see the logs
    Player Healed
    Player Token Balance: 0
    Player Health: 100
    + \ No newline at end of file diff --git a/cookbook-zh/references/gaming/intro/index.html b/cookbook-zh/references/gaming/intro/index.html index 968156507..52fe4eba8 100644 --- a/cookbook-zh/references/gaming/intro/index.html +++ b/cookbook-zh/references/gaming/intro/index.html @@ -5,13 +5,13 @@ Intro into gaming on Solana | All in One Solana - +
    -

    Intro into gaming on Solana

    The gaming space in the Solana ecosystem is expanding rapidly. Integrating with Solana can provide numerous benefits for games, such as enabling players to own and trade their assets via NFTs in games, building a real in-game economy, creating composable game programs, and allowing players to compete for valuable assets.

    Solana is purpose-built for games, with its 400ms block time and lightning-fast confirmations making it a real-time database that's free for all. It's perfect for genres like strategy games, city builders, turn-based games, and more.

    However, not everything needs to be put on the blockchain. Smaller integrations using NFTs that represent game items, for example, can be easily done. Transaction fees are extremely cheap, and there are many tools and SDKs available to start building today. You can build your game in Javascript and Canvas, Flutter, or use one of the Solana Game SDKs for the two biggest game engines - UnitySDK, UnrealSDK, and more Game SDKs.

    There are several ways to integrate Solana into your game:

    1. Give players digital collectibles for in-game items or use them as characters. Check out Nfts in games
    2. Use tokens for in-app purchases or micro-payments in the game. See use tokens
    3. Use the player's wallet to authenticate them in the game. Sign message
    4. Run tournaments and pay out crypto rewards to your players.
    5. Develop the game entirely on-chain to reward your players in every step they take. Start with Hello world

    With all these benefits, Solana is quickly becoming the go-to platform for game developers. Get started today!

    - +

    Intro into gaming on Solana

    The gaming space in the Solana ecosystem is expanding rapidly. Integrating with Solana can provide numerous benefits for games, such as enabling players to own and trade their assets via NFTs in games, building a real in-game economy, creating composable game programs, and allowing players to compete for valuable assets.

    Solana is purpose-built for games, with its 400ms block time and lightning-fast confirmations making it a real-time database that's free for all. It's perfect for genres like strategy games, city builders, turn-based games, and more.

    However, not everything needs to be put on the blockchain. Smaller integrations using NFTs that represent game items, for example, can be easily done. Transaction fees are extremely cheap, and there are many tools and SDKs available to start building today. You can build your game in Javascript and Canvas, Flutter, or use one of the Solana Game SDKs for the two biggest game engines - UnitySDK, UnrealSDK, and more Game SDKs.

    There are several ways to integrate Solana into your game:

    1. Give players digital collectibles for in-game items or use them as characters. Check out Nfts in games
    2. Use tokens for in-app purchases or micro-payments in the game. See use tokens
    3. Use the player's wallet to authenticate them in the game. Sign message
    4. Run tournaments and pay out crypto rewards to your players.
    5. Develop the game entirely on-chain to reward your players in every step they take. Start with Hello world

    With all these benefits, Solana is quickly becoming the go-to platform for game developers. Get started today!

    + \ No newline at end of file diff --git a/cookbook-zh/references/gaming/nfts-in-games/index.html b/cookbook-zh/references/gaming/nfts-in-games/index.html index e8d2bb59b..9dae67836 100644 --- a/cookbook-zh/references/gaming/nfts-in-games/index.html +++ b/cookbook-zh/references/gaming/nfts-in-games/index.html @@ -5,7 +5,7 @@ NFTs In Games | All in One Solana - + @@ -18,8 +18,8 @@ In js using the Metaplex sdk this would look like this:

    JSON.parse(
    // For example '.config/solana/devnet.json'
    fs.readFileSync("yourKeyPair.json").toString())
    );
    let keyPair = Keypair.fromSecretKey(decodedKey);

    const metaplex = Metaplex.make(connection).use(keypairIdentity(keyPair));

    const nfts = await metaplex
    .nfts()
    .findAllByOwner({ owner: wallet.publicKey })

    let collectionNfts = []
    for (let i = 0; i < nfts.length; i++) {
    if (nfts[i].collection?.address.toString() == collectionAddress.toString()) {
    collectionNfts.push(nfts[i])
    }
    }

    Bonus Effects with NFTs

    In addition to providing new revenue streams, NFTs can also be used to provide in-game benefits and bonuses to players. For instance, a player who owns a "coin doubler" NFT may receive double the amount of coins for as long as they hold the NFT in their wallet. Additionally, NFTs can be used as consumables, allowing players to use them to gain temporary effects such as potions or spells. Once consumed, the NFT is burned, and the effect is applied to the player's character. These innovative features of NFTs provide game developers with new opportunities to create unique gameplay experiences and reward players for their ownership of valuable assets on the Solana blockchain.

    How to interact with tokens

    NFTs

    Using NFT Metadata for Player Stats

    NFTs also have Metadata, which can be used for all kind of traits for game objects. For example an NFT could represent a game character and his traits Strength/Intelligence/Agility could directly influence how strong the character is in the game. You can load NFT metadata and their attributes using the Metaplex SDK:

    import { Metaplex, keypairIdentity } from "@metaplex-foundation/js";

    JSON.parse(
    // For example '.config/solana/devnet.json'
    fs.readFileSync("yourKeyPair.json").toString())
    );
    let keyPair = Keypair.fromSecretKey(decodedKey);

    const metaplex = Metaplex.make(connection).use(keypairIdentity(keyPair));
    const nfts = await metaplex.nfts().findAllByOwner({owner: keyPair.publicKey});

    const physicalDamage = 5;
    const magicalDamage = 5;

    nfts.forEach(async nft => {
    const metaData = await metaplex.nfts().load({metadata: nft});

    metaData.json.attributes.forEach(async attribute => {
    if (attribute.trait_type == "Strength") {
    physicalDamage += parseInt(attribute.value)
    }
    if (attribute.trait_type == "Int") {
    magicalDamage += parseInt(attribute.value)
    }
    });
    })

    console.log("Player Physical Damage: " + physicalDamage)
    console.log("Player Magical Damage: " + magicalDamage)

    Fusing NFTs Together

    The Metaplex Fusion Trifle program allows you to have NFTs own other NFTs. For example you could create a plant plot NFT and then use to combine it with a water NFT and a seed NFT to create a Tomato NFT.

    Use 3D Nfts in a game

    Every NFT metadata can also have a animation url. This url can contain a video, gif or a 3d file. These 3d files usually use the format .glb or .gltf and can dynamically be loaded into a game. For unity you can use the GLTFast package and in js the -GLTFast JS. For reference a NFT metadata with glb model

      var gltf = gameObject.AddComponent<GLTFast.GltfAsset>();
    gltf.url = nft.metadata.animationUrl;
    npm install --save-dev gltf-loader-ts

    import { GltfLoader } from 'gltf-loader-ts';

    let loader = new GltfLoader();
    let uri = 'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/BoxTextured/glTF/BoxTextured.gltf';
    let asset: Asset = await loader.load(uri);
    let gltf: GlTf = asset.gltf;
    console.log(gltf);
    // -> {asset: {…}, scene: 0, scenes: Array(1), nodes: Array(2), meshes: Array(1), …}

    let data = await asset.accessorData(0); // fetches BoxTextured0.bin
    let image: Image = await asset.imageData.get(0) // fetches CesiumLogoFlat.png

    Customize NFTs with items and traits (Raindrops boots)

    With the Raindrops Boots program you can have an adventure character which owns a sword and a helmet. When the Character NFT would be sold on a market place the other NFTs it owns would be sold as well.

    How to create an NFT collection

    NFTs on Solana mostly follow the Metaplex standard. Metaplex is a company which takes care of the NFT most used standard on Solana. The most common way to create an NFT collection is to create a metaplex candy machine which lets the user mint predefined pairs of metadata and images.

    Metaplex Docs

    Setup a candy machine step by step

    NFTs

    - +GLTFast JS. For reference a NFT metadata with glb model

      var gltf = gameObject.AddComponent<GLTFast.GltfAsset>();
    gltf.url = nft.metadata.animationUrl;
    npm install --save-dev gltf-loader-ts

    import { GltfLoader } from 'gltf-loader-ts';

    let loader = new GltfLoader();
    let uri = 'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/BoxTextured/glTF/BoxTextured.gltf';
    let asset: Asset = await loader.load(uri);
    let gltf: GlTf = asset.gltf;
    console.log(gltf);
    // -> {asset: {…}, scene: 0, scenes: Array(1), nodes: Array(2), meshes: Array(1), …}

    let data = await asset.accessorData(0); // fetches BoxTextured0.bin
    let image: Image = await asset.imageData.get(0) // fetches CesiumLogoFlat.png

    Customize NFTs with items and traits (Raindrops boots)

    With the Raindrops Boots program you can have an adventure character which owns a sword and a helmet. When the Character NFT would be sold on a market place the other NFTs it owns would be sold as well.

    How to create an NFT collection

    NFTs on Solana mostly follow the Metaplex standard. Metaplex is a company which takes care of the NFT most used standard on Solana. The most common way to create an NFT collection is to create a metaplex candy machine which lets the user mint predefined pairs of metadata and images.

    Metaplex Docs

    Setup a candy machine step by step

    NFTs

    + \ No newline at end of file diff --git a/cookbook-zh/references/gaming/porting-anchor-to-unity/index.html b/cookbook-zh/references/gaming/porting-anchor-to-unity/index.html index 02da13f5e..d217c2364 100644 --- a/cookbook-zh/references/gaming/porting-anchor-to-unity/index.html +++ b/cookbook-zh/references/gaming/porting-anchor-to-unity/index.html @@ -5,7 +5,7 @@ Porting a program to Unity | All in One Solana - + @@ -14,8 +14,8 @@ With this IDL you can then generate different clients. For example JS or C# to Unity.
    IDL to C# Converter

    These two lines will generate a C# client for the game.

    dotnet tool install Solana.Unity.Anchor.Tool
    dotnet anchorgen -i idl/file.json -o src/ProgramCode.cs

    This will generate you a C# representation of you program, which lets you deserialize the data and easily create instructions to the program.

    Building the Transaction in Unity C#

    Within Unity game engine we can then use the Solana Unity SDK to interact with the program.

    1. First we find the on chain adress of the game data account with TryFindProgramAddress. We need to pass in this account to the transaction so that the Solana runtime knows that we want to change this account.

    2. Next we use the generated client to create a MoveRight instruction.

    3. Then we request a block hash from an RPC node. This is needed so that Solana knows how long the transaction will be valid.

    4. Next we set the fee payer to be the players wallet.

    5. Then we add the move right instruction to the Transaction. We can also add multiple instructions to a singe transaction if needed.

    6. Afterwards the transaction gets signed and then send to the RPC node for processing. -Solana has different Commitment levels. If we set the commitment level to Confirmed we will be able to get the new state already within the next 500ms.

    7. Full C# Source Code

    public async void MoveRight()
    {
    PublicKey.TryFindProgramAddress(new[]
    {
    Encoding.UTF8.GetBytes("level1")
    },
    ProgramId, out gameDataAccount, out var bump);

    MoveRightAccounts account = new MoveRightAccounts();
    account.GameDataAccount = gameDataAccount;
    TransactionInstruction moveRightInstruction = TinyAdventureProgram.MoveRight(account, ProgramId);

    var walletHolderService = ServiceFactory.Resolve<WalletHolderService>();
    var result = await walletHolderService.BaseWallet.ActiveRpcClient.GetRecentBlockHashAsync(Commitment.Confirmed);

    Transaction transaction = new Transaction();
    transaction.FeePayer = walletHolderService.BaseWallet.Account.PublicKey;
    transaction.RecentBlockHash = result.Result.Value.Blockhash;
    transaction.Signatures = new List<SignaturePubKeyPair>();
    transaction.Instructions = new List<TransactionInstruction>();
    transaction.Instructions.Add(moveRightInstruction);

    Transaction signedTransaction = await walletHolderService.BaseWallet.SignTransaction(transaction);

    RequestResult<string> signature = await walletHolderService.BaseWallet.ActiveRpcClient.SendTransactionAsync(
    Convert.ToBase64String(signedTransaction.Serialize()),
    true, Commitment.Confirmed);
    }
    - +Solana has different Commitment levels. If we set the commitment level to Confirmed we will be able to get the new state already within the next 500ms.

      Fue0_9L-IZ@qKv~IcHI#NgBB3Z#J)#sry(;d#FsD$07 z*P70{VU^Gozyo#4vBXfXIf#6Zx@(wn#M9#2U*=zAIDzl};;UTo&1buvEiRsEg^Rcw ztQ%o_l~&93xEOBfD&nu)S5TuGJpV8G1iq3uFIngL#{deZ?s`+@JA1>_+ZU}_uVs=q z-l^^pz%cx+G?iiS>yc}n!#;JVZoPl%RM@~@5l6=dourX`bRaN}qeT>vBOJDnG;AfE z_`NAYE2uL@k3aoD*2nzxB-b+jmJ)<@tx*u3Q#45G2|*IgpS7%1&z=fCaBtc&rxG?` z?bx-vb!|i1wmc*0o=E3Uw90lnre!8_>Jq`iD`nrGRm_Jpbu+8b$cYDo*Nsyp*J^5o zf}u(6v-y5(>}noXwfF8d4k;&3z&&nrAGHm8YT>Z^(ACVjP?hf&wR018pNYvTcrYtWPYV9P|P ziH0-SVUztUYxD*vVpv;Er-vhDpZ&q>p_=*w)^Ie8ex3cWWbRz^ceEy!wdx0b>Y!tL z=QKQYk2}NYb-ZGI{fpnb*t}C2%QK~5C7a~c7CAxB$C01xiJ_}{Ixn#1NMGk~*LS9#XK_7O+vVcN4-=)2n zD!6#`xhgvk9PT8U4`X7*-LQg#7e2PJmn0Km1VAqE%VdJ*3SJpy6;p2xi2`Sm_b~X# zw1(_yjpQtjqJaU%RXMCa9}EHkf|$8j1NiSSu-aW!|8&+2c+>D--U6lx%qm;=L3o#} z`ogFJrb(Zzejbz|&-bs4PP1!CBo`fm{i|WSpx~DtXLf(BoiEn^v(<_TY2n|^?VGS2 z?*6dSf;qRJt`WvbA_r{6fBDNX4{Zr8E$IZP|I#ALJ2e0eM(eJ~8N&NGS-T`Vb8W(M ztiJkbS4P9omV7?0@jVBzx@-oP;9zA?!PcFYCfPw3O#$p~-@~j97akLZsq#c=QtP@P z#w5=Yeb_RYd$$(XApS$~snFl&q2lbkffcn`yC9eW1lp|ufaHG|Rfg?sv9y6Hj3Q+# zaigaj`ujMku$b??*J3qh28TZIIWCvw?RbB;VgbS+@JN#on$j5?N zADRYf%^~scCj+9AH)}0#{W%LAhAH4hE8I|ub#0(B;?BD^j0wmcC;VL*b%7yuDngP@|>Tt5h5N#N2 zYnd8vQ92rofx42G)B8{kJ4(O{)ml z$$bJ}=%aCElLtRb&1SS-Up?(yp6PPab`R=jTu(+Vg{}Pzj&Re2O3_=b-lG4ThbRbg zl835>qHBLrXzlT?#oOw)Kb$xI?=GvbYE?*DG7$*3x^?hgf_M|W;+^YjA3|^3Y4{Bo zDR5&vc8P1ScPN1U_u?@tTw0F6J@8*n2CHc#6@?knl0Qd+6u&9;q+-^)@JV_>+ z(V<)~DuV2FQW~43#fhR2U{0t;=7gEzA~v5C+Ii^P(|Qf{OiYY^ISzq|k5H>jKLgYk z;J?OktehLC4gN9M)p_kuOM&Y+pOMN-_^MSXut*=eN5Nq&mnyD7V_D<7Tr&lAY1RV3 zq^zP6uUoW?eoke6=l8zjCH|slF0>nF{Uv``cNU8A%rbu6G(F*vRM0e z5uA9H3N`>a3!jI(pgr&QK7Jm%_JDd_i4CZs6XMPf$GTcvoXw#dlTqCvcT^JU*lwqM zP7&dN5*lv^XT~Mw9l!hU#z!034A_u`R`?DH=u%8b-ar=Vc_48cT|q0{a1C~mt?Yr8 z-`hVShT)xshj-)}w>J>eNTd90C40U&mh~gJ-p$0%P;;~mB)WB)`y9cY7QCy(z-6}$}Oruw7agLOS1bxMWYxQCIJIj9;#GA&joCGHu*1_W2 z!vND5VlPBAFo1Pe#okjEw-*k6Asl+^wb!l};dgrjjwK7t^7f7E>uK6sTy%yzMe0dB z^SP$;)6h)xmhzT8bynO626h~FN z6N4UwDkH?h|I}*3?Buok_}L}#wWXLv3r-h{Z{Der-LSh(I;Qu4kl)p=KU@RhVXtyq zkJjB7sn*k2(!NZxJ!E(%6~5TE^PWnT%o_-ZfGUl_PkQ4S22l_qKvtGkD6<0FBv~zn z%13AiSX?yqRFqC_EVF?awxm9(2c3b8(?7u}>pRd42M6+9g8_DNtFY+d2>^R_^_)XB zZlz3HF-Z;?_BG{acL;l7C9jMm*;sUy2V@ZJ3Zs+nbm007o9^@2^DWi?v1cXdC(ovY!)1B6 z>Q`WCs230rWz|@xYtZrbBTO%_g_+9&0B4;Z9R1;B@KG7N@;dnj&aTpJ=vV2#8U)n~I$u7UYwb}8?^8r!Xgw0{9P zVAYlzfT#~hUWd>xA_HC>Su~tzsLm;zK0cW-J6=H4(wmR$k)Nyd;Z1Tqzlh_LK2)&7 zbVz#&E>pGBCO3%nwcnAq@iBPvjv_N#?(PSKuT#iQU-P$8M=Zo1A4$(ek`=F*f|5jl zP(`c_s{oA4GV1w=+6F4qAtatu6pTR&EQom(Q{WDO#%sODC-D#1DGM;d{DJTPr=N$T z2KQ%G1npw%&{u{k29eRes>(T>P`0}~N5@tq2>#?W-|2(T9vcN{%MoflZUUb|faK2~ zL3IJG*Xb;whL?fRBiquu>gG!0fEGY7STS=Sl<;l|Uv-y-{GEEe8{sN*mRR|hWK9UCT$AKj{^fG-M8~i-zCb%Qu9o> zpS=I)7&Sqobu#RPWq~jR2?|?F*lv6WC!8j9Il}Q~=kLE4P-#C4<%RyS9zq6KxNQtp z_?+lMfOkV5Op>%we)d)>=?KO36AS|Dj!$7@IVA+c5&gZaJhzls&WE%I&|(H^-~KFS zX!OwpeZZQyG1th{Iv$t?3t@j~#rSW8;#yDDbE%e+ljb(?9XnB4U*25)=q6sr*1*X~ z2OKU_G9gVdHJ~7B!ygx)0h%>LDd4BZcS54cO&scn*Levls8>ZAtPl3EhcLXDjEsPw zn!iEMzX4F?tN3~4-DLVRV1@>HS14U(?M6&JnjoHgc0-6_14~Be z?Oq_S6qZeQAt_=B6&EtVqL`zjWe8j@6ff!N7{29MSY>J2sZuQmiPwengHFd47&y1w zfJX~l5tI{>W5Z?!UL5~KHn^tkM5|tYj+d@4l5y|at@OKjb@WD`B6^zCo%($w7gZqz z!Uvi1JDl(?vVO*r5Q>7^zE;8&dk!7*xz;{m#VECvj;o^T-p zUHq~&SabL=@xaso2hOUbv~xSWqV)3Ns6!eSZM%pNa=hzS(=QrW#PV|6;-!H&EGp{Y zE?jwzPE;N%1i%K-PZ{q|UBa`D)F7)~PwjrJuS+BRQ(Gg+PAG2Rv%y3FhrHMmP+1I0 zV$FZ!-{-@=%Ldp<%mpiBs|%&c$6Ma7T27WE=B~o%GKRLVXD8hrLUm;>zfT`!yBb5p zEsAqnPI{ls?Fzr0Mj{c#pEi`9U7yb0F3nqWCwjPGf`Q_QKi8cqUEi6NCms^4Rs=P@ zMUBOBa(hM;&B~3zj#+aHgXOdN z8O(y4r;(^#V_52r5A&TZdCqa}*=|g6?Bj~p1nUCM5Kkz|8Ocvawedub$@Rb0PW}A2 zC)2YzD5NPk=ix29maY7f+eJ-}dT+MTJ~?k;8}8h&CLVsw=(K!D(@7cBYc7k$9+$yl z;TQgR=2yTzd2Ej1Zl1TDyD?odR}H^$xU{f^nZ_txw(K1YCku3dA|}PV8%%>27HzcO zc%pBNF34ME$Ml9|VxTHmkuF`555`?o1pZ!#XZK{pUDjTJzIL0&KncLiei9t<;44tT z0&U~+5ER~--GPAuMC3 zk4oAM=K?9AGA)>J?{h4(vnwz|Y#y^y+_&;hP;Y_xvQS@m8*B521u3x;mIQTradbpn z4gB5h{L?sy4z}(*!ha(rZO&M3uQseqZ&-aKNmY*opM8AdYsUL-D9|NZ!=Iac1Sfty z;^YPVLv1_p)riaQbHLAN6oG_%%E@eTN zHw?U{M}$$8yC*uK!5j^nqqe-0(0P2R=Zs5IM4Ak{)e-%lg=s&GGsGks)Ly>J$~<*o z&9a?2IOjC${CZ&hhNn+cR~E5f&D6e1r6?rmg-$&u(nmM^pP+E$2f%82)4<)f47Sch zBEJQ4H3Q$5Ex9%Zt<}!m`>+EyP*fE0*2(og?qJrVC_)bljw#DHvpt6a7ZX1_5&h^^ zBP@QK71WdtVs8rSjJ^e2uhM7`=!9sm6Ay_bS;+DYz0w>?UW4U(5u`Ohp;*uIgp2PU zKZuf%pF_susEb9AaIoc7*btGo#ld?7;E8;7`Us*4uaGI~*cotbLPaa=F+z0FFBzE9 zKK?a&6EW%gkOTq6tT1-anQK~fJ!Gi!LzsVvulU8FyeiE3_X=`9pGcS}GXFB3Gx+OX zrBkTDOm|I4z_QO1{VOSiN59p?!F zcXA4s8YqiX`JI&-%wsc{|cKQlY{bfE_l@LS3QVnyda3;5Nvl*lca%|*)T514KZ!@~#C*o!-Cs<%92ttLo&GQ^V`yHqeT-bIe+)x=GLJSzxVkUT;gAv@M>Ym{_ zgJNw>^BiJVhQjvCng9(-BS^KZ&}TBs?=5kV=f8ovXHU6dmlZ!fJ&65A%D6|RCc{VY zZTJ+NgdCkzYX8(5sEHj40jDW|53WKn4ono>TcMIUSQsEB10{2yFTSLPL24um0tf1+ z#Xk2c9FgV(b14X@Fnyud6G+(eZ2Y$nfem`l17UbNyf-P&vyZ)Jr82i*s(K(+a%Scm zeNfpOpQ$rIxm;YRko5U+CuQS=`7u=!!L+cMX%8kp!rZS{!apj%2q&T1&FQiqG%L51M^S880+_-W^v|nvhO16 z(CXFF>8mRjTNOq|KMTpt6WBDS&uh%c7O%7kj3w%Dq;N)srwE^+Y#Mhd&TCuS)K^@~ zyIUvd*8AyAUWH~0fa9Rmmh?~YHGBcQ1JWQ-%M#826&p#G=&|qKyFUiB#XNG+H4g$S zABXA3DqMHGScT^qrQf(4=q;7xrCq;b8R7o}Ha@jn7>CJ7Fp;297@Gn5&}Bubp@ z>{X+uW0xZtp^lYNWES7YOV|7T{`_vge|leU z*L8F2jMww|c--g9(FpB@w1ZP`FLW-okwHPx3*`r^yPT)ucWoX$?GUC|nq7I@@`lq9 zu1tP2*Q6N`ZnvIxY=Nu6Jg0VRC~Lm=BHFD9$_!Ph6@32R~^X#Bo^o`OY&4D#YU+bV%Ct!Zt|Bh z=Z1>PYzeS;BQ#P^)z3S%5S`*o@4U_bv;hBuIPbNbsR!2RonJ@8`sjApb zm=_G1kV{~B-)_7Vt(mW74zY^< z`n|5r=qcdVj#*xPqhB?$wV8g*;Fp5%QiD>64=qGPqbZYTd~7&JycnqgE#ZjN@WQn@ z?641QRgzs8$Y^sSuMC<6|k6?v=V(LQ!C$*-qcrS zt>S?Uc_BZueh2HS@R1Eh+B$_HmB8TQUvZO^>xO>>F+HsWtds$z z$;>@`MMFSP^wl++AC&=Z)_QKa_2odj)g1?;Z_RKZ1|d#13)a#LesD~_PnGy1A&2d_ zg@}TRKoO9I9T-0X$>>%)Yd`2&e?5W7XBS!y9X*CS(>qodJ_3-z*>@h6sI7<67a?XA zhIfVyMdA=L(8KVa4&1dJu@X>B0G}Ltoen_W{s_L?00>Vjfdoqu>re`b^=LmZ3`179 z4}t3pu845Q^}OfhzuF?iHWny>2(D3{3NVCqsIUA}rk3Yf>hYtYG<*t)18U83{SDfS zyRXAdyI#~R6^?Ihau2MeMi!gzCtn}VugvCzp6K0>xul$#X_3W)jTF` z7xgt_)9VjJ_ynH-%j++KKGgfZy#1<`Y-H8b`6&G#Lk8*E&*1zxb~?~HXYFNYYH(~a z>1n5S>Tt-#Tfwiyx}lhuyo$fbsuwciD1M+85i9jJkMx*sQWiYrcjTa^HD~Mo$Bu!U zDSm4SD;)4JuTRQJZPov>A)wIJ^d*REk;N!GKmuHzIp|D8WD3RyY1ynN6@UBt5I@sI zrmJ4z391AX5hU~RgVY=`4B6(90&z)&k@x4wdn|Ccs#Y7*`#sHo81D|%cUA+%2hGH( zwRs819V!4pac4^+c2$lW6N4d|x|#2;1|Gk-3B~0pq;nw1leoHL9P$$qx*xRN00Bw3 zZA>!iE~LqLklM(Yxg^qssTPx#2Oz(Vh2d0dV*b~5mI`_h-yO6|diw-aq7S>JT>ujz zq-mH&gI*BEs7m&%okg)`H|D6fn4B>quU@3H3>niMtE&!+V$1xQi-Xu9Puv&Tcgie z7dA=HK7QJ@%YF05K;XzKu|sQyVSVQOmZ?>8Q2sz)HZ{xhHI;4CKfGM@;NSEH2Tq%) zk9nyaZ1${12Z8e98E+^L<;F08n-4@~py=iRT3Mb^81b!G#HqEjw38vDMroJRt&$g7 z$vZe9Fyq_R5`9ZT!}LvLnXiU|q;%mEoUGkWE0fy%KCOUUI!_MTx87EhzpjK`ey4&3 zkQcO|NuZg=)?25~0Px*IKH~^>#V$lufCZ5~`s`h4kfB=9@!!>4}HCN^5;-m(oANc=_;LZ6xTLQTzHCfDfmaYi;k@Sy%R-MWVp zTL5YLzYH7;=3AGYIK=8`>{OX9Ood|+R~(zF&8fcfn(%UcWsN#5nh90gdCB6OKdO0z z1k%6d!UBA|!#pX`Lc!BE#u5eI{NT5DrBxa4N~_57r6wNoAh|;r2Y}KI{3f~(JZ0-r zdlZKO1$tEzMA|0wAc$*H;w1716#YVQt@Cr?0DKFW{2NP5oNNyP^l00pik(}Ve?B$G z0&$~7Yswb&P6TFCUScD77L**oRbos*JgHExP^!Z}y$spUc$E$`n zmYWPni*xRU2-nWrVdgasfpUMo-8tyq|K=`bMQuKH#Oh0gL@{NFp-e1B`dy^Bv;7T?F zbkG5G!aYt2s5c)&t?oZs4o)uHe8W+vokk`L(oC`tfP2z9{bFt%k0rESS@Z4(e;B2y zxjzZQ@BkIoRl&XkmSi8KMM?;GyaWjGzx?69UoV6|M6zHg%%vaWasuw_(LcPFiVib6 zfD1FTA`PT)=ppS)z06`e8%k7UtoVM;8sc?yl&zSbblm zW=-@Ax}g`<{|wL4M28tu^_nA+TQ`zblWW#C#`PC#m-X*!(g>$MQ@!q%XZ$&|GMLn9 zkjrAQL|!YiuYb(nt|Oq1w%w;d z)U+_|WiS1Nd?ZzpXA7^Rl|+v}&8B_Q_(g*TpZ|GygptspHOV9CC9$^PLHsmqW)HdH z8vfQ0adQGq4NV}4gxm)08c3(0{~9E=t0Yj9~n@} zr(e8G=`h%E(*8N=>@l!P)hzuYCry`9Sui%$dj8IMieA)acpq~WEtxyI#e~ZGsw;3` z1nquW!`Iabp^2^>n~B9BvmB4FzgL)*w3MdtuV3vSm5Z*|m`aXrE!zPZ!IYb&Ro)$P zzX!%sw^(1OMO+j6L99K_64YoG7d-TPVx%ZC*H1Vvc>R^f+xPP~mmHLiF6`v{Uegef zB2rd=OW*!ysTewa!;vqjJb{C0%g&56bR(dh=)#mzYIGsB)X17cZDw2j4;ZigU!T@b zrX(bu$AY07ybTVXkfmZo?ep5h0#}iuf|>Oh8|l6WT0Ta9i6WX_kFc|FWQ#$cur`{^ zn!pNmdmx=Q_qSJ3+IL-E2iu{DP(jGrZx8M$u!qkG0j6LBa{WqhO!wjtWEKdOdmvA$ zMP_*jkC9XX5ww8^;;WR%0FZY#R#p?#O{+WPu-EDkMMlu$XejW?!{fP!{)_~6%k8fL z=FNpIss-X%C4lkRhXQY4y8#4#K--4dU*_4}is(_{GVs~2<>6Klzm;YzvOsmlS}kL@v))J}+Y6RsTXmZMp9FSXOuM>aY~IzPBZ*w{!H5P)=V!b4hII@4b)KL@~RA zWcG4geYzE_uNWFE@XDvE)%elrHymg6|L83a^iDli?JTTuaCn<)*bJx81DNxh{ z6>bYuc=8LN!Zn0Sqd(r?at{3!H?AaoRivvfJwd7lCuerl{}H3e0yIPBDz z0RJNjTt|P^aUF0*Uci78v<0-~pbhzq=S@xIC@F-I&=DS}JN7IxNZ>?!GT+-7Em%sG-N&kz1(o&+z9L5-Gx(<9 zy*Z)#G~NbN7%G{?gh3F+_dmxR9wKWErrhH;H(0kXf>0`2zn}hq{w66X_}S2CC>aMjoxJDI6nY;9*et=3-eDjZlgUNWq|S@rU7YRhHAUStHPAtShKRQZV& zj_qv&gQ|PxdKJS}q}cd3RRG*BxC)`sswnJqNkc6n*CB7)GAL%suIeCr3^!wjcX?mInp6e4bE%z)-D z78N%&N1&3hek`WBWbzbow<&})LhGl2Ws?gFHGo-d=ngLpNL5l)uf=n%tCdlpa$g?Cf*Z+kyq#%hCCAjqoe!REN-!I9>c z*ogh~dpW*83G!Yt_iGzH+;uVoXEies);J=SUd7}4z2k>d$4C36cQILhZH0%sOrYXw zzVi`0c8LsjcQH-3`(_Z_k zI=N)iSybDpILdT*?By`ai0XRTc0TG{ju_%Bg#boGjLHa63-nL_6TrB@$p#^1z~&ra z1$h+!XV3ctuYLS%`PADJ!wne^oO)%o*Tl^bybg4ENEGAX`vyZt|B*MsJHGLW@WxhK zjRqgV<$8wvj64joGC?q%f+-0DuqXblL+5}sFNg=M(*aA4K?+x!t05ew(p<~@Gh#$I zu*-k6NAOfS#27nWhpGdUyVAE*v2;nK(MzqdN@Ru>lY-lLYZV|zb0C@pQVoC(L{bgb zkW>T1zwB{CTnDNLw)cBPBVx>(-4ph2?}}ULZHmfCR^ea2jj#Uf{=Ff=4{RS5uNQtq zf4$Q2CRI1vR8KpfW!NBw%V5lXIHz*yUJWXl=V5XqxuN&)LeR5 zSd9n#Ok)V5#Nh$cHU*isHw#k>Bige?xf3{12ZW_fqkJ%vz~dJqDFOUdCF42VMS8nD zkO~Jx_|p;SK`MrU%mNH>f~QSOV0b>$3yN#MPC)bMZ=1F-^9!Nh!whbQw3#~DIqsd1 zxr-6V`jUk5JmaV}fq8NlymXlH{S&tT(t`)&`LYC6L}K7uA)CDKS_58@up`12Kyrag|j(8jLsl7<9jllVHymqmGzwY)x6Iec61y z^hZYo@`QqLQ{1%Qj5W*m3?%%N473=ndJK2GIp2}+wTb#Z;?8Fua-77z#O_pq-jV85 zv)CVBUdT0QVMI{*=ij|ouUz8S*{891!Xh*^>DrmDv~$hImKZeYd`QkQ&C#6^SKg|G z_0`QKyF2pAnOb7CwvK8q_m59i%ej3PLzgIX4(+eNSGtO{2L~vN5hx>5jfDO8KKg{6 zS>I*-$%ReyX*ZAN#Liu!545z>OU_b@LM@(lsAmU+;|h@JNvG?(XQ>{n@sPKQ0_mUH zTEr0eJj`r9L!2q^u5pPItrJ~0H{|^nUz^6QQ{>~?>_XNDSBrSiu zi=hU;V&Y)`W1C(ov3W^&g?q9G?xNNl2f`=Ls)%K|u>Fx`q34es$7oZ1?gu)Yvvk{9 z)YTqcy)pGmZsG}k^!~m>-4%CD-*B1qjOs0(-O`4C`y=MY)UAZ4-)|TW>KT26dxg=V zW}*3;-@CVNT}X=*XZqv|m5OnhbCX%ty{p~j)bn`4Z`<^SKQEYtm%o~sh3D|zVv+r? zP(qg2H_ZS+5paqJm9EKo=-Y}w%#R2^l4_6qQ_k&ZHJ0pv5AFlAwGS$}J^HFoY`a&# z@j&{M`C$s{`B2lf1d^QApQSU|U0pNg^JAMj-jtiq@D*Ac~A1R?$Z&mc(Ls%6)@9n zxT(28SwzCn?}4Z1Uit8PeliPjMuM`Dv~v3QTEo>T+9RL)spyEeyTlDe&_PGp9G))3 zUi2~*4VoR@0BTGKd@5K&2#5+ zyTLH0wCj{&gS1W0)$8f2!%BrB@2DH z+!$yw*4Es9dcJ7cnwk;val}Wjgg}NsA8A>S|C3R+C~sL1f-v4f%o;AIo$ik zV7(%fBhGt*s(p*$>QS611mAjhGK*l+A&Q-}#q9x%Mup#gJpCd=OS5~;xRVS&M7YDO z;VV2!A$>=9QeZQ7fyytV9fA=!!fyt{Xdfy(iGQ%|W!MFoX@5Pj^rkTX9Q^Bv-45!Z zRiEOQk#8uLvY9H6{G%gwWpdQ-y?WrnUF#9p=p90wSnLBvPcBU`au*RgU#8uz|E=Nw z__M1pA(QLe)cYFUaVMrE(q-LC(VmO>=O|OLjNDo=;`QUa>zCHJy)G@d<#fgyx;eSk-(e zf=S+hZnYvEl+RqyRTH z+iO8@0xWv}sX9d>>x~fM2cZ49hBIB&>LO}hJeuvhp1g7TPGt8|bL^J2V9KOdl1b5- zW2*Z(=IJr~l*IpD=fbhD%C9?O%L$ADYV{WE`_tN3N0 z{?P*LdUk;fNX$0E6vo45Zk_yHbsZ^Jwk%L1Y4{_IAZA}yufgot3T|xU9iPs2iOycYKMxIcH-J; z(H}s;tXA5jrzAtZrd*hc+6!yYSK!AB0>CmS3sKICfcL6P2SRNjiWWwA=y|=s$pJc!v7-J5;F%Z;4DToNERID0-Zb%Q{_P9A z^$sQOL(uB?5w6wz)Q6V{Ow=K>tJ;sLngb@?o)tBAbv*g7t7dfvvbtv^`5F9 zs*^J{5nrvjBj3ti7l1k)7?lP$Xdl+Xuqqmq4T$a+(fhNySidp4JTq6a)~R^m;G5yA zGzr-_=kg7WMCjLW`WqO4h?&z;?xZzocYtVPz!u-E&CX!Z#)i8<>MkueyI@+l}pL&TN~r!oc#2S_VP;Pd>D+ ztn{_mZT<4X12#dzZ4hdvB(9b)pLr*F`QKFua6UUpe^7|P#uOt4d5(~LsUrI%PJsr_ zp5wyrN}y_>NDWC!UurkQeMrTF(#><82xQYHToI5DA=3q#nJ(m<0L_dBOs$I?6sAnh zbA9tr1^xS-qq1C!j@MD?-@>}~E;Dhj@B`Ab>l%a?Gk?x|+z8(Ks@K;riL1GK+w#20 z)+Tk$4;J7bFWCo4*4NvJY*F)GFGv0Zh$9_8mg37CBEt2Os!PJGeEdohuDV)ro69x) zYt|(&@5y_STtD8K6EX4>Ft=$*uC7%KT?W6#EYe>><$`#%(~-Y z)w|AO8hw5R>;4n$cM|`mOBqu8)E=lInWP#@LREr?vjbjvUqCE1+uEF9!fpk%z9h3t zYnj*dP7+%F-d%1xJy=eicDwYD+LK}v#V%zh{uVN;r*iFEyKBwPxj?1JKOk&CPpZ_6 zOCLq5k4r=xIKPv9!I0*J{3Hm_2MB!_mv#X{HaZzqjD;)Jns-kU>1{p|#^VcZ0=$(Q zijTqJ7u%h_i8%ZAj5|?V`|G<}n87fHq&)SKSHtV@_&_dD;O;>Zd#NkGL^1SW*b@#f z72XP|4E2Nv#nM}lfOkHwi~5_oHUY>ux5sq$(oTWIq5Jcl0!Zgdb_h3x{loSAiiy$z z=cL#>Q-?3nPsOTQ>EsC3S0ve>16-PfMH6Vl^!)VY&225#hs8Ww_44f-ud&>hs1Mym z39TysY&1iQFh=JEYC(gJwOT~ijo%I?8KK!!r<-4s@1wf_hk}}!pdIZI0lYbqzlWIS zBmS&U;tZRM)3PmD?vv$C1QwL{rTO~%c?pM>b$^+GC@327l$4)-X&HwS1LT$lAn9;Y z5FT7Aro`)aIXU(y@tXZ3(}Mj0k$>nGjUe{Fsd`7@;(ETRtcPv<5h=;DQsB70`^+-* zpe#1Xz~m>UgyGUD(dUHj;K0Z+{d-5czTAJ{Q8il$nyo@YVdy`xYYG^~2Nz@)Dj$Ut zqRLrq9r#~hEuWUH34c_QsJa~|E}#`it@IoA9-j;Y8X^J3D2IjQlA}OyBgSBC0#c@D zff5FtCQ#t=7jd||NvKDJsgPpDTs(d}0tL*|lL?UKc@JzU)}0kWpM9@2u7{XlEpbVA z<(5Uw$AvKH2J8e!YNAXAfy?Hu^k`Evof~dx|CtVt0{NoDCQge*`4H154T!Vwb}|eD z^ooEoMD5j`ET|P>d}>&=e&?)JZ(ZvFMI^NO{-!cDHqlh{xzs{TO4JJXy{p_>xmf+J zqjta6H@uEI7R0J8)^%r4oxVCR986twKC)kT<%9$FUAa2v#U;BygO122ljrJIZtK^# zj&GjZ=*jT;AoJs-8NJdaM%oGxE#`m(oVuSTT#k+>L#(^CCaN(QMP z*VQEcVNPNMIHL{V$7xOn3-L!G38Tt)>z<uR6*--f< ziV6{p#`_NZW|2|QKlf8{DB_P^z39^LIq@Q(m3HPZ2st*5lkORG=>b;sO4N^S$iMdw z?Zr#y8;!5H_a@Dcc;AKCl)^V$I*Db^#{@$n=iG7|9IqPA-5Rh7d$lqVd5n5Kc;9{{ zG2gA@>jBLzE(6lzztUZC2ZfF25^VVIMS~!GoDR5yc_dXD&^ici;6{ANP>NNpA^Trg zAO4y>joJLy%iQVtXfeJ2(V arbR1e<){6jA5KkGo?W{jaGQBzal?|v+h_n&rqSS zEfb_krI3c8E@tdO+wS4<ZjPJ$mfH-OVLf-BH$ojM3=7Zu5uG^(lS^KGVUGLV`NwZ$e(rAQ z=7^pjHFCs6g4#WP{DQnY=hYSmTWT_U62wu6I&mN>H0~~t*3U*ofen`)@-=X2+SBO} z^3|IDvsTl@8YEG7Sk&e*KhEfEIESp3MX81V%vl=$C*?unxZWxxvD5bAH(4uAF#|@f!*8g9X^NXTFDuo!VAX z1YBcI<~|*eX18GO-gZM)A~dl!lNN+b*>E
      {M-oYSXHW|}Q!<{cqH-!HgvK)#>Ya2(clo&0O?$Mt-_FjNo zXAu`J6kaAz+U$j=G?z&y^c-(AcA|XEFMM^q%=JorBK@9l^lZA{4E0SLi-9b|a3!U0 z-tFL5=gP&6#n#|$?1bHkP?&k*CGtQmqhCDF-kyGBnPxN9&P%`fXCNkc@O%?rYM*HB z1B0{sw@(E{*z}3F56`$y=c!UvWBRM&ovl2Ja91tfCCq<^c5jLPSgqT-q5Sfx?_Ql= zN?*KQlbRlacinrkdhOlAcXQk3Yr&`V#iVHT-)s4g_QqC^Z(-{HvP;bN!JY28OTgZf z(D3#Z34M}DxOK@5_v=Grv<0u8v84};eW_KUKU{xbN9U(+8&%A6v2bF!cNJCafaWvV z&g1Ln=K3wC5!S|YL=kiP;RaXO)DHU6BGKU_ z|8(0XQ5BCnS3~O5rVu~BBbhmzykexX?{;?mPS`fgac)MZ28qWhj#7+GaSwD5tT#xV zhLt3<=<^0x;TuSV>4$fCoFNf>u+bx#ky0gK#j}qo5MuTE@kf|7ymQ95&PG`&VasW@ zs{KSD{I;~~M9s7F*QAqm^u$H>!*8?%yux+UbmqeeK=aW!Fgyr_U#MBV{bU0O3?)Xl;4#xI^o;Q zvl|IqE1&8+UUe(LjNA+Y=TN6+j7pLZWVaHzar!$><+G+dfp1ote<$;<1;$nLK@GO} zhQD&buSs9-lzI`;MW6I_I-3BKV}4WS%bCEYcP)0kH88eGU~A>nvXS%3cy#EH( zN)Ejk=4dhbF$->5(!$y)F%A#dGN|uwnjfuYX*w?&(mOsmsn*bn#>21c6sUS>I1jP& zwftu-C$+b0w>J@aK3r4W28sxJ+urv@9v)YocT)fgG;>ADE8z`EzYFOJ;4-_!!w9lg z;50Lvp3W45ktnwQ1i!4Bvuc#kB;A~RrDcB_6H84xllc!*bKDzw@A}&@&qOZFCrAZu z>CL893C?q7qFrwf!(jA0Xz4QA?4@nLt)UOH)$(sv^1{n@v0FVuz>~F z{l%U$*Av+~8h%QY*1lcvdOMyTsi^o}jSq~VdgF&H@Lc2R9g$jx5fPhy_n-zDE(WV~ z(spFHaW6+~S^L7RyFKNcI+NmW`n?SkT6PmD(!xuqNbE{twuC1l0Y`B}3~fx~kaeNA z1ia`}o)u`+$&6?1p^(~Cm759~d+i@%4>Q^a@d@I?Idp2T`H9O;vBlxxpTK8CJRVBXNEs;y^ zm&K-2=%$1s)l{&JWwRAp75UF~XYOsqnqF$3ev~G|&Y1uBCcztIcuT_X;LltaK`Akf>k%r6JfcwdPxiI=QhqJuH*)9?FyHW zT2pZFpIdaEOr{gCyf<_#k>WUhS4ckJ1bMk5a=OvJ3PLI<651;V226vg<69H0Ais~w zxbce|epCIq96uk5u|zFK^_{ag8|K;f@^PkV?`H7S{@jyN5)3* zM3>Mls}g5}+qBV0)9_m&t}h-=j?zPxv-z6kCaHWA@x!nv zbJt(jkaymde3q&6dwtqi{8&T<5XXOcE!H;|tW?ZKj|P0=73YJ-s1UB^;*iEOhmJSQ zm{x9)g2VU=^6v~%j8W1vd$-z)<#pZnwOam321W7u`<9P<^_cX+975yxSBr0(?oI>2VK!GBuEfD74oZ3!v*6;AtedDmd0Szg=N%-NlNp|p((K)6V#tz%Ak0w4| z&pX|sn2BimEFdoXg4{YpUy=u*R(a>25!zv@&d{MHMF4q+OWuH7DQL2YVziGof#>adNB&ZtiQE1~cyu5X zrVKEoV>ewVatl&tgZ{EnApKmCw5_L0+6~l?sm^FzNWTz2oVk}8RH*~^V+Uj_5m_|@ zgo&)QNFPE&Cp%1cnG?#-JoQcFM|jp=E8FE+|6lXiCsU9UaDMTVt9_gk;i10VpRAS6 zy{-&qXm)b=J^ZbFD!eU_r$%|S9kZ$rAyLRFa_Atl~BqTb}Wzwh#R^G2xP)v0?2#wo< za&jm-t!iyW**aC<9t>+DC9i2$p*#%^QmsWb(s>^im+%iqvTvrNWy6SiTXJHYTPo zde^vPyWN=&7ynTWQfS)KH4eR`spI@I5d+4t=!cIl0*ly#^x!g&68{S zSub7__Eu5YW9FL9FK(3Pe0d*(F;3)KG>=<(53x!wDP!)4ZQ7gQoAP9u3S*+JpB|o> z?2K44BG~3CSEx}xI%ozLK79YJ{YqS+3N27;`UCa6UC(20{GdYAPyY^kknZcGDV4O} ztu=27=PvtUd!PgcCswFaSoA&+LO$%^i{mI5keuz%t%zp1aMmC3EwM${V-9lao|i=> zm)xSh)wfD6GGt6(Uwb_mQk1NFT37y{fu%1wwyLQ(?O}DCo`2`+0?TIZW5M9AjAaTK z-5^eVTZJ)8Ef}&wu|n zk9_E|K%LE)>;;7>h|#alJ{I{D z4=aGQaPAm+6vN4Z-gT*!b54_~1KlsfZar4Esj}vR zMewi-RA;ff|0DRSKO>nIoDJfUn7R$((;}3i3`*_W@6rv1ys67iUdiUHE#w!FW3xz8|Z%C!AfOZ4Wp(xn>*aOn!trcaI2F# zybIf!yDxJJj=3M7LYD8Txo>c4RgS%hc+r#*&PL~&C>>D8EGia7Uo~YWp7xI}W&1{^ zyDIw5tgw~~yD_s6b{(}p8?f<*g+*&;6}w(lje1zwaL4HpR#!#uAMZb^cbbH{`PcIg zHpwf26Uzr*Y@sreb@aP8Zaup*ROg_^=$E?x==xph<4@LuyRrI1-}KhPSNhUS?7&zR zB8LV+Uq%8{sf>u+5ah{R4I<&*uZj^+Mn9Qqd4AAMFF<^ovK+-4*q zb)n?&(%y{cE$}sC$gG_))wnRO2p|gK8b(j6QxiZVz=cHYI1E7WI45$wYKd9!&YXM& zg^U3|fDmGhW6qK0v7|}bqxi8`R{y(hT>^FY!{dX~D6|_dx9eb~m^rh|ysZ)3k@q3J} z(*l!Xvn4AXSDUVjGi6Hm-i5|C_CEhlzbO4I>1x1kYO)d$8)kCpr*Lx3v;*XuLm7UQ?1!H>ipBqOl(srTf}vD?p?(C!gZQyBG(dHt>AFA z2}=*4r_Z8vuM-%5W~4sHEUNPOfkFpy#5W;<*WeyQta+v6i#v&O`9$^K!Su zk$p3_3Y&GrsZyU$ym_ERbGT9oFf3#5@M<5I)IAjMauk+vT7x+W^J6d6yplCE?eN|3 zUedetUe*hbct+w$6u7&Jdi+4%?= z>6j-;*t&!5TZgAfU;ave;u~%!qGP4EHAr6NU$n9!4nN^2p zRxXF%s?#tidmqu~RWUyyyKF*zVvrav`AsirSfy_($zQ4&Xp5;VDDk{-Je7>{3>l3~ zgI`&VOb$05>4G#l>mS}2W0Hbt%z|0DiBikh(78hs&ya&(b_RB& zPR_7d>goLJiFn*->L|HxRN4uE)TI~pf3`>8`lEHkVb?yqdk$Bb;2kiwGDDF%H5Q03 zF9f1en|_ol3Mj*XgzlZ=$&^tyERa}Lw{t5ZTyQm0LrUD*O*mO!ot3LPmh{Qj z80e$CXLO-Emh;p%v>i3zTxmXN@RpjzlIVHRlC+Rak3fQ?(9&VYi)lhLg0&IGR^$@C~0ngxS`)J z{gc88cZ{#svDiPBdD0WM>`?DM7MjM!97_a?Ik91Kri(GTzAuHi z4}NVk3Bkyl&*LTCx1OZQC@Ac%(hJ?~C>McHp=)q|I1+kFD6~H(MfcCc6cJk6!xY{B zBw*<0@D~?v%jgBZSs<#mb=uV;%F2AxxgMrqLul(iHWq!oEv^X}MFWqqu1XtAyCA{| z%MQcJpz^K&oBT~h_ze7}B3T>3pe&^30nff0^7A>ou@ULd1L#}aW3Te3EnKH_E zQ3Tu8wlg&+f}V`#WG1{(eX3;nsT=K%@T{+lk%?oG@4YDycU$+*114+shpDMceaU{dBRFEy^zn<2)HECHsrzM&_NOh`!<3)gGhM3JMq^w+P>D`+_8{zGw99k&p16Bm zpL^ltOkBRR7Ov#u z9Gw*wAbug;;Cs=7e?`W-iWRp}N7_1* z#Y7}R*HG8CS5I1FYfK~ok3;`N$6m<{A(^3GVHb#4=c^roM=DV3Xf7ZQtShb*%wv5l z_PJcK`m!kwbma>~+g7;3(L(S?$pN_K&sdfSdUmgGcO_tWe^BO(QYmdY$sL;14@XXQ z5##ZxdVW%;wCqhl)4tOx`#-WrEl+KdnX6GJYg)US5TfhfS*!e#h7gjbL2g%(!>ij~ z^r`^jA5&XxHvzf^LoBY%6)LzU!Oyjalo-~OcP-XFsjd;1kl3)af@833kV>+Q)CST% zNx?bK7}lUGQqEE5P1A_mJuKj*`SOfx^!6Y;OBxzvqF2~lAQ{Q|@ZNXdx{KLKy^sDt z4TpL!u1>ruz9RKqq*4ohLK022VPl8rQ#FqW4S;K7#9*BLY)t#AFYpc)An)U~`uFx| z3xlZlh2`2zF7xIa0fr`a8^2%PN;=_nX`5te?S=PMOS|DJVV?bEn=;&AlqMhATYG+F zDl`#p{fsFAH`wXrw5QQX+cO7-me})1gz?KaZCHV>tC?T(nfy2&I{4glIL!l}Bn7iJ zCyB;V-43en&a~F;t!v7cl$btz&nCZgYOHOFT1b5Sq0i&|R1wxSw#%}-s%?C8v-BDB zCGD!$>;=~Cm$rZ6r0m!toImwMH&AxTX%*Gts@J0CX1unkgz8jzVC(=MOfAA zmbyyUQz_|Y0Xqi7X$PQfHe6fAIJGGsuGXI86~S|;2y65v$56V&&#&P{EE`n27He82 z{jSEex4n~F6OM{2=6X`wS@F@_YcD4ML)iIOSXRs42eWaUu%QP%W!H-%bGtSk7gSM< zwInT8_ebRRd4Lnm;VsjfMuxtcaAnyi%naRkue}{B9t=2pJw|m3sxy$uq|eurCkf*_7fT_}1C`m5=<@xS zgH(7IP(`Oc3q+|xNM`ktu)jpxF9i)F zw9|(VLv3s*n8RJ>a(6|9*CPH0pWJSg4|7Zxq?bzxS0K@pBamrlVeQ`g%hr&4wQimP z4fZ3S#ox$Y8zLmZRY*0$!hkD(I7IqJFvS>hO)j<@(z5mfjUhk9+_GlP3MzijGA7^< z$z=8L4lW1Wj|c>CFW7<{N$0mFugOo<<1$bGv1^NS{6T)!O=oce5b3}!J*`R z94H%Q|9V%S>N!{IsdAG68NE@!nx7(VaS-XJZ>VJ3>nxpr9l;HLj=nlJW>(GK6F?V^ z75;+90qd~r(MCw6l-wdvjKfgKqa87wlPm&=^r&<$A_6rHw<2{~1-Ar(rS4=M1onq( z0vA#FJ6fg!N6(iTA!*losGS>#7^&hav1b668% zp82LxkmF5C)D}^hMIW)G1XvkMR^SXdE`{@WgZm{uxow0u!8t}@3KL~w#*{W*^@33# zvKYt3FPue;@@iY|@>Pw&!Eeh=p470cyT9-NdV<@N&-$le9ZO4cG`XhBlJJhNm+et@s z)8gnTxgrkpE~mhKdgpZzW0F9F^9+oM+kjLM)P^IuVi+EmS!?|qT3gcGDK|=S6X2mB ze*;{SYWNAvBDjyy+?04)Uc>oS{5U0Gk$x_KND6Z#nN^BCNOl>JeGcT2D)mn3Coao4 zffZfc8b}*z`aZAS0$gDJG@4CV%4kXa5}M{Zfka44D(s?b*wf7fmfyqun&E!YIGOAw zp@X0?aqBD-UJ1dNl@h}r~`|a+EV?R$Vk~C&zPieaU zZf@(i^J+-J+fAyYHBU%&ahsEepAA)U4@KJB*A|9Y9<{h~Tl%~1mKNF?K-)Qm5%@bg zsVaS$egj(T46QYYenO7xTF%1-?Annsunmjp@@X;%{gx9?eFXe-v%64RyR9rZtR4K3 zjH2lX2sfo_Blz(>5!v6&cWx4^`i?h@Ug9~tdC>UGm7NKD>%p8f=F>kQTI6EWC zpaYV-kK{cVLxB$BOpfH%D+-aQ|M$pq_ zp@@kd9O!je@~gqa%Zj}{K_z$0C}66^eQ?C-Gn@I$u$V`HAj8%I0aLJ?QDXm z61$sf7Df!W`qbUUvqDEQU$FiE`$^=`1(E#x{9Fq)Go~Zk(;D*2XM{->e;x67BY#g|c})@<)J91Q4c{*i0=2jErqfF$g=M#Mf$@i|ulf~aB-gzeIX z+D-|H&OS={4)!kB{JrT-;v9x)$I*er!UX(x4i2|(DnbUpif{`<1%Nl@FL7(CSYIUr zyaQa81WvhG{aTrXQ;bHba=N!IKQr~7HI%ma{S$d~db!|_)}w-H$Y^qZ!bBRE6sQ}1 z`bSM&4x2zkF&7g*M;0>JFm4%xW@?M8mMUWtKo^g?xR`Qy$dRLNSS$#imR8&%=mC;< z7tIx)z1QKJCMeRz;Fg;f(Sqd-BHF(V(*JLBK1ni}7tjNo8dUq?L}$fnJgS zqQDc?`V+0z&klnCzoIzI?-e_Lv-n@O8hg0_)Z)F9(~!8hz8)^QReh?^ST$d?&Ryr* zykml2yVRi5M73N|i;2X?zLtL-PmB%nxAVil1?7FKZDoMR_2n}rH{C}w#l_qof{$e@)t3+T*vsKSxCK% zk%n?KaF@jN)g`4cgA-z#2l%h4^3qDga?m^($Ms!G3+U0hHBFut18EP}gz}e>2;G4; zZN#8*(tqMG*H@p<*4Y2KaS9si!Z;27+OKwBxdZLG zZu5WL-bVe&2$j+G(?#Cp8%gJ4=ZE?z#X%gNjv`2Dbp*d+1M_J=t5Y0Vkv_6D1o;@` zlcU$0!Ys!CUDHn%At}H|rW#IlZ6`d?Mo3oSxvqZ-`G!V`44ZA@ah}ml)-GSoG#rLm zc2MeLXxf!>3Yd`hqoFA~?4&d`*;rT&8tz?gQMYn-VZZ)Sos$*|go@{m3B>`%SRRHTfq2>k0%Rc4miIO39E->H^t47BrLB zg}>e;8}=StfzN8I5NUKTh^zpiyS)>_*>vgfjy?{C`DD0$g#f~2a%F3ZJqa7QW3kI7{B zMxKaU!gNiOFxs}YHO(&enSL@3v;qIGVbqlYFzDM%Sa!d$`~A$Iu!{Mc%b|k|tCumY z?Sao7L=LH@5(I8}p5J&SZ3pyT5OEr4q0K=oae#pa4}9Gzf%f zTi4b!pzGs{@UsT=0C1bg-qgL_ebg;{(V%|%wSY$B!2j;tEg+&6#vkR(93yphnSzc# z8N1MiLAChOaBm^QzO*%!S}O4Cw;D@Zb9H+CEldOlzj6s4*LNihfW5XAbmj`4>u8af z993x^)~*}S8L)lRTg{l+xue9}|5o%npajqaKdF&)EvV+G#w(Q;Nf^Ii7I6j~h3RSh z{Q^hb`Sj5U6Ik!oBK`DY-eq*0bOkSVIRT%NL5VdTr~YIj!pDd-ut+kwxctvEbH}!J z!8N=V{TjqIXYbcX9*8r_Z&#%KJ)BMLQKvv znd5Oj;y_n!5s1<~K6<2nZw3L56!P68?gY$88EefV(zyZw*6DbN`{WXi`UD0DDk%$Y zg{>;DnSpZ;3#%@`Qivii$iR`q{OcbeRLJKW#Q&zrzNGTBzhdjaf%PP$B2G#irj*!e zA9-$$f%KCv^`Ai=RV7~r4oxX9{QKb-(zM<)6DpJVY#B<(o6;PLRJfMWN&mwGXK|0Y;sFq-!l1IDU`8gft}=X*&~6yqm7_c zm{3%EBB%rFQY=V9*GJCJZc)&?1%eU2ST^jfUP+6cY~njcM#Ep}g_1|-bac!gJ-~;c z-AtDmt6Hczru#?0t(laFNIJerv>hlJ?^&NmgJ<*{4iL#zq6@PgXymt!J^(8byKrr( zeTVw&v1u~?zR|uO;$l8HYcIa~tS*Zh(|&Y*jB~opWvj=|%i-cHi>|iBhbgHwZJi2G z5Ncuk)%3oj;@VRz?9vI8p^^o8mJz@%vAFl6+~my}=7YL%-!!HNt1iFNYX8=>quqJm ztnzobBsPz~=5PLUD(k*rZ7T~iTd|#OXL9(DT*<=QP5k~TD*%NXaKw7Kq;r`ipo|k4 z(#F+Topo524}_ToqKd_Ef>)hcz>q?9uFe=-iW)2DR2RbVv^70#D}yKF;Vvqme~?cT z?{1xUNxb^B1N$g4b6@R<;XG|?=(4JHRyrA28eZm2b=9$fS6i2|*vdv4FjPq=gDrLh zNS@`Sq~5a!K?kU@{}OSIxen89DZ;JyU!IEfNE>>%Hp{Y!uF(_mD#f4 zD+`62x34Oeyh#R3|7q07nao(DS6C>b`jpUok*y-U1Uxj;Ld=8ba9WR+*#|G$6)3Qj zM~Sn5`dKKzuY>^oj@K0$+}!X>QaAsJ-ZQDl%X>4@YhiB)MaQ&B$(Ng+D#az-AIs}L z$cxDi{8f|uNerect)W1Llm$g~5_2F>HMd!@qij?U|2w2}+O_MB+70VsP!(xjm$4ZK zmt|gSV}uuwik{(eN;v7?LQs_NQ@Wdz`9m>2&=F~}N!t^C(|8`w(&tk< zIjsMXXEl`VeLzt>YgsQ=DCgC7G0@RUeQf06?U4Vo zfnB06LVYmRDr#9##f~7kGXn7B;uhowM^^f`Fn-YpJSYEg*zrLvge1VMd?#~Ko?K*B z?a`9Lh{Mo;;iSQz+W*N1Bq%$~@Pih09l#nEBtk@GWR{>HWR!2=bM$0ih)%bmQQUor z6ypnK;v}%#M+s*OuVmVQfgf0xW5S(FM8md`iob+tp^+QzRoum34QSWXQ|!i zj>Z)7fNeG+H*X~FqvJ!db2M&+j3T_x6n~CFO*RQ9d^*`>8FezPK}Bxq)uKGTtS0)4 z<>0xl>pA;*t(FU~UcY%o5>}OlZxNVvOY8s1-`!m(eYrO6_hEZL^22sj(TC@^RDSOS z7-%CSb>s{ARZEPGnx@nbyqjmv@XV_{DDoLDnuwY)`TZ#Z_IS3#z)zn6YMAG|`{k=u zfa|wA^*aN)+L|8=tbH1R;6z77Qx#$)a(4Y==I7!Y5!i}=TNj)g&*WD$s^Tjekwr~m znB$M7ZhfJ*txsKK$KMMB0746ftlRgt_OBdV6Meq%Wp{l36{)xk29ha%eyjKsIs7NE zOCncmW6L(c>w*_#rK^(zDYrL5Jo%Ri)FH_AbB@&f#`w4{IR(;|2q5VKFcPsk z08X=?V;cSwJ^hau;*5e-P)bgPp@>IE%ly%S@&aO-GB`t;@7284f9u}cXIUPkd1EUs z7`WE7W(Gs>l0xX%43#Yl4R~ztwV&@dgd^4qL=OT%X&OT7?e<>1^;E*!W+-Fe#|C<` z2M7pKQ|F_Co1n6JkC(p1-X355l7g|XrP&`lF|Z_9Xg%~rId>7A$OM&80-iDizEaED zQF6(s@PNXjxW7_+cPP5aQtWUAXTMf>-D~pYrGWpa!ytWE4Lx>0#ve_XZ04KTOYqz6 zRGF*LSt-55RXcRo`azWxJhnQ${%_^{-iOBt*7Q$>**SN71|BGn@JVh=b_ESnbvQDS){OpCPj* zB+3D9FIp3!etVgicY%)uM3$KuPlNYx_U8iNdq8rh9H5*KfN}yuu0$NSI4rqGYq~}x z@U%FLd$wEx7DodV=MCO}Tz`QmDUx{(tp>bd&wzABVerUswqqs^lkm8j>9jFm6Lyni z#s`>)8F*R{%Ftr9&Lak#18On;mzzrPk|Dw8^tKL;E8cP%_Me9PPNp#Dj5w*_PvEKD zIu%#6CRgmFD$5R|?w;x?4m7-=(7U!TdxJ#4D%egDKddWW%CF8n*xBI>+lv4A!F~L$ zcI~(zVz6za(pLH|U5i2f0l!|*KLs2h( zS^1O{MQ<<|n38mV88!~pwvEE$*Qm3S~(rcfr>HBoClHD?f7<@m&nFv)190 zHo&AgtTRAj#i)XRgARd2In^omk5u zQI)!5f_U%mM+$g@Rf_hyr#$8!lLG5bF7$N8tC0cI}=0?ryKv z#rS}n?9Ybp6of~Hd$S&j z`|S-Mwln=wm!bCh{f}xsN|~AqFFhaP*YWp}WGn&gI#ZMrzh973>Dln;C++LOcH5H% z=p*c)hOyJ4w}gj8QLhK&teo~UU{GU-`}%6hd7!02_K(4KpDqpZ1H>T$>Xd6RCSB*_ zy!fr z&hUP^XF$$m`}?`)uA~Ak1tzWD%3#yU#+mpXLmZd$SxU4&wvNRR<1~_$5F$ zpcjZC52}@|#cZ8zd8^9fMP0MbT~5&_yJby6=)5pDg%GxCb5e`q&*av|)TBF&#D zDL&Edbk44t-r(5kM)dXUr1dc+B8KMgrehNsU5HrEU{{t?d(N9A-q zalX3#?@xjAuZ1YH>!IA0JeZ76r5sd`C<*6br_$)f{RctidS*6}pJESIzn-~Sx5^&* ze!+VuZ1{RWS|8eX_}orbU+jHOxj%}`h9ktU!`mtJ$CJGrlIgCz6(>k)6^na=?9vSQ z_cV`uOd5g~C4oV^lCEkUC>HN>8<2=v3rq|Kc|l0n%->>lrf#!Qt&pu*O?sS?jiyEci-_VJxD zkHvKFZ?A`PV>}Gxmym~|`iJ@BlWglY!>b~_RY|19b25^jwUD&Vy`cy~Dow3yd*@8F z)Ffqj<&TK0hJrMM>9)G_VL#!f4e|3gbZj^>ZTKBs3eq8hD=g#<5%xqr9k1C`TAB!m z?fnu->NAtI-gqzKl8Eyxj>r#sYj7NiuvhJO$P?V6>~XW~Mc}2j*dz?L3<3znb~gv& zDzB3Ip#7nN=bV$MWcmeWcC6t2i`*3ASF4Q~Hq6{EI4d9ZTBTY{a|$7ydZF(m^WCd42DLj>}wtMXF}GreaYG4hCZFm(!-q5*9MrqB%)EbQHoh}L zu57%E;B?g2&xfP(&OnFJGI5p~QCKfV8t9uT^;?Vej6cz?7tHjx zIlvs5Yy#$7tzLN)h-LK2BVFKaX*65=jKBYoR>8SQsUAX2I`5;R(l>-B_ihBnW&em& zcP0B3XarXJnB=K~YvU!=X8ZE1ieFg&GSL}+oI*VL?#kycJ+Qk=C8g?7ZHV9R{y6wY zIul=_LX9gL@$8bMOizpS`o*7!M^6LerKhtN>5>644!s2S8FrG11m^O&+-UVf4ss+E&NQ^ z^_*p_lOj;Lop+Tc*Pm8%so&c)3RSk-4viS|JiEXBPbfgD*}1*zd;jeyR-~{b;iqV>)E z>NknCdR2L(d~vhiKF4p(03L~g`m38#MOQC1>?)V;JNsnyHKQ=ol3IODnPPwT;HD1p z%qUs#Z_ne0-k44yFNenRuKuHQqgv^8gw1s2=ajvh)>mbp+6b#ygJ2Xd>q~lgF1`@` zACvu6kIe5*zT|0L=!}$f3`|{NbGuZ%HAPV&i;hNg zFi=izJzx!%x^%eqX0jh+(`dYV!TO{QVk?l~)H7)!+uiAkMu+5Y6c|QCwP|R7F{pgH zIweUOrbbdpzNK8Hr?vFu;VcE-P9j&0U`da@ZsngyO7n&zlb}oxwK&1;?B}q#H<~X7 z>B0YAoYuRxhMas;uM`1o*J{ESQ!EdP^bDRCtccQ`PY$2|#Zi#*b2>5@ul0qh)#=c* zDx$Z}VbI;=_$rLTBI~po@>)70{H6cETleUlcBum(eCj#(CfWatxTXQ;W6JwxgS*`5 zeM7fp%mPzK(w16wOd*Ino5p1RPbs6N0W?P}1VeMA$goIqy?<8)b=tDCHf2})89u-{>>j@7rOWn=TQN~?=Iv`+Kw?GfU@MN*;AkRQjQ$_PA zV|tpg#OUN=`Zl23*CG+DAkE4js0}lBZ;?9FvePK!^MH-G0#a9fUVScw-&FN^WuXHI z8zNCT=J`J`b47*V!Jvzu1k!)~PJcY|l7X0pV0#d2vviLJQf)G_fO`x`6FYE#*dQuj zN#s%%wLB$MRRJ>kk$Q*@U)Mz3#NQe)wGx?z0EtOkqB0DSBi64z%h%XHqkwCGOKQ=M z9S>6?`jwu;6)iwVk)JT0ej?cuHFLYh%}io^|L28z>f@^)?o2~1$BOqtB=+m~;XA*w z*XK2tU>JCHQTC8Y*5~5)@D>(p|JwU-w3HOR;d;(sgmp~wSm-&VW(SAd?BgB37o$Z5 zHhK^2e^FFG#wJN0MdH}K4CO1@@{-u^e$O>if4I5l7B>H0;HK80>aDQ}!|66DPe2Zs zmer!3)t#jec^Bsnt~lQ~Uu)24SdqNj@lPt^9?x4!xN&u~WQj?q+27A!c6-wMN*zNd zRElpXke)`6ulFgJ6tCxzUj$)1Cch?{b6A70242p2`#NGS6xy$$zAeR^M0tZB%prvj)H@bE`I=NeQ02jvN{oG$C%71I zS36Jxd(i)4vhk9bUo`&b_;>Jo1g|l+sq|=aTkS{0nY6z@f3lD}=l^;Kg!u9J?o`&k z{QF}Xe&*rikIVR98_xFzo2I?zR~P?#9r1+gZSyvV;`R^R6;@0M$UfwpErJc~I2M&i ztl-OJx#)xVTGEwM&Qj})Sbm)eQ7h6l2{mJ8DM2=1W;Z5I4W~(ph9^}#?@6b>NNbKL z`Z>Ou$H1dstNSZylh+XxzMT#(A^DRRf1RF`-TJlf({kB zOK0x93taLQFWe)PDeCOh&k?D#{URx6GlRXR)B9WZB<4wzQN{*)RL_m}mHK|obiT5o zZhRLV1d5tll7^QafEJDC$@}*~1D#I`=N8J&(`b)pbSDpKn4O)vssLBFM_T8Z+4b0* z9TT{sa`+Jw1nbH1AB70IgX?T-a_m0mH;}U^6&$sL*jallx-qU7IZujS>7e(~4<;Ya z7n(ole`Et2$Uk9zTkEQLe1}9E%e(sn=xyu0>j&H6OY3KT6Uh%B;tjv|%Q>fC?iB(N zfrI^8AYPj%Hrz?pw8JPHqiKD7Xo*Vp)_$ zJ{Z4&;Vd};S2!y|Bj%NvdqG#-Ql65eJ$`nXNcydBO?G$;B54rrJTr@vmMzaFB8t^#iRIIw)D7 z?<>Xg$8)_U9OMmZHR}^q`&$GcZE{6t!*`;7+uhgjw|=62J9<8}?x$YFcm-2!GL|+9 z6CO%xJbjn^ta0OV@r9k>DC_7@cb1-lDg%ED5DFCiI~s?2v$87j)W4N}qJ+JfPhn>3 zv=keoYxFB2#JfqShScJJrypy6*=5gs#pKLI=g4JUKJ3-JK8RKM?{=LXRw=1l#bSjQ z{bY4vX+$#sB83skl!GA53>&5Ny1=-d=3?&pi9pBHzlD?ORequKMRMm~7SiUwgPW>J5M9GSTJS zWawD@*Q#Mx<@w+AvakQi@Vf^!oz3~XRc{H816bWbvCX}##<^6_Hovlna4xfx9{I>LKtF{Z44#bAeAM{Bt#1-MKzHq6q>O_cCwE>Ntv>g&`x4x z*D!@F)g6T}L&zQ>>+ig}pYQkk+x~g}xt~|B`<|}r`kbHhIF9$>!g}G5W>%Q#?WJNg zPMgy>Cg_#3iu*m-zQgcAXov@QqQu$5G0OOSH8FOq0QJdwMosTwA97c+mxIKoVDx~& znG**wX0{zs=!*@u`&w_^(ys}b;@7KY`j?Q3A16IGFiNVa2*sWY^i6xp^XoV3?HDuc zw~yNZ&+_se&H1;om7QHy$$9XJilyXvj_lE^UQjqURYt7|xUwzy&v(`3Uz20=ALI}G zxf^V{l%hG%cZWwR`vwIky!&}v_peF$119I|gP8%Ov&1#$T+~)qeEjy4a#hsst$OM+ zssn~a#Ng=flc($ZqbP-a2glvoCf;6?74g!ZZCBf-NF1f=fY(FGkM)IJ-poW-%)Bbt z^G1})c~aU$i3L;bFi{BX=OCNOj-atvkb&0-zwXl;ITbbxwPmqvJO2hCi4tM1Df9|X zkP-ON;NWF$N~d>=MO5yqbOGX%tHul?C>ZuFM=HlTx!ZX zzKh>t(!dM@ul*rY_pAKraWD!^l3^F|)Yb7ErYIkGXU|BaEBky6dlJPOTm|qa|3gmw zNS!N4LN?H`h($yS6Q(BiXXN?3<%0m?QrKt?b*qBgqC^-e{FlJflvxLL^;`5m&!#Sx zx_u>oO%~g|SIxjuJ?M;a?d96cfXzjDZvY;G8#1Q(&)<0M)wdDk1}aD>^{TzEF+GZ( z%J#w`$VQ5*yI*M2zHHH9#enr_!t|JvWv^U(PODQ_wAQaPGiL^$>oi*gswK-^kKx>Z zkH0&{?AB;h@%3SgfVAwb0Yue1es%#T&i~#VyE)T4_2%WOqyak=CaZ1kl^VuzRERpz zx7c>sVl{cjx5F>*+S=BDti`vw?6X`OV@-SN!%3R0e3$@F{lh5CCuS7?jGSR;%=cTk zv^o#X&@cPPPJ{#cg-bW#!glzRQOPtYWp975fHm9Km0&zaZf zMvlL)t+gBuog~2hr}?#|?VPMV|Fsj1)!A`&$FDoM=;>ERw|kqL2<(0Jq*y@;bP zdGaeP!lDfiAk=ZoUI2~j7w8t8YbjShuUL|5+={c+#h-*v_2dMHNk%{*4IgcPVV z0&sDSV&BQF0kyXIs|iN)-_P9D8rM)Px5edgb3t7M*LqM+>w)DH6YKWPW-kTCy4sU0 z)QL}@Ke(cv@L+o5+X*&yX6teAW}w4w5o)fxXX+^76P^kWvJXqTWJrryvltsckMwU8 zO9pQgc<$ouT3x?d-I~c1%AQ-F@*$_oY^ceGM%H*5omy}htFoiY(qtCy6%J(=Z|WJ% zQjDg!dKEDa0p}s=C&}s*Ti7^LDzpt|^sWx+`F-p7s_|zhcf0rE^{S$briJY$dWoD3 zjp+5MaMJ8b|3=&n!8`Zl8BsE_jNb=DuW5VU*#DUv{;-!`{60YCMl4$9|L~`hrL=fr zZnSKp&{F7#q-KJB4}l?0sF#=%6-E)i(8j_d!5zqB60Km#EfSbb+3bnbeL3FsJ~Nni zUj~GIFz0-u&XH+gW6He(dZ3nIwmvq0fIj4X)Ng2)V8b?^d0HDC4cFSjU5VMeby1`=a?jA0)Z!37qO=d25{2#o=D%8&ND z6pSwq*8!cZUJP3zD(}VaOT=!9ah=60w(aY>pZDY+b7o=~TMP#kV}9iRv<)s%snbLY zP+IcSFY-5j7&Te*6(@^cn7>zNs4y|W9@H9IU7Bt``6f;<$BfE2-n>63qx+2(&YhkS zynTfJC+t^DuG8gFscg~ByHaCWZ!$S&*%yl}s$_&TIUslq?aP&(#YAe86p|y zM$CVmTdwqTzHX(^%|5jp*}Sogp7i%fNAYtboO#WdTYrEn8#U}T zTE0Zw_R^ld1*IT-!kH?19bo6 z4Fp!$KPDZKbHNv!#zVk3YB}9s$BU#_z=99I8Hj(MI%e@v}FanJwa+lw>%7+LI?Zd zJmS$(-l;8{GQUEM1xv_t$%Bji8gf5rV9iWoF?T#w-lcU0JX#c>%3L!|1;^28!99&+ zxtA*Oy`C*5T*9hHoGe*og$%OX;XK4h4(>}(=1(M^uh;OTv`S;vpanzHd*Pp5so?NT z7LbM)_ReQGc}*`T!|uT~4a`N-Y26A_hKlTXPH3JPiQEz@tbQlZoGviw6wZ=6uA1c+ zJH;Hr45KA)OWpp*@Yt@8(12usKNiB~7ghNaMHS2Bv}R+nnM8Ozu`;_Gx|d5>#?qr= zr=Vc(r~dvkrVpC_`6y`FH2AVE1g(~mFc;)|gjN@#3LS5zJ6dwVO!UDM4uW~n zs5fmU7{xlg%dz@PQ`_94E6RtcI@%y+et(TEgOAN9*>Qy6K4#!kNjr5c$vbDBirzU< zjMG^vZV{m2kDbbEXiV}g$Pag+Ti4Hh@?tZzY?}9Xm+U0eZBkm`ZQxd%Bk7pT+!kaS zcCY`Mu^TiFI71MYcu8%a)} zW@}royN~T)xGde@t@6JD0S#|aO0>WvQUGotPs#=&)4vB&?zW?y2R zE;;C}(zoRaHuTvJ^LdHdFHTp&SUgq1KEvp5%d6N52inmge?!dOe3>4B;t4i`UxRvN zVc(y%x2}2WE8;1igvBRb6Wf%QDsmM~PBoaW6vH)lZFH4B=@ZevPo8gp*b0n*f2=ST zU*n*yD_A0??j^WbbYJ37L=hY*N7tqOq<&lN!z)|&tgiE6qlv7Qff4(F`_Du4lS7tR zBR&-jWxe94cE$?HQ{ndj3&`|Ph?aFte#n=4ujFRZ-1y_SzLWagTyitLx-nzq^|nU8 z_DTcgLigWpmL?zmtO7{Ue!Bjbw@vlb&Rgow^4a^$IxE z8lzWyKvkSqK+ZtN+$lcpG%usFxB!)K6k0}Gkor{7%aPqPHcW13w+_i-sknV?;i8`6 zMS=GD~m#C81_qPA?>35_qR&>L+j<>{zs2?Osr<_jEVKhe2WiUJ{ zV9(R{kjDIca|~J{&ZWop;J%V`;mEr>YYc^PA9S_G$Z`#hYEWw{g}HGD1ak1L(bTqm zVdb3#^M#VwtQ1C;XBf=Yvoa6X!5hwHI3kl)weM*@&fI*~;m=9_+(z z>e}e3K)+j01=9`>a*U`ska2HtaRwps4vSOTw#{p~70yr==FmdVxGtF#f7!Ce=;y1` z>)vr2;__pm1qUm1Fpt077rD(zk0xMAc9CGjD-Lrgcc_t@pnE1$jJ)z<{?U0^S|r6{ zvj~KaNv~ij#SglYqqMsC9j?FPWVVq$%}c$x_p^*Ba7yp}793=B5Sq)r5jOcTTg|-G zV}o$YS7|n>1~<2Jt*LO`64w_G6y%}D+{|k0X!Bznc57;Ks68U)=O>~V9V;%Z%}g4+ zB2BHj0}r}oer@ROLrXe0ZV!d*ovpy${d@Am8xpH5yG%{Oe?RD=Qy)dLzTWThv7Pyj zS?$9YcU5nYX{-Km?{`H5)rXz=X!+9cAJ6Ui8`VnIo@x5zt?C;Uyc9T)3ckP=s?6!2 zFlE`Pwyxo>#urLK_pHqyoFFbvl6^$-H=WAN)VZFm<3CgJbMM3WBWj#e`J3kZ90Hqv?hsZp(dg6_>`0%J$}Vso zR#NIQ{?z8O&*NdqEtgS&+G~EE2S{bhfp?*ier;VSG|yrEXV?6T+BKm7*6?D{(a^8O|uQ4MO}D9Q~L<^%TDGg zl{3BZ$I%B%m$r6i#5==Ta1kC`h@-$$FfxcR)=M74#0J$We+{3p;__IchSvyf$(V?- zhU4e-L&k4HMiM0*P7bvI>zL3oBs%@hj0Se*UxtdDo8Girz)Qr3Q4yCCw{9>HY=EI0 zC9qiYD*nre9gT3n62(pi?_^r#ccN0_er;_NnmHShZ&Yozap_Dz^%bSQ_C zCnFsnTp1;dakDH55rXK3Jh*Z~NZRU~+IC4{o8Id>F-rS1yG)Z4qZep(*9E=OR`$1h zU0-+I8NcH}fTw|>$V#g@nfSCkiT}Q+?}?pQt|h8m&>*fzw_v`YE_B1Gjr|?4x zt>fRqxq^D;ZWMX0StxbJW`)LQdwY~$*Wd7ktJ0Oy;bNK6$*B5>$C#Mdvk&GMr(<(c zAqHZ8=)lX;F*l^^+?r?bLg)R~NXqT#<9&~`l1TLfD-l|}+ZCV-Sof}F`n^}+wbEAI zg~8VhUf<&tDy()aI^vcM*J=W8p!o6a=+5ux@f$q%gz*{bIy;UA&Q=8EA69ziaOU8M zUo`N^xPsc0w#gHZJSlF7>QirM6tkiYXeQjaDC3<0oq~s-zt#@kL&_fgkn5fL`9`vn zO#kBR+lt!;FW5lg4OlCA>2Xf0hOL<)$7){9tbMvp67%RM-4Dexli%|c_=Oxk{K);` z;`dSW$?T9@>kB{w?Toqq@T-IB@c1u3>xSTegbV~H7_)>6_v!!1%Q2sIokPdO>Nx5K zf<5u2Y`MnckM38b7y>%mg2Vx8;Hlb2rGej?>+b56iKJm68x0Z*qS*h!uKy>SVm=g% zzXk6wznxnEWCT>|C7$F@GB@5B2z-)HRwQnHP9nGW?9{S=!Xo0!#gxg-qIiFq zLpJO4+d_95ov}Lk#OjW&MYUSwr0$YkoRfrw?gfRJQCn-qA}!59RwOX}1OdC0jJf?W z$NC@KHm)fSLo?Aou}ITKjrP%nVAo^{bXPff8MzJY!yjXE?8ni>`$d;ew%+rFB2ohD z=x$u&+_a&8R@D~*?VYfHwVkfQPuhUV=>-KY1mBmKlR$8 zEp+8>y5ITXq;q{EEmE=DrZk1M1TCLFEU69JxmoFo(LD>rz4!C9Dr+wW9dr>|O?IRG zA(iLYC^V91&)e#~alQJOg?mPt%?GN>s|M52M`48U?A)JLk0_+@e-2sNG^tzNErx$* z*Rr@SjzQ+YL$!}7bMsTvrao~us0Wi>s3To9z8|(O6YkdFQ?mz8YY8^5YvHOQyC^r} zc|56NyTtKW9r`ASr!|CScEE~gzG>;_Een{p-+XG^zul(X;2$!%>c?5VYWm)pswc_m z#qX}X?4pVX9#a1pmb&LxwYPS2Z_{+{Ti{e=adsM$0~p#q-MAn7(=s+JWC)YrUS%!?-^i^qz zm!H}>AoQ_Ds|f~#FUrt`M_~zng;<67|2sOka{|n#!J2hcKampLr^hR8!-fOh%XD!Pke~ zzCBBJY(JyxAB!871|wT7eqmL`ut#0kLf|( zRI?Y9!mt!4XH}vGkYY#HmwpfTl8aea^iEz2e}3(ZIU+or8>59;rrQq%?oHHA9p&!| zIy|ytDrb6168q#X^|U{MDB&CAA3D? z^EpL%KN$K7;K%Jvi$g+b+KJ^2js7ac1UR06(^S>NTN=Q}@k zp)g&!x&;7)dcY0>k#w4l7FNl&ZOe1g>|*&TL>hHAMWe*oB2lWFm(O$^oxiHCnk)C< zael>iIQK>E4$U{VA9^@AGz0pDfH4DlDMy7B-`~?6T)%2rSnP#5g^Cl!AB#BtevuTH z95ujR*I67qsTAAg}YWcG5vq_<@6z~_@D4|m_VNl=*YpIW~w z-flp*=;kBePXA@F43mcB?n3%_^vyxaY~`>%=@?R;q-F+i)E&E(YPS>Hz)H%2uWR$Z&^np=G;XLTQtuv>IQ9df3#Y=_CAT989%?*qDI~h<+90v=6^*sS^n#K z^Tgbsw2&s#8RXutjwP|;w?d~)4*raquc+c;9yV;-p@mIdJ-gVYyVa4yR8O{G9ZOp;?!=_!y*+YR5qR#!JBIv`- z(-Y<~m)vh3PbLt;3fbz}-~XAC9qs5nmrK$V?^?=ee>?J4YD6ME=<~I^?-zeP9$V9N zirKxm#hQL!Xx7c}yYJbhFap_~-|$9Y{=@OwKY;^t`+JHW4N0Brc6+`R#Z|%9uYGEZ zZv8a>Hb;9YdvTcU#*gUoEI8elx#1!T?g!n>EHI=e%zD>qJWi{rej*e+*MZfGY07%N zdYVaAy&fRdo|XOSwruMo+4ULSb7MN$MlKkW`Ho20mfSpj=SJMq@5ha6-D)%Kr;Zl_0kQptaQ7Y^+zy3eS%!xTm%<+lsu3X%!poe@a9PRya$ST7&_XuF z@*8#uDNK9zeiH^g6x^NLf78rWh^@b&+wv66&OM5f9|sBsKjsm`bfu?Re=rYvQNLw= zLQ>km@P-Z|3cB2K^Er(8fzF(pa))y-7nzH<<+<+J?`yL#BCo2TpLjuavArof7-wdT)1+q}KC{B(GmwXm-Ka z4=R=&fd(q0<+R~?qFIl#Wja9Pkt+GhKQO|l`O zi70g7;kI8_YIkndOy2b%o9j8nX&X_wq3*ZKhi>)uS@l(!&C(~1@-7iiUa@NVso)=C z_m#c<8wQWXpMRa6yyE%8r6PTOp^5LO9!cfdxu7FcqQQn(lL39o52>N9#zpt!Jr}X7 zA%l0G8OgWU-@VV1#EOm0)<)qoh$fsoOqy@$GB zK5KlO?k2||H&pt~Tvi@-!dg!J)QhovY6NGL4AkwF{w@kB9V>q!deISpz+d3vN}QjV+z#(06)H75^9)QV^yBFCICs&}%SaRN zr6h`+07@Ks2fZ!TM7Ih<>CPcjV@A|`IW2_C7jBlUvX^4 zXIe@qdRLiHzR}+{f9e#Rn%mM(ATgR~LKLOI&|aO%u@0V}&1TYh&4=}oz)St7u^<;L1ywO-e@gPqS(GkZ~pku zNpYgN(1t4vRqXdkH=r_5SGLk5Qb@;HX3!CmiTZ&$Hl;QuNsL!N#@!tP z?|vUYZCT5@vN1wAJoer1RLfjbpzj9wr>bSOLT<q8wUwwZWck)G2idjatAL(aV2U#-|b8Bsk6RkWHf+eaNU^$G(91Mqw z`@%`#X4%4gf(gT1Ux4lLf``t7Cde!kO$1PK{%a&F8^25`HF;nluBm*}zRc9z@=e!ojh#Q)-GZxO012T-pVi!6*R1g zY=8Zy)85B@Pe#KK{an&fF}WET>WlUGL$>!Hc2(Yr(;CRfXBB!)Zq;j9ltN>-arF9a z4|VW8Yw2LLC%z^mpp>RsbKM!GxL$2iwe;hC>ZOS|w9oL(D4)kePo)%-C?|b=CdV{C z9%S}@zO02GSx5i~;FH7!1 z&O_%(=7V{>V$)*vt3zp_Qrdn^A$rF{fHK>6*w5>@0rln;spR9Er6`YXp^WAmp!$!lz25EYvu9FG_h3E@C8Db`HSaB0 z;Uyiwz+&@;WW)z*vDJ@(;B`>dOv3!1f8yC@5ORCI_E>q8l2~}=`SyC2-6P+|h6nQ@ zFZe<{uMFK8{B6v(Txhl3=+&H$%#+}EX)D5;!pSa{OrYp$rs5(&KuIF*|`jqUbY)(A2PdacxT7qyQg|rl%yqWFGUKW*n^T- zPm--YM!w<_2K0p$AUkvf98bqV!zrD6Yhe>I!tinZVR_;Z`$$7xHBQF;`eSwJa}8Zj z*D{ix>m13Foi@Fd?87P!#*qmA-Ls&Wx=T?@b>W&ndF7X$+?#h-R{MH>Etl8oQw5KF zH&#@}n?-RN3N~=|V*Sms{0);-R#<^vQYO5_gZKXltyXGi%Kf@WX(TL+?B0leycQ(m z5kkw-$2_GTUltA$9>qEHQ&J!3Hx=^dtYsy^mw~axAZ^X zoR=T^Y?j|@GX@BWmS>r^UmLG>@o*cOSvZL6VKR~T8GOh#vaIj8H?yjKu(5+(Pf(^>{1+*!6J@G{`$WH8`JG7Czktd}9FNkII7$Y_~Nu>l(Zch||(iI+2fkL|jv zZ594g`^Ox~Pgkqb6LPk2%^eeG>ZuVkLnLmGac!hhoaS{B-kxR;=io5AXKEs;!p+dFW!la-C26hLwQ^0Zb z_x$;C_17hI)SI@CmCvQ7uvWW;&~*m4>uP1nChbUSA!=Uj0z}afdUeDNO@m}_eLH(m zqpKCX_bDPGy3zfzQljKDJEj)>uCp`jX3$lfna;?TnM|eZx+<+p_g`5>3Wj{pDX(bL9lIkJ(JW|bqWhdht}1_| zyW_j){bVnJvu{KaX0M%do`_d^TX&tTKNZEeA%jsD$Yos_pV+fxm+m)Eft&r^E6A4~ zfBycRY@Ssu-;dxQWn<^679m|-BJwb1UjGRebK!lihC4WKhvHL8aCz7MQ>Ts5BdlfO z{|-IyrsH_3NxJ6J_xw_mhhlZ}?wrZ-GP2Wf@ZqWERa&ZC_C zRR3i+aZ$JIFk?!WSiC#?qNO1Uy*-a=pyOsWC~kIA{4Y@vcG`j_youvZMoB$M+#;db zbNmP{W1SNz5fJ=$R_)HA3Ml++_CTRM+U~@$F6bEq$wyL_1BiBmpsnOKm;yPFrWV97 zy$(t2Pa|NT(Y$At16T-9v^DpPUQKoT`v^jow-n?@Vgfk;;qCw?0v3juUa83v(f}Eq zAUo12Kc>jxLwzF(OAU>WqYjR?{Cx893daR_T7AtQaz2OpmL2+S6E_OOHT$21hluG2 zvb-j)jrgO)b-v#RtXG|9tA!&UBT+ZO#QyH_U05D$uI>4=Kb+aA{J~hp!51U@ zaJ!-c)n4A`?P}QDHZ6;|^zOfnBA*#8mOJoL!#!+i;@bQkS~DZ6?i!YDh=aPiP0=)9 ziOH3A=~c3*x{E%?NN+Kd$DV&d343N#Kkz9Ed#%P|N)xlOU7JO@1-uu*I?7<&*_||HO68-{Rjq9#MaYZ&o zOpkFH8Qr)dzHOgVCL_+9i*)+DY$R7`_Cz^@Aw6!~exhGrDEvu8^5*l?+m+c&9GlHj z1{l*@r72R*fi@${ISJWOeQy-ZTJx{oqf20 zJuMKP4TLRtJ4(6+HgxG^n73 zzAZ{l_!TD(%hroM3e)v=?8e+E?NhV47LMGBb>!3%smEWZ`8d?LV|kFiBV0?EtI`Bru6uvc%ifs^6@Y;kzg}9qU9SL)G z_!{>tOHP?cecce%rY3~|JKb{g{z?z*@1f#)GfIGj2|k>4dpdXIe#o7vrP~f4Us=_d z90*LzpFMEN`k%)KeDZ#7Yv(k!&eJ4(d`|5B&%?M0L0tU?J(X_WjXqn}!_=sg=tiiQ z;OljH^qiH9_H%mzP{1e8r~&VFHu$gI9j!sWyrNy| zSby#3jHS!+n(X?au6{4kzV#M|k5qC?zB@e@6X4DYXufqBRkj`@caS=xdCrjNEGlx;ihJ5s$*{ zQgFXAq0y}4+|$IQnlqPwn76)vQzFIk#E1i2uy>cnruEL@7`Oh>L?72LmTqNkhs@6i z{_i}f?;{s@BjaA}>HoA|@~ZUmDcuh;mDC@J4ic8|lMo2|6#AB3ufT7r`6%joYDhNO#I zl->seBna`_a&Sb(r0mI6KZ3?}Ar!X-!pCfSkR^Nzz;Qzu)-Ix{--+=l&691RtkoZ%~*W@)lTBwMVhb?~W|qmvI*BXp8r(vq+^E zX#lU`O52|SAe`q095xkym>wV55akPT#nb}#B9sZ`DP$5~0N{gUk3gz0K-V8W_93kh z*p8qkZ&5Qwx}_m?DDfHik%{up5U&V{D3ITNZV*l^F+h`skp@*`zIB2r@hgZ%lyXzV z=$k8%`yaPJ#|3&^im3@orycOcZf98vo^&ai96XC=nJ*C(DH?m-j|JXAuIwx!^HqRE z7B{2L+!KG+esK_ov$SiIp_U%BW9bu4 z-bKKeIF1YdiFN`S6NWWQeuWi7h;*Ws;8OuV(iHN10YZfb{vk(PMLSGudTQ8H5_^*X z#OqEZ?M;MH$CSzf)}4DM>jJ_{2Em{5`wKbO69K9C!IdARvtl*U*+PVz0P#!!BJAkQ z$x{4Smz6k<^C1%I!af;WhbB{;p+sPLqJR^Y2Wur>#GyO}ciN&t8$T^rdDVlyel2n^ zljOw8G#~U?$xN-1H~WZB(5zIODW`0+x8lEqLjNoUXSN3$0zcZCGOB_xLM#-$oJ@kq z2!NVZ{)>DW2joj`+V-F}Df2IVw9$cuXETg6J3wC+sajOif0Ga#AUo%Ui1smrl1{-O z?=^tk>yi`AQ>KwDKrCuF_5+IuE;6(y~6odu~__zp*_R;`< zA5g^lMM;$Gz$6Md=7d$5uotOqoD)_nfks5Y2_e`sZ-%K+J6SHz^dWM%fQ8kL?;k$Q zCIh@4TniB%aVH9X2%oin4XxN648Hh$nL_{Q- zf`|`{fH8>JsSKDHb$`*>!g*#Jzy$G91ce!0zrUjf2l7+)<6$riZ^jFNLwvrX$s0#kZW`w~0Zkhiz#65@(R>H4m9WQ+g+dKsk`^ z!uD%h<%MtdLBM#^WC+K-hst;_2=}H*VXO!99FzDF8^g}}OavS+^IGO+4$%ps!@HVuiuU?#JJd~vYnfj71`cps7 z3E8HxXqleUm=lr{w9(K9Xw~Iiixso{KR3hYf+BhFgcS`BScFsJoidpFBs7pCAv*-a z**Vy_t$M333pYgR;CG4QQy#8xm`dh_Wf{{^F`Tox`D|z`9#Y&05#`gQ_Z@bZ$d|7? zxZ;;{EGog>F-zd)(FU;YSKBrtWb)F;VIq^4XILaW^P(`2gJSJy>v;f0+nKNv?WM5) zYNN1q18br_E|9Mrt21lW3%p*Zrh&_`FB3%p)xOlTmHoeQoY}B*ENKFY;JhJ58@o$^ zteipx3^`|)o1+O|*Tvl8`q{pXab3WblWX}f%(6_FDL;(^FYzvuM#}Q$NFvQ@!7$)* zWlRa+!aDc}F^~yBr~e0Dlc*jREE6{|z@LZnIomCRfy`CUg>9Qh{4>v;G%(&jUZ{!Msat>~CyVZYd1a*bVY+ZJv?}4WZOeo*2AZF#n9S)e}W;E?QC8%E+YS zd)F5HUs4Y;<^XO8qeqSlcYrH)NU1(GCeXo zyKy+Q{gCPFRW{h-WXTso0aP?k9(j%vC|UU4>u;n1Z^IRSq=_hjmP_a>j^;$#fgY|| zP;0|zDW3XC2e4>cOXFVs#ia(`UNruoBNyM>B2=>G`+XN~ma1U%an(x4w=#|E5+3X| zEAcE-#MNBi_I;Mo#Vjgg*PsF;(N+Ik>j zx+LlBkH~NIYoX4P#lx4l(t?H+Xe+FwC(}zmxFflSd)dIWXqfh6`-iL73CCi478qjd zA#cs=(2Qaszp9#wMjlp9hYp`#?bmC_=f3sv%4@;9Ele#}oP`5)PU2 zaOLBqw*r(_3S(59MB&MZ$8H6G-5^T%yk*V}kGKa3&crg0i5+ujShl$(As}!ufs{x| zPnFFU+>xBwTD&5Dz{6J-ppoa;VgL4r6Ye?)a13FzZo?`ee-_`?-v>ne)jc`iifK7Z z#?j&uUC%e72xV%OWRWhw?EY;wxWq%}1PxwfQ2{SVK#^F$s9aZQGeRhN8|;JFIB#Bs zA$Wgm9>%h43e5*gV40yAK1BwOAj1^Y9g|X;FO=4r?%f3Yyq8L%ZdYwZi(c3aHG=Gh z66g7v5f6mrZKsqW#0ox?uRwfsK5S~ZDH1MyuHJ1!$5RVg7eez`d7E?Ja$JbgQ!{Rp zCrHFnZZ0$e*>fN=xW>C7k#nhs9pP*Rg%!f*kMl2H4XSf6Jcvm=5L<*;Zyoo4O=g92 z!Sre3NZgY97B{q)4NY$FS{N8IIB(?XXp{dHJ{4O@yO&fOBK}21HuPIY?pOmNlbTR0 zJ2ZyGa$3Njc4x7|m(a)yVD6pBm=0>kQ;mj5vfV>3Wn6=)anU=@O@L+WIS#QT@LJRV z&i&AX_2<=|B={7Z)4y3}Lw~BwL|$bkOl7mcSal!K*`n^O`xyj{r%99|W|>4Ym7l?# z@{=afN%)I=lEU!v^^a5ek?08*u3{*Pg7c}%If5)sG;pvM|*iN z!eT*5ydonX<3;&1buK5EebgyD$2Qo;kR`&3Q z5rClX0PMwaK<$7gGfvBd;x0SB-)QpLC8P|2-$mEv22kwCXZ5{%c;xNu${SyWe=<(J z2b0-IZ|WV^g_kt79hCE6UNbI-mW8lS4fEwQfVYDVW&#b-WnUqt8hj z(>)yB9>@Gl)91dqb=nb*&9D^8ipO6b6EEk2>ol--XZQA)e=BZRn2r)e@fm6xrA(|) zWf2j25bo3Mi3qU$U+8wRMfa^W+Gd{TmBzY!3M0+WL~&;SaynniVuY~@{$#ekYd~j5 zz(gU`l4Q}~$?NrT{_hYU*Z(w6+gJD=Xynxv3|D{w#=7ur!>~=>8Nm z4Xj8r8aV+NM8tg6#eX}^Xk^`IajdC{NFxjC&%?)568!6X?O{>K;O-TV&|z@Pe`7_! zVZcKbuOJa)Nw7-7eMfjhAXmp?PV3>}E(tvY&V7j#L8?@igykmp9=kHp?k4lz;Eadg z;YYYPGDYcuFN8wM(}I$$?(%Dew1KAIoNyFkgs>b-(1G(;etW0=m!6%XOxTTRUz)Tf zHpH6w7q5F(jab0V`C)f5nJF+RH|i$mE^=MF-fGBa<>QB0#+)#6c?Yy^FkXhhHB)i@ z--9~j?}`M>I2OG=2*jBT#ZtrbVc0?FjF=`vc@B(}2(l?hS5XS-QQegdHSB``Zt@<5gUm;9yX)TIO-cbp?GGHo2Gb+R(EgWirwMgT zD`VK@`8VNU?+n>;TJU5PWiP`tdO%@cG>jbE+1asuW&1Mdzdu-%3%NVVo7G99JzWI< zf5h(p9ubz15kYk)Sc*oPLtsXrDJ4h@dW~PRTSDfI*7{9>d?W0SFO>PJ#)&S}&tiL^ z=O)*1fklI25qN=C+39RZD*$S>JC>({2MKJ73X4Hi3Dz2>mn|ggNC7nN>&aBXJ9_w1 zhG_t!F{qtftWeEjjvyrm;9qj>P%^+bLuNCQ!dIyPX-qSkYbZlJ;QIm%EdA!*mgF<7 z5MZ$r@x2R$2?D9NOdkORuA0RG##afS8~$?8dPY@`@w4I^cH3&8z+YNw_T;jtF6K0N8Kg*i`8? z$T=0O&?X2=ExeAuWt?kr{BG(l@r74x2NKN3+|UfliAd~JBhLx zcA@SMMnbI{iMQ^sjJf#9XC&aO@Yy5vXflv^Vi#xef*eh#4@^7lF;t-lgKV;ZGXc(0(R*&#ww9e&1pCaq6mk8Idh4 z_U}!+)~ki>LRg9H-}q6l4z|LIsq?VswnLbmu(k~EJ<0zt06!niMP|uL@_0B(SjHvt zab~d{iFv;vidzR4Bpxn@zgB+kzwZ6sIM1@wd8h2kzFo(1>k?r}`u7=0Wd9ce2()gI zd8V+e7p3qCF5v__LIe5qR$a`R(HIO#-Oy78_*SpNaO><<7ieH>9FYzs6i6bV8VG# zLx3QWa2SiAFiQD2&f^FX7>YF9MDZ8u;$ETgDd{m%3cvnv^~eC*1OinZf`vM{n|blo<{k=Mvvj-nia zjYy9(Z0VknU|PRl`QT%`_~xBr>?LYqTL*5%&qs|zj|kAteQM=YF)*Xh)8qVMrE(7G z*qCil6DzvojTOfKdLvhm5lZXP%V^j+{c@s->RLeR&3v0ySE*??c(q&^s&_qA_$@f- zkqU4O2O%vgJg}#=QH8;)h0w9fC_^PClIP`?s14 zc&E8DQ{>FJF3N>9jddrF_t@qjqm6z_H^hQCE+9=A4PmfM0kZ@(J1i`Pew1Hf+z=yl ztQr2R?{G39IPMa^1n7o-W|NZJVN;p1e4L%gYe=u9$HBtv(UBnwB~fd{;sz3w`ytb^ zSdwG2Nk`_Z<_wD6AoKPGq9CCvqQu|nW>A9@JgNiEVLc&9#!CVOg)|oagGGn z&SXRA!`l$(%=Jvw2Ylu===jLE+`gZ!*5blFMGRLmeKa$p6{8n*$Ewp(XO@BT~4tLEKpb zxI^Y07@)!9DNp7rHn`a|MueGVFR3pRt%l zJP5`Na{Ha2r{L^RyWkL|k+|V3J(9RUqjBfKN|EqyTmtt9rVVj8h0L6PASdnsjrLqU zSRwE45lzW{=uO-bPD&Ni8A~F`=&E8-bPvigVJ)PS;7*%k-Daf5D;y{KcN2j;09hD7 zuEDK-%M7%Cgu~v-wZn!G@q$PVD@>uo$^&@pfPFP$*hGxD^B76-QabVuoG08|BaB421~~CY>OuEgvGtapT{0pLquCB zP!qV+>^T7Zj|9J9$QXH~q!>wY0rm;`oKA!3BLlom)shkE?C$Sm z^cy@Rw~ImT-BHXi{gK2U&7v*sBoTF(rl4C*lRKHDd!lh`DpGTF9rz(S0e)hTC*5jU&5VnSE0HKhK<4=sL6nq%+afX z#Q9e#-^H0_(02c#)Bt~68gnmH&+e}GnY=e3pkPkCe51Nsyxar?g^^u~%pGRG{&N7s=dT4>-INR1>?E-oIJr2C_U7$( z`rB~BA1lyYM97=+mNb@7G~F%OCkBIr9-H=G^VuYV-xbB3NAc|yloAP%f=$y!J%+3( z>7#m2F1F)1Od(BCo5h5oR0CO?jAv7X3koQ;Ho$+;;*`|c3w2>{!dMLeBP|5scLmn#{NOQv%(_tM zOB5)^@$^EZ2zAI5rhRA*8b=yf^zZ>X26$*&lER#WZ_JVgi73JTHWowBhKDMYlFw+o zD0%i8R9fWpwBBvyC4;`o`}a#DjMX>Mz1v-WiLiS{HxQ|xYTyC6^#`&`^t_IZgIyv| zBsYjQ|H+^JUmC<|&>#|{e0v6I#qJ}{Z(eZc;vytn5PQ;h|gXK6H_-HykHE# z#kY}^`uQ;{UTZ}adjRf*faEibSkS?&9L5TWjK?K217B7l!GWf6>hF+~<&b zb7lVU0T>0!Z^bNy)eU$DKv1i~pFNjQ0o!tz#(DpGJ%srYJ^x|fNCW&O-`)eam)1Vo zz+gt;=W^-vaDP=z#Ub{m2)&QMh_g&jXbe}%^_47Vez20J-CKOtIo_%Xy~4T-|N!n6Uq@y zRAIzKkSV5iOgZf}Y1Uf|e~3Gm1h+e=NsJfwEHYm?a@aKb`vp^w6j2!__l$42SH#A` zKX~`SvB*4Il3{Vj+@#dptxY%WO)haL8jZ6f&_@3kRc{^-W#7J!TN-3Uh@m7VQEmp= zl{HgjNwzFwFCt{JWXrBFh&KD0>}$5EWNS!e$&$S=%9=K^CcpD?KhN{|{{Fb{SFhK7 zr{?29ts)w;)k482-ZOkcEylzun%ga`uRrM~oxl?rL<@N>qXR>Yf z=U20pEJD%9#d`AN;IPx7$F8rOjQXZ1#IN0+YkL*^l9nW^B#aB+PqqVd@K<~MB!b(g zc2jEj;39Lk3aJDd^*`_5zdw#LI~W;7YP~Vt@+Kfc7AF~%U~6yp!Yv|l50W?SZu4A` zPJbob4L16Uqme!MtjPWU4RL_O{lD*RkSm7|)a#HNY*|J+>JWPt0b)!lKgKypL-q=m z?R-&(>)A8s@urfdeVqD59l)r3E*gW_l?O57`B$)zf7Xgmok{N*F-%;&39B)-P8H8> zoT~GLiT(Ysb5kn(_OS;sG_chMLR^qEuWDjENsZimqcE0L|C!ds2Qh{H*x}m_bi}#L zs4F68so$!Fmz{UXV-%avBIH@DmhtXq9alK@f9W*z6uK-(@SJ%FJs!A3=0lKPoXtZE znxk!`?>!_|Z0w~LyC>7Z?mmU_-=Gg|&ja7;nkph`r*>68)o2pqetL)oR}%n8c<}R~ z1PTb@9w??S;|TxXwvT-5!L|Z3(_R&M+1yqnBEnLbuGikN{}j&spB$&sX+Wrca#y=k zz9QMIQwh*Z*4Z)m@f;9qd@MDv%t9i%AgVCx45{ziGA(G4Vr1 z$TE~xx2aP&N2#6|B_!<*c!k%y9~zR}4tmBw4-6{bAJ;M@l?X2S7kr`=423-ipBG7^;9GXZF0}^|6~OgTfZ!jyZnVPPEH-t}$$ z^&?!s))%BmHG`SxXexOw37nLWlx26oJBc52G@T#w zs;Fd^4Cy`3`7uX!;PC(*?tieCn&l7T=_fJxiHkK%EpKi%2NAMEvJ>X(+B-vEgeiKM z3ITO%8=Y8V$yz7Qd^N?024qZeHY5v=Pk?2ekZkZ%4Gz?lS{QO2gBJGhb!<0&;5NJf zLi0f^xFEF%n3oLYT+_sfHS@Ad?qN8@7{6C_6{K{J=eJIHD!jS$h^* z@cbak?%vFCBv$P|{@v(c4h*Bf9$021z%4}lOY`PMPh_})6m|`9^8lw84NJ&CB}n5O zf%w~U(A?LRas1Cvx%g>+SXJ8Lb|}unE=dDL*8=v)(ERj^ui?SCJLrSwL)r^ultjoU zVaD`L+n)!@_bR-lXQ7%gW8@=R@oR_9X-7w?E5{>gVqiUDtqq1qi=%)Y5)H`U`9g_| zvod1OsDNd&udW>lS5vS%LSTP;_Q4M-d5K1A&}xuOrn#sNaif|OclCZ{u@;mx+W)=x zmit?_iL}nV!3eJs1YPr&?D$4;i_}@?#4XqLJy(3_Rr-rA7D=LqhxjDiZ1G!a-0CrHs$YdUS4$Kc~r2hXD5u2z?Zt%#)O&geer@ zj|<7j2O<$Lt^61e=qsC$Og1JAoV5j*QwQaClB_j{Y_I8o*!oED8Mal&Bcl(RB#;uA zK62+w=Z-SNxs)<~i+6l)5KmtKnZ*oyC!Z%9-kqi^iAjD4%64x*;Lq{>O1S4XcmHxj zkn>UNJtZ-OBnZeJ!r#dP5?T`tY9#5?T?O3p{;{2jSwFBc#_zoouHdDQ1o+0Ml~f5W zGv6GW7#h&JDWUDaJAM@AHn*ib`3njnKgw;nT|hUDKW=`j3i(KZ@`G+S$0M6;?rNhT zvDuSRL0o{plmA65|E+cH&3886^8Z@h=?&E@Sl|-yaQ*m5M~2v;>p%JT-2Ar}-wN1o zwfFbNEK~D-%pRS(^vGf3xzX*PnDy2aL!#)BLy6hP zLNq^KQT3VXL4md6_&Tt5>=$0EP-nQ4?;EQRZ$E*wCz1ExqtvYSh(^x;( znR5XaS5-;b6{u_?A95pkVn4pT`ZZRaPiw?S!I>|ePUXUa+`U^@+U4F6$D+2k#hG9= z!4{Ek+#!|wU+);3jPuQUEB&xj5=}Jfg3xJkeAh)niK(;%4#6`_KR$9g+8jSHS9j{0 zrzf@u_&hKvjuh&r$-@MNM7m0TI82&>6^41{wbXD%29 zTr%sn#WT69T5l4vH8l@;Dna5SU$Fx28`C>Y4aCSp7U!GNcn23cj~K$U^R&=`mV-Wr z>y#+m^ldJl=oj4a`kGS7)*2UZ{QDc7f6GTqwH)h4_;b z5&~ax#9t?zPg9=$p;MPQyZT`h2gow+{UE;p;m*oh2V_wGKgH z1oBpf*`B>OE$#K29fpM#k{!(Js(PNrDo*2BxQ>nk1MatGp19;I+WmDswRng>2XZT- zgML@+oNe0dYU;JR`AO$pfm`14hl$txkJYr_41Niio7y^(P-B0V_7VA69LN#N^` zJ4Wn3gQu16wowzi%CzMmd~t}ZGDk=P72r^yDdoHTH`4Lfdzrf;DKqIF1PT+(CBYmj zVAY;ga`JUV8UYJI{iq3^2O^7Kw{fak9?JzoMNm9!dL*l*bQsm?Y7#J}WEx|z311(H~1uHgzyt<$@Q`AVIzK*ZN5OnwiP6A+}8 z#o$YZG0J8)us1^01;b*#e&P+tlY?|j0b-4nI{Ea68zs^M@9o3`3h7{;cJ+T%WcI)o{Kl0u7ZDfd1%A6a1YWH+s;VrQw| ztLG!z`xxhAUO6)_h8+$ZUo5n!x;v`8BC~z_?p6~7?kNA7u83JkUT?nA^|!$x_bO^3;22rMePF!vJ4gU6sN$S8!65S7G+CeXws zbb!?*1==bv_xA9*0NHjz6Dz5Gi@o9CHWH0u(DVD?&c4LHL}(Q(}zYRD{XO zkMO(wS+KNi-@IaKym9({{sY9<$7?z-k4E`;0#i8@dqMBj`*; ze|BY$iN`DTO@A}auBNG-`$r;q`B&q(Mi1|6ScSMN6zyVCdYFdCu=OdPcuEhP7MhhB zs|BvDc%$}QolK2btrPox?)F&#ZkbhH(?`ENl6JYtjMffZ2J}E;5ft82fW$)YKd?J6 z{24m;vrogZmXM?O>=+>0npa4?M7)e{K}O{-GxC{1a@6C)xXFK~C}}Nan_)jfAPlR&>~k6Tj8! z2F~-dHIh2Hxjo1xjl+Ohu+J2ohO<2rR_ga7xrr8{eRoxA;z?{YW7D|_e3*7U_V#bd zw7?`__JYL-2riGw;!01-;l%jGv{!q{fP%NiB2iI$5$sDRM4U08&Gq?sarD_{b`)bu zIV<+1XdNLxwf0Vtf0v+AT}rS|=_Gp$!_NeV4Nrsc#a~tDVq+&;!^uY*6g+g-i6C<60}@xA(HwU@ zI{#V)0CRRLEZ5@~IIvDUE-Z5Z8G(5j(y{*}$1;@z(V)QDcX~H?_}!UE(w2LwR`AWk zNDN(9F_ulEf$UsP)7tim`rPceT2a)zC#Wf;O+={#LFfP0c`3xjgN z@(U0?znBi=bdP@Q+77KhBeeeIcX!1;`H0HH=(fGp5=%Zb5XFvB0Wa%#!}~lNXxhHe zN`Z(;5C6Nun%WJ($cPISg02yhFP%O!=h2_>o)#gNB3Np~m#-~v{IRfL?CJ2}upLoK zfhak1W87?<4+^nGAq~WpGjf5#v4dptg0_L=Tr=&%U4wE3YMW{JO2n1L`2v@hIW+4QVjd)xe4z+Mo7EJ2 zQX>edauE6!b#!mgxKD}Na6cVZ)A9&uB_tWvobP&j1(?aie)Tpw0Q`R#kYxw-`#BKO zG2-JaHC*X9qUXQ~D$G_ErPdj3nkjT@pQPOJ1>;*Z7~h(#nnRKkC_mNgvnXxAlL4E; zLt*#Tb5Vv!bStF zS+YlxM%;6-e@Cv?!xk*?qd9_JOvO)tja3CR9Xkg5UkR`A_IF9|y}>a)&4+o;2X2Gs z#acNa`IWR@(Qn`!0e$X;71NLJBOjr7^M<}^wIgbS#s`0CT9NNh;~+{>65%;O<6D6( zak8qAy#o{83JH|BaN$2l&LJBU8WPKe=H1gHHdir62kfS9?55n)Pv4GekE0h^j0V#F z&@O4uO%%LMpNQ?^n{u7itSf_a;YR~12^1;r^>JT;9I#{2YJlK*hb{svzFIzJyW0SF zI`D`IfGL1rhL~umWV1~0T15aST|{l`nR*Tt3GU0&Ua$-i7$dLwg8P(A8ayK5vS@aLaXr{D2C+R5m#6+rYj`%-GjfP3P0TID+Nr?a$)KRcMT^rv;xsUMy?(}_wzUU(JFJmQ^1q5%CwFWN()4Qv<4HKw`DXFw;6-U zdHkOJ;^~I$GBdh}uN7ttVC(=kO!5#HOCjm#s6FLj3 z6!K%VsDJJV|8Y;ZL54q&ebC^>e*kd*FtTd$I};ctdXW5*k7f*0WZHt5NF^W51H%|i=5{PGV^=d?t+~}6v*dIkh_yxx-IpHt2 zA(HpIO&g@OUo1}(EQ2f0dX;bsC%6*%F++#I?p9#@xqp!sYPAl20fs(s^iQzYYi*07 zh$az4CjG{vr9^gGx-&q4?8lxSG#f`k=4~#siY&e5x$FAxFwhOPr{6u_X`txkai{+! zm}LMf+=A`7 z$o3Wu&1${2rn)gL`>WMwS|_;J5o+YNIpQbmgycVOE1^@k*hQFygWyvLoPUn%JB5Qk zALd`!aUf?xfa!I`fp-^YE-MZ{Qh2L1{_rR=xP*}xaUYwwq!#kScAV?^Vd39phxfDn z$IHg5Mgxvl)PLkOm}jC1g{1U3P^zE)$IP~g*zOP$%bDhMF-E!w#14RLbA1i2jUhTo zIt`g_{@p6br6NEFQ62rXhzI7#F1atMafauG!?S-_TQTs4Hpy3zvpP7 zQj)5<=xLI7Ml-zTX#PxxEknJ8 z8!Id0-jC&e>@gKlz?FLZTs9!XaN~*A$VVhtfD7w^mWWlaqIleQmyza!v^`nZ0i6Eo zGk{iS8zf6&SYS9ig4*_aXrD&}Y*3E^nX+dzU3v%<-SkQ^2cT&?q#U${ABLNSO5J>6 zA~@QQ^|DCL1Dhwqe$M}zZq-;I(i!Gmzx+XRTp_LD0CM3|5S5XS10Iqxa%K0nELl$7 zZF@R@WlDm0aQ@m<`>xt{%nftg*w|xwGZab~^$s(m`))~dILh())W2Sz%4~4RL4W(R zg^6P!H>!Oeq{mqeO^3snpu42PX*!*p+q)Jx@ZcN}r}@VMXlroN!X9gIHL&9tChSu^ zQ$J_|%F!fQ{taIJv^DYcvC{IYjZ~&>*o|3JHQEc6+HZ?I4P357?0>6RuTc`NRLqsA zX09P{GTD|zIGmlMSD2?$VgGh~oYN=2F5gwl9%hr0!Sd1B^njk1YvVs&tu2=pkFLqJ zYZxkLIhFO*;8mq@zbI|_@f1`aw}T#`xu)`4$(XZH2V-L>H42jyn(W)+}}gJ-!?;m3w4}yi%gS zPm;btU)7d%z)N8cKQUO%#JU^H5FI`jNmP|n%!uV0KDVQZ*%pX3NOmc@4;Q$Awz2QACMpB}DeCOLt%=Wip5gdbHzEnbb zv&DgH#s3^^j{I2C)VXGCv!;~xX!7YN)8MMCu4b)D@8HRMHvK8|x-=E{>0{|E?+W{; z)c>BN4{uqdgui=U=ESe1W%l8@Jh?O=qjp{9tl9E0e%X?j1LtbJwO@3*OdJnV)@WAv zp`<`w3CQqkW--X%vpuk`l(P5n9^6ms0!BA_du;QSkBglQ&U;O4W+(4`_ZH4>Z!7kY zxZ}*u=((yzC^g5HVegU6>JPNzgQL->Ba5R+)k4IooO@)gB2o(nhVTm9OOZSnU*_MD zGk>4h6AXUQwYM#I@xy~m=i%;=dqHXF;K0zzi4E5rKZMaDR1&N9mSKgxTcSyKgorIO zZEg`d1To2I(#9CQvw}$GnMh~i$J2UNuI}aevj*SYack|7ZrhdKI(91A+;NM2yaoSM zUVqrRXYLwtDb6_{`Z>PNwu)XA}AkCV9w;JU2d((IYnCQTcmv zF0!#^q9UGOlCeRbpS+S}e66W`o)SWOIW$kp5~glkwY43t15cDulDBkI`o&!xU(0Ir zrtYhQ`_0GBS&lr|e~eymV2Un7m$~4V8=ccCVJOV%nw4Qw!MeAq*EZ|UteN;%!Ks9z zfsBPk59gU$>(4s1CQrOn{F@ILEZtFWTslJ7G`Z$IZ}~!A3OR`VjL9g|THKQ5SHJ5X zifc;Cp(B$Yz7xa394vTd5`#0 z{5m1I2Jgx><&)TAi615pKaGlmgDXX>+TV`qc{W*te_;|ahX3|Y9cf(VNHpni*S_UC zPB^%yu3CDEAH&tj4HXiJ0wOqz_O=AO$6>Oeq~}At?efgEy;t>lzL>_dE-8f@#-U$c zC7^@t7T6iu)$|JZdFYCb(74UI%uj_a*|i@Jog$M1GL)MG3s2azzU)r4HNp;^yg}?) z7@_S%eV7U(1?d$qN^&>cGtaKIxwcfh$TI5f*d*9`ENj(cWNopCHYw2Z!UbEb*$4l? z$=q+=t910(p(AawHXXBCl_xF^@)5q4xhPk6#G*UNW=F0DBYzTSWL(%ck_)A9UJA20btamzB#n}ekv`F|N9=A~f|BXW-Zs~| zJ&VwCxEhnZs{~sGk$O@g5sq(z2}Ky^TEZlPdoOy=5cAR!-*>-Iju<+X{)XI~PTHc7 z)n0VCr+8MCJi9oGA0QvECB-(GP(;MPDydz&bf^uLIcS)KTg!tZd+Xz(>p>cN>~-{1 zs<#jQa(4c9PEt_W(x*=KI9kgKrzQ6`#PgFW0U7+2y$M6FP#EtD=|frMN(;s$AIqMp zs5j_d5A%42Js-H>`TJyiXuSBxpE=ZT(%ZvhzG8lbfgxn*4ZWi}d>4dI*OZhE=rtCj z)g^w_Wp1oLK-I9~R;`^5nwNA0cGhdTVgGreCv*^_WhoYPz52F=CRuNfHpzR1rMM>g zvNOrQL`#>zH>yuazcq|WZ7|WCwQR0DULT|R3j5xj>t}nLVTz}^GdhVJbsH~8RF{bP z5lc!XRz0&PuskB$PUk)#hY+VYF@K6XG=*`)d1|>D4?Dvzp3x0+UFx}I)mJWEICkb> z>py86<=^%sd6!sRxNeIb@Ve2ApBQ?>!oy|Dyq+2tc9B6ibSRoWDFB`V&%V0yaMH6O zMGh^4%GTufGLb_gdXDF#SoO&@^ZF()4!h1QBwTq=IdTv(uI2y~ltdjJu z%E}?y2K`f^IxmMtXk!^F+&oUy|K@W`$nN06_*F<}Js|I&rYplO6NlJ3*P3GXSI)@zKo#k$O@IX<-I(1Qj33z>9fItz=|PW=ax_gcT3w1*1@ z-APlyiDseu(93|?OpWK39a_cqr7#l-ozTNAwA&ZL|pus?F8n zqtR%ZSGg0Ewpr$AQk}EZRcdQ0H->*>X=d%42n3`#RtVubD$O||6)Js*T(ih)Gg)v*lCweoFnMlEDTUSurAu4U&z8K$`VJ#*-P#Ew zdC)Z@{2iQ&|K0P-3A9r#`dYCMJWT;P!kD}BWBFdk{&yB)Qb{XOw7%KC2XV8_E zWI!MT$ADMhT;wifV6on4{pKCdmsWW^oYXLsa`zwxhPgk89TFf`o#nt>w$`HBXJ`}B z8T#!{973-C;PXYKzF5+}WFj#cX6d%>X)Sd_F>Btlhxw#_6!>KKhMr@|MKx4s|7c=mG7^z zmft1)eYR2X{m-@KvF|(O@T$G;LSK^zxQmXTET^E-xC?Zst&O6&&Llfw+}n2i38G*-sy<4K8fJ*8!$-V{LuU{Z zV@YM*E|~ zuB{_mX3Ishe;YPhX8-1Ibp5kaz2QgpeH4_>%n~|kv1mQIm{wk$t#u~b(KBqwRhNYh z_tn~oTawFIgpKg)nvzoUfgehv%>tFhzbT>U#-WrusrxL(Ub-V!Gh_Gxydj~{?YaHx zF|pH^HOZ;E(V32 zM;7k+IJ6s=wlq$T&yfRDQ5}u;yQs;Dxf86M-Hy^FsdHd-66+Eu_`)|0&Dr`jB(bT1 zw(?_=l9}<+I0ZMrul=H7vj%q73C_I_$z~5YFsaYgs8k;w3|f&$MAwqOy1Rc%ClVzN zVU`ET!+iui{7JHxz6Q%5!c2&Fk=5*5OSJVnuB1!Mtt(nvKFR9+p5v&eYB?1gxE3s* z74&zxD{bP2t7mhoU)P~e>yKtqZ;lTK{u=3#RSljGj+n@)7T9dwG50C+mZ)8S*(Xn% zj27QFLACFmh@w3jGkg97(e43mWtG=xC$H#FBXxv{-l4f<@Z}FxBZj1a5A%$;jk>|w zOBd!}Owpam&c9EOTd;oE_sme~$YEO{z`U9j%X@HC(_3yoCp4TGw9ff<-RBHiTH^|4 z&8QnrIS_Q%C7Ic@>aGk*MD*UMA9u|W+*nx(_r(o@#BXyeiwnX}R4vz-i`!`jjo+nw zo0lKyK~Z~>zrVYU!mZ}Vzs3A5T!}kg_A%v~o}dfeaP5at6)$r0{zB({!JoeO{AR>0 zm~IE{Z5+RQ5^7VI;~9OotQP#Zi(3!1Cr6q-@8}J^nTQJppJx?aZGZUnrMzX++_@b~ zvN7erxLTB2tnfn#O|rn7Iw&{^6071lFh`uJB&?3q1ogf>Ay9O{QF2x=_-uY#${mli zj@xIhNY3Wi*e=sKMxMT7ah{NE5@Cdy5V%i0eT~4kapQf`n@Zb$>KNs_vPVb2@+Eu% zS+X6~^-N%zP8zqaJz!78O5?~@LKg^E7pNCuaX{br6$^YRvDcleN*Xsz?y!ce#MYV^ z0dL}$zwPAXburC>wr6r{>)LOZYhPhIxJrG}nE$Za=H;KUnSiW~#hGV!tX=uXf0=py z+(?o=w>=f?tZ!MJv$1f_I!Cizbu#RF@P&OlaaL)n)kfk$6)SrCHsn%yYgjQqv&A2W z8LzcvH{X0ec(8U(hVgdzP)keO%Y2Km+K=^0{>{hX_4^#66Wrv|V(lDk-`w_T@hW|F zbMatMlMW+&k}q8M$@{iNZQhz!$tRI36H;;x;$ELnWH;{GyFZS(U?syOofn$QvWyc! zAK9K{6>Te8O)zJ)M@%fw)})HotghV^Mj6^MV0 zMGL{hR~v;d$JT;eU@+nT`R04kU!R6WbEDA{qPa`hC#H$X6iOcV9GxVF4`Fo!4U%9YsZ6`b4KxQ?@Z!@VEHc=dw$3*8}@|yXY-pd1X!!skNsLFp%Z7k2(RjjD{VIG-R3`!zYJK zJp3+YC^qx_P|<_B4uGEg z#FUqZM^43j6gzI?!^^OHinfdQRs#mVD}|97i!08tz5FrezY=PmtwcnCyCeN$sGDvc zKUbB`h3W0RrXMomX5ecPO=`0z2)L=wv{iQ%N2Zb!crksVPnE85O;OsOA4>-u4QKVD zJJ&`v4F@L6ts5S;q(&d$J}8Oxm#KWgJ_ zk@x2X9rvq2s}F5tnwYkpd_Tul6ZDx`I?QBLVXMoqol=;L;u*873~~agSzc`z9fnV9*ksrWWM-&(HrHR^$K@qESt$87hBp< zPsHOjsn{c(DIz$pcGQf;)rBx!v_2uhPQ53mjuVq!H>X92@`Ed9@)F)(1b4L^m4b1x z$Qyt&uRtVvXGNp=Ys~vRewHtIY;4&4VLNXV_$#GH?lpgaz2`jslC0`>pK2xX;(8FF z*`Tnj7UwLWV-{s-LFclF`|VART2`|9TJVn~m#cE^zXx*zxw*GP6b<@+=3s&>d-#!q z8D|Y2o$>yt%Dp;HZfhsD^xGYaKiP5LO)}0lt0klw4@$9L>@TklYWf+VNuKMskl3!v zRI+6r@Y57!X-R?pBFi(MF=bhR)iP1 zzDunSWSb^p(rQT~)n1MKVQ>O1WHE1S}$vojvJFw%2ux>W=R`$V#$ubpIO4lsSuy}2zM za(PdYd9`{knlN~)3$vcGM;B#zftCC<;IOhSvoG8O$18tRvXR3?uoWGsk@t6ou8_s> zfa`f7H>*A;DdaR&vE#m7EJ*P9Sy5hF4hXQd<(jVgz`)QGZySWO>!r9mTdj<_u*rb5HB2_EJk|9q`8p?N z%~2Xx?%qXS$D9;Oco5~X2n}bSHu~DYG@cWa6}Vd6CG|RUm=N?+wrj$+y-iC5_v;zA zVhNeQnvn^Wsk6i-iuxxfXs5xh3)>R!?#viuP^q} zoP}0}kudtQTP)#`!Qn&5(aM4Dr~3Q$ga#EjN84z$zn&)4sTu`6q#}J@7Vq=uen6hw z;I5^hVo4QpvyJin+z-eKaI7R`XOEo7$G;D3$4?es_oPyfOHX6FpG8UIKJ|ZX_bkkb z&u`=4;dUhyBIvo&6YgkNi`Or73mm-7VI97@}l zNJ?bBSdD(fyPH5vi=~p+SC)f6@p*Rc?Xv87nYZyK>2Kr4?|*g-|3H1Sh5B}zead8^ z*eAn$ABI@o|0L+SiYK#?y7xlMlZnNF-1gA2f+Ld5ff=0wrv8e2nU4_R zi3@V%^pZ_~A2r8_{;B=AZ{iu&0=(>8?O_8_Qd5ifd@_D-?fWowuj0I_!;ld@^!WW4 z9+dTKHr#4)H71$m$_MmTr;On3Gnr3q5puqp)wNio_O>w26c_Z|TyCexaU<91v$nB5 zp%mJ2LyS**q&7h;kRK#I6*bDndHUTTL8_G0#|nH z5>|`wV8$}Up4yr(4!VH5HsNbNrOoqR-TrB88gzQ-ghRjt&`xV~q1`dhj2r>lUOt+F z(X#TYkEw}8YZD9>G&<3FIN;4Qfj5@}ctb7>cx6x1if1}O08pwsza~;A0vChpcEqgC!24QW{Z?KQbMj$o*PXXYVdz`Xyh<`Purd->U#x!M ztNcBOTpM>)Bsq+s6Go6tsiNK5=p@#kD+t~_rJEUSnhzI4-vZl1ztW`MwqXlKCd!YiyILA6Kqq&2kVRDJNL?T7rvK?iJnLU!IODZ*qh(q(gH^0W^-1F@H0Lt^aj6^1&9ytmA z>vacqu}h>){DdtA9f)Ll|K}bw0#9x6Y2hM-_DHcTz7GAayMH3S+G;H zaVM$OFMFl>{+Uk)TbBfiJ(mRelbQcVE74lA9Rc>Yk>AauXidqYSqt#wWUF=mJe!3g zz#av1>6rhh!C33IDWY2l==mo>27K~ zs(D~c)G(763b&7iu?7BXAW0$pewN0SX*!9Rz!6@I&3#_XuLGjBF;R9oWmp#rgAyjT znE}&8v=Kt^ezSbLgawv-#qYdTtT^$f!V_^BBC#j;=Ec!4Bg}W#Z*({!yAkFgrA=@7 zN+aqR?oSC;QrwUlW{FoI{w%`;5C54t)#N7Q+%nIcRl{?JYTxl^^GmRE(4WXAH}^&t zhh>|cxqV$ZcaD4#yY(@rtNX<_5r+^*>jOdYu@R%Gov3=B^KbSVy;d%HqFl22;z!m) z;J^YhG64bp{{1-=0oMim$@JDxEYQaPCBV2#T|Ub38_#z1MnryiQ29gYl%TYRmoI2$ zIt7A~2lC=Y15B2F>jCc-?1B;g3lHLozM$V;EhOR6L3<{r>%x{%m-~My|?o zT-47*4sPwSz37T+MmenEM~Nj$n>6sbegK*WuypGujDuKfFO@I>C>O9ViQ?@Xap&sY z;I=t1otsWp5D~^*R+we~QedD+yvWl%&k1}4T=tgP{`4-iCYhMd^;?4G+`&YljcEd>EyVaRI&Lr6( zYah>lIUp+IPVUBEr(nZBDQ{3ozw1WdZM!m_4J+HCPx_PE&1cKtn_*_Vzi`uk<^8*c zvU3>OBc=MMk-I5HKoDTdr^&u=-mHRz*blK$vd+!B{@*!1V(*z;FhP-Zs zT%5cn$98rvVe(c6ZvFB3ll=Ge`Tm1{asc2jTF+`VXWMQM6~bmpD%JBL1vO(i+>-8s zywzEh$b;N|RJw4*p1c~A2oPc@7Lv>a0G95!W${wGmV6Y0XFCFyKEt&%Ha_ISHKmC8 zK#BC@Fd5SX0y)}I=N;L0894R#1NaIGN*8_0BqB@m$}|>~8f_}Ji#$m|F<5Or<9KAfdXVjYk+Ge{hM@<7o2cxi|s`9XR z{(4RflAOl3l!?2Lh8|Se-aQQJdLj%^2cZMR6|OQQA)J;+A6?RqyucG#A5WmsDIEG+ zM+t+EH~pEJl6LH^PW|I-$F}!QA?-75uZ#ZGj}lUFI_&@UpG>~r&n=S-_e7~XFXo8YK~Q6b zy2#Ceqzk>Vr2aOt79bz-;&v1V=1l`&z$u&i@Q8tW*2;%Y2Kd-ca-j%rph2q$-C6Hj zKH@Ez28VFC(U=oMBSA{0M0S%6mhGix2y?NdoA-#Jn6sPO1hwndA%Yo_I3Z%rgD;5@0_5s8F3T~RAd3xL$XxKZ2G)JLDxzC9EZe5_7nhKBaHyd)~CcW?~Lv#V9 z=XU^IqVQ<|s|{XhoDjhoj>1_1u1M^pc!-oZ>$x@g52Gj4|0Zv9$Me3 z(wX)Zw(A+7fKzFUdQ_;5Pbh77sj=vj!e_;ZIXyW+fXQW{*TeE+RJVVr8f%O?ms!EVnFr?8U4V_Os;)1|H_*u-JN;y1JRa$l}t3#t^Ni`@SP62;{U2w)=Or zL&NW&9o`qb^s=UhZ`sb*BNcQ=a+Ku<|J7zk&2k4pU*2IF$C8q`KxyU876n!^pv9{O@PISONE_^tGlb|?g2Cftr{FdIizSEWo&;n z5usCMa-RFWxk2$iP!pDvsu8W|epKpSpu_*}B6C(r8qm-s(GBseY4CeWP6tRMnr+q|rdqU7Zpp2G3uy z=rLhKX`*iQV}*A`e(lS?=i$lFU{kU8$v>K!@?JI) z1GLU0*k2gzeUNP-F|WY+VcB$PEni-ey&?VxVY19;DamE-Dy@-PEoM7N9;_BOm)0J? zVgz*#(fDP52k`H>9VT?X?8ezD4R9r0uc(b^inqP4_tpnTqCH@!M;$WkNct*a76wQRcd!Gkyh1+Qf0wB?raz~jBTaFB826}H^- z^MUJ=aFjP`r<;patGE7Imbk6tx-XW$OhI+teolSb^>$*`nfZgFn!CR5nOx&7Wou7p zDM_dvnSbW+?An%M_WkfWDos9A$@8aL>^0Ga z#HxK_s0%WdNkY@D!l0OkDPlICYJuIr2;)K+uEDPgiSk0(ey@muDNe&!^m#(y9ZrmY zV!=wJxl>Z0RnqG7K?lt^(goGE*%QQ{$A(1vemh;W>b+{rbL_GDgGSkaw(GYJLv?RQ zO?=fmW6SDm;xb$N9lD*(#+i3J#v$m&OBX7>yQs?hHLDfQd%S=5qD=g`&1T)IG<;8N z)?<@&-%N@!w!S-xN*-dR(Nyv|y-7=_n{e47_YJsQldiu2A*t4jlPN1;Hy z*J&u*w$>|9mE?m0=23BezF~DqH{Z=z$XAv35Mfry(%@CgV6C!MQlp-6EGhCHNYM7O zwJ{AHVt&EZj?vCsCxmeNJq(_YVo5z`r>VN~$(-WY0pS}8x@gtp<;5<)ULciQkKuq9 zNaeoD4xH)DsH+5uB4*D$j0A9>W-&hOJeVcZ#6Q}`JUkmA`e|gc$nj3ni)u<_GKQq! zT}5m;Q)F`4?xci!d>QsdS{iq@iKe4fM@aXgC_+51TeoeGdKzgRKnZk}^boEZz<$1t1+9 zEhw4f6;Rrmk6C+f(oARPzoJhfflL0gq3kX6inpHUrdgC|ZQ+3}4|Q&l zh#8(r_oIgClGYC_6p#=)leNvZ`!un|4SPD-h!ZpW-l*^%Iop&yi>19NQ;s zr~|g8i_RFqX$?KnZ0ccqf-7d3YE4@NZW3s2c`#L0mwO+lLt6_3)y+MIRP4UF2D}Y- zj!)uNYT9wXUVVZ=NfgT*AKBz`Zit|P`OcqXnQlK9Fa3?wjZseHcmK39dwR`kbXqK5q|>4+#@$03PU(mMjPbckmUbX6+;KkI*YYIZS{ zEm_MWwLH8^8!adDtESDBks+e&^;xh$xXc~ckNcZ(?ZqXd`a53XE;5H}cE7oOdw{|N z!i&ZCupXjy|5vEw{jX5z@stj8UC+cfgZ`>v>)Fyw6)5h$CIKh$8mdP^q`#gmJ6(P;63?h=Iyq;{Dl9{*Xd*?%=PnxSf=2$-xD%`C3@111pamEG76aJPxoqlIwOAW z$k6HK=72Ptpym2EWFFDYQ}>GnTYmE$v&H##wM1Hf7y>nkPWCXX7rD61Vj=C(9apr6uRpl@=^%A!XN_yF;6(#wjCr>aJwp!Op2 z;QU;;&dY_X^bRe9oNTxyS%7%QF82RzJ_dd1e36j}561~&uc`}B#=p`#>zhf~@5FZe z!Ol1B_{=)BG_6b2Fg;Swe&@zWmGHOD=u8lCNw1p5ZQD_YV9|(zhBar7Y2x)tznuKY zx~LB6LMVfWwF!YYn<;n!*4YP$=~D6^!!&5X>@5Jzf`{&8G&=3M+Ng#TVHktY9v7vX zrgOu7K{^F}g2w{LS(d5)bdZxADoGzI60S7B9CXzl^gTC&sffW!Jd1rX(FgJL&x^#N432 zh!ND!etI4j)7nf04|5=t)h%-K-H=}~(!UaPA&Z@(r#{K1kuCcdwT1ut$G&M+tNcCO zd}U(Dm8Mh3mS))hMu_&LHx$iJiz{mTm@KO|Bz0Hlt}mvb4LM}pc1i#9l|Qpn4{?Mi z@?usIcrbv7)_Fi{iVwcC?fyl=rq=;YYM<7D@oU7(;B3wEHn=s@uLEo1C@IoK?$AS@ znx@jh_1#kw6Xn-Z1|*;va^(+`p)I)g+@l>ol#X`cN}Nh}R+~L_0%@y0v2ve2jyUYR zy1^4dTYi5aQW#hMh6AI@57bPP|Ax)g_O^=fztF7KWvSJA>!A@y_Le`5Gt8#G`3Z8l zAm#D@^>x8B+x2y&?2C;|_4$uM%+Mo_Xjg;b!3c3E&frC8*WXb{E6-_71j$3Ic?F z8B6-m4wtXJ_Y|IeOt=-ffS*vHP!gyb{oG0uxmTZg!v_ zJpF+j%Z^x52IFEnS_&8Del*fga0zQ~?V1mSDnV-jo?i#qj55>Kjt764H11mu{8k{L zeLNSi9xt7FThh^~M50K_Iw#4)LtZm<(#?w$ zx^Ojbf3UtTT%|jjgIFuT3d5?U?R%I7kqM7`oy9vJp1pKnS8x3M7UOGZc@t^eotb0z zSc02uO*Z2h@{a!q70g}$)e_<2_Qs+thvWNX^mO)!uZH> zvRYb{Jnk3ru0`ru4g=cYz9UG48~KN=e#&*)0mLi>ErNxn5b^>4<|-yR5*h~5Z<2XC zd7TJqz1Ux6GhvU1Yd}&1fBC4U*_zgZeG=%G#T_^)2_FMQoj>&`Z=g*s8FQH+;QcdC z3is*b_?aToO?jnRDozUbjZj#IP4@n2Fh+h)iS*z!#MoOKEP&Sr%$^`19U<2~qlSoY z*Ty^;v|?z@ZhD;Gh$~~v`8^ARD<7Wq;SW1a9U9bdYszS8_V_V+h%o*-*J5nD7nL76 z^adpyQv5n=$cx$>X#;qqI@_k!E8{l<;#uHK-WPtNK%%tUzBF3!+Q}1zte9Wfmrq`H zjQBYHeWNscq=yU9jZ_DM7zYNA0i7(~Z2Myr`^WWKSwP;@FKeUCvkwMWJD2V%NV4vt zo{~YA7elqG1dkDkrTIpXd^_n)?kcZMjK2IdNkwG!exL<{Y}PzzXMYo*3FrKx%(Ji2 zlwRW+{I)EuSBhEJO~s&4o{+|wwvw|)xYc4wZIa?D!=>giLz=e#A6su84|N;AeP^e! zgffVViZ){>T4W8`(uy&b3S)^0g=AmSP()$uvP;Nd>_dn$5<(OjvbK z-Ouw+y{@i!y&B)|d4A60cpt}!+vfs@P`H4o+uF!+S4I{~Y?!;_Amb~Q7_!L%eYTx) zA5V-Yxj!Q?+^bSC4s*}c9$$ZEZ4F@TZnTL#Hldj%20SDbV$?#qLWL8h*gSbJEM`H%H!KVlPe}-Cgm>~P@GOr?=ujPqCe6eeFXNR)0 zKJ~ip;9kn}HInq4JVyd^Me0?z_F_22f*%4v0@H_xVCfm}Q|^KJCOxW@05C+j1BiDJ zdiz+oVQB4-G&lUa8Qy)^DWX#zkdI3Mt=(8i*Mv=cnFX_gJIjOpUH4E)hTTzB_8*iG zt6r{5xevpX&4s3lus;>iA6+g}F9IF6MGb*pmD?#^JO?qC_Yr_|O(6ur=35Z~a^7c& z$L87q6t_>1HBaxdM!?Zt44u`zsbsV<+3LWUczHw{Q9Q>mbf7QE~fL6CLPq&0gNPR4sm%tFr?448{AFk$9!xyqJ$5B|wguO%eOKe8|8N*Z0V(d{BR*4I|{_HR75 z-v;32)5g%@g1#~~K_*-{ij(2PbU5yh%PC>R`~ZXpK)_&Q(?~9C-=#^DLF1HykJhvE zwo$}gsBIFu_z_XX5Vy_@c7YhL>>ikLvT54$aFr(O0YG32fl z0oAyklfl~|q6~hpGo5~y_VfFt9uS2o+95+)Ae$U(34j^?3!8^+D+|xmIBZrJ1s8@N z4*H9&qF zG)EG7Sy-8Kk33hEw|&aQ-{|B&n)%bIe*NA5&v;P;8|T0!01D26i%uaIcG`GFM6vf~ zeR(Ou#a_TwU9slp+U4pCJf5uczHt~-T1IAnv&Q=u$Fg+@fmw6iN@=UwGU0J{JVlw+%MkF}g>hD}j|( zNwqd2KPbVUcjSjd96v}7A`GuI*xX+dc)5uCtvCjsQ2wMEVr$zXh}$F)E(;m%;1mNG z%VpkxW|mhGL`hq^Mik7=2av}wJr!XNfKa%APNr;2u7J-n;BL~<Ea=2V3S;zsd7oD87UN^fKjn+S*txm3gk@rDmVdPA60cL@&dF>-Uv;oOIh7UO)E=bvC-a6z>ngHeYjDwnLMmOBUVO<3aYmA8#79 zlUZm-sHcH$92rT?u$GT}lo!XYjtR2{%=B)%K%Iqer*8O~4YLRYfFNM)L4dU<-)?FO zMp61dvhC*0-=iiY3ZRA=0*!WCciuwa6K}&Tz$nNq_Ux&Ij0o^f0`QFk%`L1Xmp~<6 zJ$OwrAQwUheLT8C7c}mJ1cKjBBnYQ#=~i=J0wF4z--?4QMTfV=LC713d0pIi1WHck zDYe!OXurb{27^yLnR1_%6`9G>Etz51sHVss5)xea;~6u1z%wI)cr*ri<-TP8Fbq7L zowg-%sy=WfT2d;fl0)|VzpUI#BrEq{l;M(9{FLYE(kT|8P$K@a+z|}%i=tO)OFt2NYO~2zYyW@xCnIh)3{-4SHT))0v;mZ{DyEB#f5(L*7W$o%(fTcAT+? z+NbD~VtkC!QTXumL4FNSIyKwU(=IqJr2i&z3_Hsh#&onnoE{Y#k@J)?mjf@>uVxmt z;O(!(>kc*Lz{jzk$<8zGEQBsz69*THl8(gYTAH=D6+aM}r%im?-|#V655qJs!xu$T*#w!+2*u_Ag&b-rDk6Mp}2T(+_bb%}5mI6gEWi ze6}TXt9GF!xcw6>wpa?H_4N}81X`e%+4Z5RiU*w6v01lw6jJV&*~s?ub+d4?S=@=W z`ev{C7q`K#I;pPa$s)2PJSTwLbU3NXTQ7+9Gh;scy?Zti=P~$RPGq~MAwurt7f47_ zCQv@-5IuzX)0Ux(2)x-}EkRh}7i7eRKN8*so`Ijx+jpEi*majvK2(Jg;CsP+nCVcb zvHjIoal1x6%=7W$@3BkekoD`D`2yPt9i)PltlwG|uX!R_ttKU!ueR|6Zg?3JL}<)uDY%@(z8mfI z)Gx#o?Ua3~xgvs`rr}Z@~_*<3jn+1xYlPndeMIKib9^J% zCCw#m7TUP!_eYu*q%bFEq+=*v4G6~vkSH^_D*!nXw;jYpBhg?+fN9T2N&*RL!{(6# zNg4F+XZZQ(1DNC93=52{p)lX|!tNsCP<>4{kC0GFc}XocN$g;us%>p=Y2V->Q!esTQe-HQWM*(I6>U5?0)R0GVxjU_3*-Um z&xN&NAa}A>AR-8HlmaGp9g~uI_tLbMR}`yW!81e0)QdEVHx387EMm8AgWcmU%(s6ivf4^WP;C&9jxk$l*NuqP4~ zOBuB{QE`E@CHIXn`ljZ4%rEh5DUkP4HMQw<7CkKU)B0#W^n@7zYs?NvxM==**~cu5 zl9-En?KwWQU>66|*!#=$AkN58o?m}I`ze)+@zpXB#9qwHqLs3{R*ru2-D;3u(VNsX zKzrQ`?UNDnco;e(!tsAoNURY0Xv_;D-ZT8?=ZmY=|7pe!!GFCF_<6vz4EoEl=*M|@WlD0t2lt77 z#xREd>mv7!cFAD;e*fCSr;cot*?pj+vkVXTvpz8dO7<|J^oR8UjKLs%2l@V#b*J&X zFUp&B(Ib%nV=uC6C;s9DII+#7^VNIt$L}hSPqG`rmJMvO0gB|x;7g~Upsk!G5bviD zfXR)?NyaP96Vw$)jdNV zLoHvptIaMNe_9jGcKoU0!mH5k4D@KJq}{l_YeqlG70hK>{0vDjr)LS z=48&-yCKTYYpELP>MM#Fu5G0P=B5 zKD2!^TKn`!@?ktmNe1K!0C;juY_JY=MtNA!wD{1IBt&^n1`Y+}061*QAYeQndReq1 zf_N$pkP>>G8C_#Y`xj_|AQjsd>S5>H^DqPkCZ>Fpi;!6xh<}#R-t%tmNfL1CYVK_r z)}S|KVGQW>#$7+1{FYj*6dSx&(gtJ_lpJ0L%{u6Js6(oMPz{J>NcA(Dq+qQD2YeJ7 zZw&W6;{rhR|3;8@;B5CZ!gN`1UE}(jc%QppijlA*=$wwThnZW|4cFNI-&hoYDt|pS z6FD&iCHo76>mkRknTphBtOksii_S?jU7Q_pECJuNtMG`zxd zYA|hW@K7TE)pLeu_d`M)p`Paq4I5r1_q!Mq7(%I|tN|$PnRqyfJW_Dt=_4aU>KI)C zzY9*rsp{H=Z9;vN)(O7Pt`#Xph6cSnAG34B?uh;T+T*adiv5&Nvn1)&9xmXVPu*_lujIsh zzr5D6l?)U*3`|hA5YNq{$g00~`P9;u04wq=E|10epe*t!wWHwCxUO^ z8SH(o7el>~{Nab$?@xZO!Xv94pd zKbEyhQ#iei<+?upZHe3SUZrK13v@Q=*>t+D!6wn z@E7l7S91bgA2As&4e{Ui%KrT)Yi1jiow&WN%6xeviOWhy^R=1vP(~Jilwv&DUXi1f zVl*j+<77=}hX7(O7CDM)%8r2L*z;cE*1)6&Em+0IJP%HIM6Ob8W_e6~Uvi2N1bX0S zf!i6Q#0wX=yTp`7Ku)lCd0IOL^>Fp=L{sk(@h}#y>A2f5B`~*uGU;sXP{`hm{#AXy z;sJAZzjh`*@M($;Lch==a#zP~(@ zN*(x&-Age_(>~>J*8RigvJ%g8-;9;;;w?3rbiE3IxRij(UGcwE1^^B_PN5cd9<$!& z1+U0T@pNzSIY65jIvAliK!g$v(@9>S4dgDqLhi!)xE5FZ*Xw8Ia0=Xxf6=D@X_9^Y z-0z!_#zAGCQ=K2BLxckf9QH6Ju+`gX+9Zscayy@LpN~Kly0}e4UX44FZAe&dSD04A z`qYyVMgPSpf0vu8W9Jk`G_3eDRs>oEcwP9vkXhbUI5bFfgX;83V^9l7CVLZ@2VKNT z(2u}UcZl(oxUmJbwo8fE$O1YB9^e~`ANZ!xh|e}3gB#>~W|By|DT|>PY9TUHNj^~_ z{emg_Txt}=U!3_%BT#U=Pc^$Eo5y2B>#;;A8_s#Pvk#rVnw@if4iPiplH2 zDpnjvG*tqXr9W94$zo1Nn`_I=(oKvknwvwpr#n)$%Og;n)4sz<05d?`MI9uKYWBQ9 z_+2gQLaKJQ3W$g4_U9K67cxD$nvw=Gk4dhupe{B`Eal4gJFW|zJ*Uq^5YzlGqzR@t z{#H9{3UI$_f;%@$&i^plwp~Mvw!hY|Ie>>)t!h3JzZ z4P7P~v8$f6|J*kF9Ws2*pZ8M63qfP%&I9nB^{-3@Cp~gN2AINKsM;cX0o`+6kN||C zF(a!nsp_GGm*F@p2Wb-z7wU(PS+x~MMB_`DizC|j^M0-44X^_rA^rlIx|-0%Zh>A2 z+wfcB1hHV1_7Xq@%(V_d`yvYstg)8ZM<+FG-14PMW(#K95uZR)#YUj>AdlugxtVf$11Jfawej%vgZG zf8M|Xnxc3_eyQtY_j$wdl5~f`8W$ZAI1Y6Ysh+$;+S~#Q8g`b>@#An5?0Sw86ilw( z$8@c<_Lw-*K1HggIL+6PPPEigUS)wG3xoW$*~Obe5n$HOFqXkg6?i+wY2v#B=I-~W zcC$%)UH#_f8(jT1EM=vezWUElZ`2hnnW_y1#*Bjh1tkXmB7zJ$fiqJ5DtWKKu0P66;25e_dyepdcF#)LXv~iERIsS6#A# zpdr#;MK@$u+AXmid1{@bpCUabo(QZpAKks{g1ye~7Uj+ImFeZpqLo3(t!(et5otG# zPVdMGO>_afEkVG0kTHkF4rG4ov8E(}+n`cJ4D@T!Gg`#Dli(MDypll)26ZI#9^y9lcoX!M%v?^u1z;iT`0=E@3tb{S6)V{J_Vy<>rO4h ze>Ub?!80}_-^B!hLkM7g8uGDYa&L43>=Yi~zx5SVd)Mkr<|MuBcqeX z{&U?wNiOkq0J(WFDjHkVTH$t1>s!q6=k-wnY+xSW>=v-!vvg1nJ}AcG2uLXiq2mw$ zl+fD3>rKx*IU;^g%5;!%{n9By>1zoLdlJRVwak4QMe7W<8YQ!cMG&cVx|RuuQ_@rs zIhBk$NhD1G&R|i2yI8cVAvN&77M()#cfJUpf1J7lR+BE`|AO>I zkVkz(T|?tTKTwAdhuzshwhlc^b+X?XDJUcL_dGuAy~YEL-L+|~x0=Xp_7=YBW_7=r zY|TpuF?JRSO1vZ&UfA;0;BJsnj*EsCA`;ROkmm$WOUk1)ROn4aGXRL}iLP*JRB};Y zkb*3BM}^5NdhPKM`U$Rgm1itr&rv~dhv}HEVTFE=>_`fprIr)eefYp$Z3QWZ&X%&c ziqYnl3$&-%#;?htk8x;qB>I^`9M-lAO>rljfCCc#X6$X=j%rFM4t;(h$lemruUND) z^NY0C`S40@H`l?8xH`FS&`;4`yKd<(5aTyh643&R!rx%pRn0jP**YH5cksI^D*k7~ z779C1E|3zImv23r&k}#H_yP(k-a!k3v&BsrEd*8be_Nsj;y|5%CCc6A>!ynRYl*Vy zYYzys27i19dG@~+#Zy4YRtg5*^&x0J6!;(y@Ci!S-IO}&^|oE{3yIfG8gMFEo@YhR zlRCMh!{$`|tVKZdyah3a5z-ykRf7BA?CF8zTU}+g=Hq2jm!)DFlLwFR^$2Xs(I&Z; z8ub7=XDyS!kB1T(QwWIiqvb~EbJA=;!R2D=ji!j=2`&r{6_C06qsSXe+1CT&#$y3| zeT(;5zefSyjm?*Nop5u$r~}eoXY6lcOS~Id!(7nsl|Wekgb^>3VoyN7a~ljY*S0qA z9n>b@(263S&9)p*kwxYTIq3rgUK)xV32MQ2@w<|FqMZ}`I^RK9o^N8FAizqi`{H~}=uLjS+WUZY?H+4U$%KCWmC#dbG z3EF(&eSM6Fv{<}m?fy$00CIF)*Ym6EjEMqAZ&U!32CVbWC1zR_Iqz@et?G9C?)fpX%>kB;ycc>7LR zXsUuPXmk@D^OQH$9oP&nH8cR@9(<&sC%#?WTzt6aL0%8@PX>Ar4x6RUYT5Igqn+dkX`?mQ#tdW z>Nf$Z-`}1F_cKS&8bZej?1gR?>>Y5ppmPPq(37?Xk@Lm*Zu-%*KQ3j9q9e|i_paAF zm|O3YJcxN(+t%8`CyROdfB<)mCJ6A7T)~lZfo=o3iQ+L}?4g{CB+vaeR=~d9#OUU( zMqi?|^6qh=-d>3&J=8tMCleOYW{pzfle$T5RlUf$B$)zdk$^ZBNodKtFNE}c9rB(5 znmNRV;WJEnN}e&eU3w8n?4?_vLqgATA0C97J=b0Vi;-v948L50qY7%Sx{WF426#}b z36!pSjh|41xQ;HG(V*0j4^?z z^A2Mz^B>jWP^~cwk)Xm(+(5MM;-5fo*r&gSkF57kydGIqYv!?9wOklx+pMViGho~m zo15Elx5BJ+>Qtm4G?GxX$C)Gu^Xl;xZGa6}Sc8gh0n5Myya*f%F#keTCSaq`n#!tQR2N!yab0ee-~5Y-jB?mymjE%^Jp(d(`8z5-MkV!cH|`m4iq9etq{x-EDBHUoPMJ z?E9_VN=Z3wCEM=v7ilHQJ%28iIXAk~9%#Q)J_>o3DuMUpJb<%II*+-Cft{dc2puJF z+E?vq)8UO|@E@Gbb&2;+2d}F7ozGh5Ji>>5T)`eqATT3!rc^jP(XrmF$t7}BSV~ZCrc#}x=?tgFZKXMA_IJZI`Yx0WXH-0zygmA+Z`7gbeV&q;qqYY_0D|MAQS>pbaqB`>3H<&yfOwO``&me|IP zoU$aVogQwRw7g=;#D<+P9jsMn%S_ z$Bu9BxF0nfof3&?km~JH8C<_}<7d>{mt36vq)hK_VLi{WVv_kQXTPPENnJ!3?;a zW-}UmXj#uv$#a%d=|=G5t__GFxVpClB0r=Nk*Xh~mb4!i(wv6fKc*@9-&*b`srk=6 znK)|fTe&jWGa~P+)@OB(^e)}%;0A7CS3$!$$Ca1wrPVe>Ck~%~6`#6!TiICFN?~r* z;$;|jD>~KZ;MCEqYZL9wlZ_Xo*|;wLey5%{wECb>GI7rT?Zx@3AnthAT^{Tw&GMb> zcWoR~m^1qrY%AT=dgA-q&D-I(cWf@3V~6fF*q4uelUG-N?o?22+n>D< zxMCD;gzi^2>ewHiFP3JON!sy_0accElzNg{m;oR-|4x)=| zdM=`y8)6r%jOEf4^gaK)%T%=KH^1|5k*(+U)#yu0FKgi3UcxQh>2=EY^v4XvZz_&& z({_5)#`(EMbuZu8EJ%-i`x>Q+_3O&uZ|6Y`s_o?`SKN(lf1S2@zAMCXP5$%j#B18? zG=jD9a(T|872B@V6^>%Z_5VWVx;UZJfm1q#LNTgFUt_wz5(J4QD4T z<`#0ZKMEAiGZ(;nIb?5_l)ECnel5UVVTQC0L-Ro)g32$ZCpC za920Z#6+8+7mg!@Jy7TLpfku&e`OE3yh?<%l_4qV91kVe`?X&Zsq&}$7590kpU%Te zgC|Ht9Fvj~x_)&D7J8PZ(Bk@Xm8}nz3X=^pPbX@xd^Sj4D@Y=_<22afnVbyX_mvYvYKyD2>|J$HSR zg&~ixZwo_^Blx+SZu9x|vn+Mz&byKuo8BD_Wj=oHwq5)gHb0pQUI%QbY@KLIqm>`( z#Pj$o&2p$qy$*M6eMPwEz;*YbDxveM+b-kLY`2#=KEqNioM z+-@8EnPt0c^6kc7qK;bnvTr0paU;>^2U+(|;Kz;Has_TH-tvp-RM-o zTEVf*=jubdJyCvwq|ASUsfJWpdt15e-5&bXy&tG=T%U|Z%6kr= z!t3vAofDLey)F+&wq)tdZlg6xvD`kHD&Cv1G*Ag0jV%9olsWSz34A3(0AQS>*SP{p zMGI-ZM8(GySI;4lDRn&2xgHjHnIR1*PauQRW)F$=%7|pWGAXZmP%L48_~axWx*`CC z>~4hRgTd@{;1N6#+BysXAcg)3&6e7I_hP!i2agVfT3VQDZ-jhQp8(L0a$_8)X9>G_ zIZ>C+2${Z;!#S8#haXDC#82RgZ9~Q}bwr7WcbsO|${Qj?21{8d7HFYY}Z$}Drft>P?~m?e^Hc1y229l!tcXD+Dv+3 z&`lHu33!-K4R_DbBW*pAJQSD+~l-6)*w{wS%2pqaqDuIl5&XrSDhQq=oO7@q?-}=T-!&sBZw5;%2)N3zcJ@78mGTR=9hiX%e6CuHS*w5^hFgiIE zGtull`hFs-?HWyQVdO*d$*p;6jh?aDoR<5WCP`#d+P?2bVBZeJQ@@|nf_hxxB`qWX zikmBM>4H?Ac5|%+<5-XtpB{+(1UQ4 zJt@-I$`bjYEQY+Vhkio|8sYn-~<=haQ}6?Xxzu-J;z=4UM|>wWykgF%zbrBzwC;ps{64| z)pc5(A`>%KNp}#d$xS?*zWQQ`yo?Vw-U=mMXslabU^e%5-;U3`?siw5cG!{ zX{LT6O(tF^Hq6ey+LB&;cRJKjlj59euz0ZabfUtJook8umKWAVw)PZ$xkCpzhN}15 zp7lvt?6#tn6PLf03UK(-+(qO38h+TM%<6Sf^vuqWnR{IJR@D}&t2_`y_=^SXVY)p7XNPZeV6?ootba;E_CNz3zdqs8;Ev|zq3%k%XP6#@=C4@S;+&7JD6no0Bg?eyZQT48#i zayaoY{kJRvNU^LH>v7T>8I4;m_Vf|OCk^^#Zqz*P`*RJ*^8Sfx z?m7&%d$wSG-l_P`ryZLeyLH{WmHo#Z&rN^&S?<3a^?Z%_d*j~k?iWnn(K?)NNQE`; z#@#))5O(imWteMk0;Sx0tiEISQk_(uO&UC;dLuicI3^6&4&TukuKj6AOR_QgmSpgt z@>@f`w>-f(uhH(Z;I1`Su^#%=MkSxCinWEi$7sR^6WgcV3U1qycD)W_y2E-~@ioiU zJ8Vm^S}^}`dZ^~$I=VT*Ob?v+lEX>-sWHtWkL zhvC)YuoL4GFjjmk5P>h9`fG_oZe^>bAy*GG-0EmY}tt}Dy87{A7B!>e;dkVT! z@w~_5Vg*jdT|jg?aXf5yWH37{wCWA?fY?YJ)cVcQ>#AUX?U1AaO5co`HmG%7#=g){ z%Mh@U&J&NrZxs-1%(V}=sOPk>C9UOIhQR+ghI3vL0c*Zvjbz!234+AV7`<-2;J#3I zJ0JmA=WK?QcS;snme=LsDCNiZ@0y+is%2JdGK;9|z(z@H<)ZiRj=$!8#`v1LTSqH3v}asSZ>wdnO=d(A3D)l*qgYz z(f9GmOK!*IFlK{r(nA(OHg73Ajq|wzN?gCHX&*#Y3DjeAs;6H}!vHvO)#}`05>d6h zwmq+S2-}~*uSJP#I1g_Rf5nnhk%iBx>D^gI!hgdg%R3wP?04iIsOEyKjl?hn8aa^G zSRO&%gUxyDwdxRp;P*eq%5rfw`MNm-&GriJYO1efQ&Mu>aigp$>&O!Sf<`QGiM{0e zx-V_F3~3fi=WXjloW&xjwCe(VjbjRVdZ_Ba|a&y+Inp-pE)_Y%5ci`y?B+wK#MZaUuO=<#o5ugXm{;Va zI;Gs4{gPWaz)ZbhR&R7Xh`aNKQTZN> zOs19`<|N1FdB^M)>}$U25@$%%x~V@UY+jJ~B&hFpar3^3W|@6uUoOdrKqg$Zkg+Vi zsH#y02g*5lH$*~nxn++$@WH$5s}n;S!U|_i(mrMU^$>$i@0nTV3w&pSwn9k(K~%k6 zSq3X-Fv;kY<7u}PkKbpGWERP6Hz|ZZY#WAP^$-0jGCOLync(6HHfZpJN{LQc7ExuH zy}qK0q^t_Rs25Syb5MIpI{SqtEsjtFnJPsJ_I|wZyH#5NMhQ^`$7o>!3m24khi<e7+T^%-K!*b$h)*SOL~cB$eHRdHW4ZzvlJL1R{ic$Ypuhp!<@2m(e*oE zXDyR`91{~~D#)sDgKSR8`p)PC(9WIAE{Ge{x_@ExeNLA|NP9Y zhU|d>yZJfMo}FK|{G~vN*+{kRx3uTZI#|0}tsL(;RYIv%$xhFWez->x9aoj9`8K&X zO13Pu((3t8UvL5gz=LK|QIi1s$b8NjwWkf7J7_2ULCb!Ji z81sw4a(T=) zq#1BLAC*Kol#TRvC`cXfWGKid9-quSH5 z(eM`74yR6-3!)cpM|d;z0HbtU>B{+EfWAAJOe&E)!5RUqsW#dhzV^7MSPl?oltOO{ zJ8V`W{E32h%!H-eYLle&R7*@>2a08yxSPZkS4*i^A$FtnQ>g)XAne0fa;3NBO6!NQ zjQ(c%t*?X;mutJAkSG|be5{Skj_#KGd4C`Ni>Dyfqr}rH1XW{M8O2UaEfb3A|4fyc zGoLVhR-Y;YT|eK`-l}@6C!512<{iGYZ{4-IFBdKybkdmp*Dw99Qr*Aka80KqpzROPzhZ9l;=;&v6+rnl|iF z?)R9orh3e&a`t+ac*^Yo4^8Fo^?kzuC5t5i=cxsXoWc2HtbtAm%+G6Izgf%sV4|z& zpVS}A#2J*Oti$w$RvOkfvsCH0&n-parE&I)ln>;7Wl?)aon~Qus=(%!63L`BuI@ys(lXJ8%md?NyAk`i{wiN z78HAvM_y*;I&%f=RA;d4SB)*Ee2EK>R@F`LyCS}eld1y(2~%uIrxeD-g#=|Vx;!zr zV>E})Mxfx{t+q+HTPtt{xb=*DB1F*|jh`J!rc4=Gc9rG*YPt^@dOFm71Kz>P3dO5s zm~XYHdw_1BvOmi;)driQ`>49|(h8pE^>GIlG%R$|9d_qSN*}tXE}biqwPu=jVI<*r#ljD5B{Q=E zx;L=;97ODjh^ilkALDYFPez8E>T{V=-FXA{)kkK-8PA$t&h>ZxqRN?<*}5Lb+Cbw1 zq2Rp5P+i2>8*Uf(2gppu^+NoV%6c8!V*3DUu|2Qu>C%xAs_&c+UvD3%#CXxFYRwvz z()0_j6{QYd2L-Sh6j@NH-J3i2qP zQpLJG;zkc&yk@mTPs~3z=&3ZSEVECSCah>PE1=9_URH0mRP<2T_08{z^leUs!0iN+ zZokseEa(|digp;7ylh%@_^Zj^z5}y$9WM4@s}sWqSXoSWVGC8DK-l{wW0r?@YDpUx ziX1p6f=amo+wBKo0n5WE7t~=|*^XC1RQcT2lDq>_1@cmPr$P*gCtYj|QL@Jb2C4+! zg_v9M%HoOI?|RB|SI%_)TF4y~Z=#lTHM5v&od({_w?f;O@rfN=B4*)>izG_l8WcZd zDgfgZ5ss4J)np_)Ufo9!E0fAIgb~VtAD<0(kBKcvc~rD`hsa7{2f^=aehx{==Q7fn z1RFccxn$xkq$x`pc-Jh47by{`61AY87N$VCV=V{es-{A$1+*e8HXSrSY@P46hnz z|4^zmKQixYQSHsTY3N|tgB$Tkc~alr=WMj^a0YA3AH#@w#vZXN2gJRiRHw(cAy;VJ z=rt)>yc(Ej($g4dW_@XP9tt#|gGdvaBX$}_5ST7B_IEYzlW&?1VeApN7&*|s{X*m2C_^kp=>V1XGE5B8jF8MJSFSodFCoa+T*Pd^RQ&2|g)9TVcp{&pu0v3h z6L%tiT+R*$sr>B;yVPw=-Cj0H9P8o}*I_xFd-UN$_hae9B?AJzIY;L@@|C3?+Ym$! zO4ZtYF%{?)Z(4vGN&~!Y?9Jz}s1$qkR_$CUv(<<~DM@`piLd^~pMdBgY_z;r>&BVl z$RM9uXdl2gdH~>`3#>=T;cTe@V~d1-s3Q?ib744@WGbM0byShpTQ3BV_S|TQ;;{gZ z3bPslhACq99RK!8ZV1Y9DaLk|-_+?E6WF=3JX`C1$Q?94oo?q5cn6H~QF^#zPt4G^ zwlLlwz(jhh=M!6?Pyk^*-ec&d=*kO_m4v5D7e{Rd{cL+f5SV5qpoZDe)P%Tt?4M!xn1*?efh$zPzVR`V`FJ0r{o z<9d0g2Mc~T)KnC?Ylkn<-)L|x{&7DbesN_oV+__jQO*SJ8+8w6UgCDu+oUKojW9(= zp831=X5ysaZbuV~6Q@)T-B-LwRnB^mb+?KhsW>?pbo>08kb^67 zf~1va`F1MKGV^bKWLjYOZ!7NY%j*9sJbT6vLe}-elRk1{x;K7$6|hZGG`LbkZn_nC zCSD62YhsC?ee9z@nHSz3MUyqE+G7}fzhv?KmnO^ZYr3y_4A_eGzt=8VCMKQuJ;91+ zFCLqG3I+$X#0q?@ggYqD+vuh*`B-!fk(4hu2F_Ltr}p-f`-De`6@3rSN z0L?h#oMWHz8sgyI)vu z=bH7Ld;TZ6%#w)42k5iSwfmx}GRWzr^Ql5B>yFKXp##gStPzm@ys8q|sH0|7|0}1e7w^(xJo15qI8f6dlbxlE=d)AffZ_YFP6C3Uesw%t>7a3Txb-q{o6Bz}~t%$GEq4~mWr znE!{Q>yC%Q|Nq(J5aG^e^--HNPVrr2o3lY=zTp?rTc_L>=Klj!hnI3n1|rK=rTm0_P9*0X zK$W{N7gLSiseX5^XMx9Es4A21qBGvAOkM4Z1M?VTmGswnhJ3UNg>H3+t3EK$rM*jc zs)=2>wq8}-J1}c_6B_w$H6sJ0hg$dfJNGF`t8Bvh<4(85eI+j%`HIbr19kllfNTA9 zRC9PRR!c2VbBP6adRmbyi{2T@Y7C?4$8A2AB^ISzRDb)19IL##GFo-AJL)o{!CXTQ ziq=i3LyD;Od}NM;`G7X(wdQ(-Rr+C-9~?QK#;YE7S%MV{ES}g=B~6!m%i~N79e&wB zqRu-=PPQ2Btky){2(xP6`c5I7%@}DZZF{z?t8`yoauzTZ6O4Nj)fur{JC+tDQGOm*E)8HGwefgw58Y) zcZ@l!{n{tpD}l;%0$3mWB1VJ*SHP<}^>1ZgB3A7!08pp{e)+APrV<0T1)(zBq59z} zv1x3R-XRsZxuvgEHB8Vuyb`wpjBX&bHZpG*p61O$m=c&NQy;=wYwOSow3Lmo{9{GW zvYRwx()cVnF!CcbNfq%rT0<6pwyC5Vu^5FN`6B5V%QdyQz5h+LBf!*EgX+^fHYVo< z*e>bbi2+X(q?GwQh?P?jCx5bB;2rXR5DQL%t|E6_cX2E=egthfCSK%&*jw|_P8u6* z7}@4E!;LtTv}PckU|K~=>;3$PYGmp#z>5vAYIa;#_v14Skh;JPnnDqjRtkSmBs+)? z(Ut*l`ci)|`}*_4T@oO5`lG?o;h11p;B6oELB^=~@ipm;Ch~af@nl~oW2(!obPx=} zLht>cNa#?vo?%~QABKSEZ53fev1hJJHZUvqe{|uv%8HH!wQ#rV)9ziODs>4 zOukE%LTho|(`H;6bRhJlqh>CyM00cHwg!c$@t}cQnQFi0)GedN(-bp+D0oJu@tNW` z(#wgJ$%~m;&%oxZrFWL{uDhR<)oBtSlhZD-$#{4fF{+#x>=I(ErBQ9ck(3~#&Q&JZ zHzouvm=0Bva`B(t4Lprw-&BjAJTJTzcC%7rWwn37_u;c=Esl;O9nHOznis>jqwla~ z@!*Y`^g>)lO(lMP&8_tdd1gLD(4)|WY_2e(_bWuMO+NA!Jg(8+AkmbD%A9>j2QCBRqsody#6O#@2Ghnc><7l+uY^6 zH#Z!m9adc}NM29m8p4_!Pz{ZrXfMoeR60HsS3^riRb|iQ`JONjyjp zpYjEzwSk=O!i`r$Uc8If@Ba+8#IRH565O9f!bF8Q>>Iwsk3R7|8M=wY$a3bS2_V%K zxlHUFCX4ZR)Qwq21#)T?vITt|AciMP@Q;tJy3*q-yl~lN@&+JYGeFD$LswA%E^o~O z5&k{H96^oyoL&}O%3^~|qec-@Pu#c-cbCeKW!pf$R6<@F6|@01`F`K{;Lzy}=_Elz zhEQL#cxmkM8)krV8_w%l-eBAcIiA9AikL?z24LGOqkQPPVig4+B9afRC>c~3U;*6$ ztFR*=J$|@JV%`?j$jlkg=_;wTChs!UViy^_ExhRsoBvZH9BKr|2H$EeL^mVq!G!irhkJQ^yr&l$9l`xWr&>~zNVzERa>qlk zc+gW5EtREHBeS(1{?k@nS|wYWy7UdeKO4B8$rmnlkBbyOldII-+LX8CV)Ckw=yWu! z5RRtJcSaTI@bCJAq+_|H$BUqo1r;yAmPj|}Eao_i3x*5&Z)DI-9^Im-#EkZR6RD-l ztl)X4$KDB{=G;8yx{Ww2FSb+g9xqvqIJA`ogg7RL1@|cN`?C+!@Bx=W*q?aYyhP3b zdvALkib|X4OV2^dvNuCIxr%0$W!HIOuQ85+2t9&)m0@bXE>S3R8pC1LXf8XBsxu<1 zt7)UpT+SZ!JvbS0-T8fC3`06>SiuJIjl|^-VakB$U~)NP+F@f}e^=Y2n8Q{c2d$5S zb~o~wG&?5xgKFCkZs^)=uh%t3s@`em0jAt?XSION|>* zCe60$jn3bSF&~|m@WORxBYoIEncgdAA>a&0>&rlaYf6gBL1y`2Yklf8_Kh(z9bK>* zdf)@`VT&KmVpe4W>fQl;_nwiiX2&=7d`dhXz~^0}g3j1n#r~C|z{73NryYJ2faZ*DBQw{v+cCP? z8BK8Gr9y(Z(Y{2IYdOi{KU&YcyiCA1ohKxdmH8`XE|9PbvCt_kbH0e#tE{l-(Ai39aL8P{9*Qk-RifxN;3beWXp!Y5Z^<(NXy`gE&S}F z-Rc}8f9Glw``_aWa8p^2;YOw(jmr!EknwIZ330K(`aQbsvRBV=w9X(h#P1A2w^pN3 z9D~;nx{;eDAS;G^0@vjoe*Y5+FRpms^oK`!F2o!g|4K}3I`<(9P}{fa3usp_TdZ1* z2@C91ULvyM4O46?3J>9t4sRmz)-GY)IxA>-c^f-2MpCkeqcBQtozXUed5=w4jUH4> zJnSq{63VSs5JonN$;hg>b#@jjU(19~u&)C|d0*gBuaZ<5i{?h;`*kQH0{0hA7&wng z75EXH4Bt&yjY1@yB@S5Ocww#ue_^B>?qD>MFF!z1MM~YLqZBOnJC(<8=6E`#_3xcHFF61|*BV*&e+1YYoso_+1nbM^dytF(4$z?9SS-Ds zYBInE4ogru$>7~9aDw)-fCN0eZvDe2H+tu3b{LUocB_6l z;QxJoXsOEGdG@vQWOlm=oGxSqI7x2EWFt+7O9kROS&d-@*~)$#C$|}m73oS76^aWw zYLS>!te9NrhbZvTh%x87a4fdpN|&@Z_ubsn(3+*{qd9lnTyQcS;48qeh@F}c*}`ze zH(JV}}Y6!Nik=dCZCi%jIU$rIMq$5WzRa$Dh zD>t|x^F)x!J-}3x{$gD$C&~wG?NgJ5qPYv4y5e{d z_m)EwskGfYWIexn)UY`nYswOVsO5{~xuT&kE0@y{dm}O)s$46{poyJumQODndcF4+ z;_sp-5*d6rEX)(q2!)Zq43}T;1z5I|$-ifdO%kwt$(-kk6}xNoDxx1~1mp^8J(bc_ zwyBU3L0(hu&Ov(KVaXL#Brw!Voe0iJLdczU%<#g&E3B<*6Pa+vv9G?&kz~?CB^Mj* zGeuAnf^rjNR5GtSj3VWHumMt#lRgFAHT}IT!woxQR%b?~@CBzVOi81FU#qlFOg5!V z0qeJ8T;Cz5q7cxL2)3Z0`65loKY=5eM`bswR~dB%il)6uXXUiJ>o4(9$5r;1)snxfU;iV09Ao z0(0r82~Kxsy8*zDV|Knj--e4aVIey!Jx(l5b9_iDy#86O*NjV;5zH^98?in zHTwH3X=bvO%xr8%aOdFC&~P9)2Qf-VF~=3FYa2?(Y*j+W2ZtHKp|dAx#_VMr>qCry z57&6bgm#(m36-_G+`p%a(aP77TW!!WcA>>n69#R zqrehVjkRc}M=Q{ae*co;Rz-w8)QBZA8wr})6}yAr#m=Ro z$isf)*X;u@NRC8%Uh$@K5EwWpXcHJ<$K6!6M4OT_9tRod^iUJxdh{)Dwe)>g2zl+O z%vl`se0|vvHKiG;biehK0z@Eo7qdKTOk6g|L&s1jRO!(USu`bS(0wiTbb&g?(*;0GNJLFSL=a$wFkhL^p?6H?w`ruY zUXcnXhNBe23z?2hb&t@G>wS~m=t0u)aKacWD-sJa?)TDBip1a!21tgwf0`Nwx-%hR ze^;wrsd2PY5fIgJLE6Fm*@9?wpu^jU8A+s|DbsdJt+PC9oVW9Z_j!EVLlPfDyfx4- z^R}l&CIq#j-lH@?NYP9T0~r!`t@LZk$XT=YZ-pJox|qE~n+ z97welAo%|CTlHX(eaPUu8su|HF+Xw6%DSrGYJ={Z`P{DTt(46Q0X$&sl$K zPYYUJYAIsKVk-7b&Z&haQR(Yf(;i8;+}V4Q+h%pT>ceo$v#q`-@-IbtiN5ytsh_5L z>7>g76YTBB*tPj8A=6JT?VTz4BHV|(pU#u*yP}hCXVvQP#>Hj{>OPPD@n`84ldK0;QyK4kT+b8o-r4FL ziN&#vu{$(g4Bfe?NP59h0LFOScslYG!jvQk#PNAUNSepxEa4?JEV* z%c;V$vxPa-k^6@5FsA{U2q5BcT6l2IaiYi=vSy6hbN_&P02KAmW2az>{F}yJrZQC0 zjD!@J(fQUDe?(Nb(a9Oc53;G7^-wzpCdZ3Hs6&Da(RJ%mzRnb&m_gYEhU{cSg={bu z5OfVUPnY&qa%L(jCxGpF*_0Xd{JMT{9KZ6a@5HFaW1nxf&|+H-<0{!>F>zA0XjZi! zI7)V9{ds-9O{vDDKC&eS4W@4T3(mM1J!4$W>gI~}7M&V`aAmd0R{X-e21ZSTNm>^D zoyIrNIyt@pm2p4y$58HWkPv_~(YE<6HT1mCoU2$(hRAo1m|6&e9SuC*LE2#M2TRv7 zi9DBPC_obGw zhC0=oY#|H{ZxV@rD<8ibDLj(mm@2TuGI2YH&#&`BOz~Xawz~x@(;HS7CzW-25YSfg zsh?im$=2r^1iVIaDXNdkR`+yG>@v3fKL51O&Q%b!rsXP%rH+q=E!Dk0{NIV|c;#zi zc}_{Y)0h3M@25um3b&~a!AsEpE_ruXy9~GYd;2O{h&nV3I}OzG_3^5%qm?Z=P?1$< zc`$scGxh{I@<~Og8$EmbcF6hk$NeeU$p3~beh)opNO}JrXK>@j=~6VxAuNA81b=cI zdNzp=$c8_;n3H?pLp4toVR(HwX}=J+N9_Ns#-1LtTOAE&G&b0q^%c!xbA1t$!vouW zM^wL+Z5B__-hNcEq}g8LAde8&#eEzcSv>B?uNg(MC9%I96Y;zyB4A3el=&hUYg!jG z$e}K)I57aF!g(q9lw|btzPlEXNp{lO~bhElnN9oeVyg+h%(a z3XWHaB294nw1Gbwq3`BRC*aD0$+eVa|H6-Ym3?VQy)?Sa%%Zz70Z>DczJ9etD(hwO zQb0i+K&K(n$6+)bU2rO(A@N{hVO|YT(>xy`YeN*J9ss))D2L*LpShmnLX3_}>F>s) zReAQjyMi9|{nns_sC_F;+DjPMhz871kZ{HKsfnM7d@kxIE8aEe6+F??8fnwU6pwB> zwPKH3kUvd?asWMZSCg3pp5<1|&{OukSVx73Aw7L~O#|*^cYlR(V=1cxT?zw;Kt*CAp~E#-^Vo>HablWdYV9Xn zy`qM>CBJ{ZRsCXwnfo=Dv${N;H`%JD6$aQJ;c5_n+mION2hG*qU|I}g^SgLM`i&n+ z_c|@~^G;K_!6jc9DcqWy4W2rl1Bu3&_;;g~%AXDEi^y%w4F>US0|~GV(+U?ZW|PBa z5r6$(*H@NqtvC1TTG>9iT47stR;9dV&+%uEaT!jtOaOk8^do|QEqF(Yi0XvZ?tFmC zQ#QWpR<)ctHe|`g>E<#@d*@>6GhF@E*RoxtVwL057k%!4kn6A_mGX!s!32xEvp(`} zcC4_=b900c!w^=j!W13VY(=}+b6r7cAYQ{?FQZm2wo@)vw)Ak(QNn8ofLBg4Eo{$A zxy6z#$e1l?7KkerMvfkEJAjlY1;2iTk-7OL!xs4pDGPOdu=He18)ViJK+q`GEj(jD zF=FmFSy`XL;erYu>~KM6Z9770R4ST|Sfay8?9i6Iiv*C{ z=M?dFHZq))z_U1xOua54|L?qcIgR5Chwd62y?OA*i^15NI}^~MS`NKlCi9)0i3n2{ z3IXDX^hCzNS`M`;CH8#wQPkL28<-WynSAOh-!u6vT}M)edd^xsWrtX(7+uA%x|C#+ z)5R4)ZlKTR6?6Me#VWrnp zyY>Z!jz+EfylE{~<`DX-X0zAlBugZ2^R-t=hwnyDDUhKo6 z(OqS6x{IRcUVQ3}zEjX3rh71OWkmee^UQ!YW4e%f?xtuMw_d<{XqXl6YT9l~=+ZFT zQf6kS9ll5WAtqFrj@~#2u8;hQI%;LR)X1}r-HE*Ps2U8hjLPS} zXU9e6>uP&MTrbTvk)C_(TIuIy{nbZ_zOs$HoC>b6NzbHFeuuLNu|f~`=!G%DV~=Qp zW~WlFfQ$d5%gT0K9FNSViubu$b#L#t5BM83FKnA70AfUAmM$jkbNv*ZltIoJ9{qC8 ziw+wf2BS^}nB~|Y6KAOsU2d)-?aKwa7VDDB&9=Ez=z(z?mAbV5HI0{5Q{_7$Z+pr% zx6%95jh8A?ekDdwTM~aAH*I**U}LOoRBH5S3ct+4{6MAAqFQuk(+9ek`*C*<-#vM& zyT2?$?qJkRWW$KvkU(al0$hteKk5{h?*UYe*JgAwBE6+O39%%d1_C*FjyGy8Sp%dG zCHMdY31|-{3=l}xbDJO>gKTa#)sm5f8-l~$8yD`VbHKRMKp{5Yaz$87`KJq`5 z$%PbRp_v>j(`NJ-inyUx;>akiU?cRpJ*DtLUMGG?GOaLJyF~3)P+_8JQc&WVL@sqL zD$>k2?&E-E;OCCyL18SmqA(^n0{fKD;2~R?Aaww?X{-b&o9}%D=hU z%7E=+0QLnVsQs5_M+>{=X*_KWjxHlaj+>V#)qY+jm&|-u&J{oLFtZX*p;W&*&Rt5>{pZIh=VF^08F=LE*N)Ec1jIR@#@ z)t%<2Rt7J6O`(I-TY=BdJBn7+h&=K7(fGM_-I#x8Tl%MfuR=)lYilNB!_h&1J6;@+ zF-_5OjRL-(b#%xVU36lIyqKWM@roB>wU{+Fa^p~_lZ}jMaar6n#eWbp~d13&At zPThrhask9`-Uy3ZX&@T|Y+UY)a}?B@@BUl0sbD;jSL>^VT?k#wzb>VAd1XH3r_tEF zYj#+jik=U^K>+)pRnZiFO^E21*o^jcDF%Fqbj-klF2i;B@x}8ZWTUq}YEF&|?WD5f zO}xxqHxSbPxZ|_43QH^lw`ZHKk(+sXjiPK(0h^t}Pe&GG#isj9fd}-*eV!#%$%O-f zv*flbHQ3fSh>$@iDBnmOKu|=4eBBH?pKDFn2+@EqWGs!vpi?@VVv`YUTnG!dVnfy# zEn|d+R>tFOY|CA8m<6=<=@|Gva(C8iu>Un}t*zM`pTmhOJApYk?ohk6$YjvzcXQTX z>kXRQS6AnW(AL(Zqtgh192ZlS{u=Z<{Y`<<5==F9ex^S?D^}G0;JIEm? z*X&lcp%4qS;V|isnh{6ws@x*pdm^m%E?SJSHcTm`ax%*=WlOXh21dN=LttA^o1gBZyo(mV0DO%>lD0%ml5(hY0K~nvs_7E*#K?6 zPdLkZ`PsAMGg4=vGCCUKw}l|nDn#|<%MewW8?d)$v`jA0wYL)C(AGtla--c=^i%E| z+k7ulqWej}XQHW4288g4BkGAY?AVBNxnRlZ$Vi8t1K2x+g_^@VCV%wY+myWlz-9JT z?7*ur_|n=e;7Mu3;NZMSxcYeSC39)3Gn!mD*v@L4*`A^+EaY5pC^>0%gv=brP?Ng2 ziPnlul~)(Ayf~gQWo4y-_PvFO5Pf_0WiK<065lZ>77-F+OxgSRBUu^3bYtA3>Jc(7jK7aQ9GXRCic zL%eRvitD~DQ#SunO&gcfVn`=l>R_VrY2b)C&WRm+0VC&>{m45CjEK~$m+((1RfPd} zls=;+3_5A<`s2LPMeuB&!^ow1CUW-3C}p`jY*<-X*cXTPB&wgYHnX1$H41c~esZwm zBALC6PDA!MBJ&=T<n}q9f1;hSgIkexHz^|B6 z+i@S&WL*-P!&lqS+RV@Yp?D6(rj&sw+hh~)9m#&U&+2S#P{;OxR2K(^cUd)8iTY?) zA-*n%t&RkWUh~8&e-x z*;E*v@w=(L?;pDeR>S2?rd$=GZ33JQ!EJ&hhvucg&;(2WBguf0Y) zPli{7s9dMtZp#0wHN}}knn?Q8Wzt=FaE)lH?0YVyU$4R$q9WkSSC|3WC6iPrQp&$1 znMh)QyDsEbK>&<%J12)5$?{g~{s;@43BB>|l&{B?H7s zAz&>|3W{N`Bk4f*7g_$83n&IB*|55EkQuuQ>p~JS_(^sc7TSkZzue{=l`W zRgPdOC*=~{DB;#7uGcp8xs&|r7kh5FxiXve11pKTvJ~5RNAFFm1e3Jip{ZHt%PDed z+RX}`JQgZev+<`yg(@B;AGv&ph(BAkB1<1J?8)p_2U-P z)m!iRYY!j1M5Ek|hwtnkqL^4N=5%o+s>0nLJn~?PSzTc|0V|oO=Uvp9EtpYi;>l8T zru=rJBj1={HlYK~+v7fdWcW))Z>NM}<-Xbvjl9QRNu9+tWg|yLI*0QcFYvxD?y1P4 z?gUMyQ;mEe1lF$(xh|U#-hfhK! zb$Gc9hJ&Va%u79+{`mG*2e(0z*Z0iS9tN`uP%LT}a^4C9ZU7>kDn_fNJOg`iItq-N zoBCW_0ixDS3&!f`KxfKQEJi)0m6xeY23_q+UIwCN>8sq>e8vB~MNNel!9;_PA-xPcPm^7h6+IA|buiHvmdfz!s>0hrrHMBM|R`Lg9 zy;Tx{BIMP%fcZtbuAvzncZT=PToEI#pG!j%&_i3M2&a%c9W`wosUf*SLc|*^Rer!I zmrO}iV3K&`#`kVdw=sHIFwZ?N(=3s@hvECP_l@%+k!HvCxw6RS{5juW;x#+rowU98 zu3-2K9i1@@&#$jDSj~gSZuVUvgwJEXD2!j#S}h+6Tbp&H6o%2TKl#J_^!;k=-oGx4 zru_&pozU-^!tMUCv{_TXn%zLd-rM-u?C|oA+H8pH*>DCwa>+N`PB;7t&XBqj8%Xc+1Filr+fRk1$Pmi8@ zQ2eYktVBFv(D+7Mv!gXgh+Y66l$jo=s_<9Udnl7>{Iz#jQ zv+)>-^tVMSh6={qOe;O8xu&vEL-N zIM~*C=#8P2Zz)}+-S0Lcdy+OdZKHi#86Q7^`+5F&AOqoCh<@_z_?+~^az=qx3SVVn z7|-TBmU}oapnll0Tttu|V(G`XxEXyJk2;gMAk}#quZ+@oCH@A;cXy6zD}C;_6+-F_ z+?G|lTou;DYaH((K7}#ab-nPiLb-ry5uU};oz@jPchbDo5;Qb?bZFi z%>ikJGw)xVeJH->WDMjIhd*-DO_O`&dgGKpXnGEinPiV! zNnroVYc)}k&S|-JTm+RBhCN$6+CDU{8%+-Z5HNEYu`Qp~z1+oEtmgk6mh#3hW_mLS zRI5!G(~Fa$u`>y7GpB(bDSG&uisnh>{!1Ts@`eFWy7aZ%stL8OP1d2K`T^aLLf-g6Klg{&D<>?)qDx7=JTd zWH@!-ob8=oP2sZ#4tPB%xqR{@gNqCIP@GltSm^aU)yW7eyg-VZn6J$fIS>tn3I1yr z{k3FS9@9wkKbW#I{rMWbY~=dvo5G7sa{AR*NzGPZSuBm2c;^o?9X7b?|1_VbU-Sj% zs>NA>jt}%Sh#sFv2cg{d3*^IR??#oMh^X#bb<+N;3LCF74QP8_olLg_DcklubM&iP z>e!g1)1mGD6rZ6sW5DA>zkD| z3r}9YSdPTQ4hm$?=5hpFx%zpB=o8F{(<%DG5phVd;qo=S9dq&|Mp!^_sl?F89A*nS z7Tl@gb?FNA!;_UJBHSd3oC{xpR%~Z&$}OY8S_wREazEu-^( zeS6umha~Jx{Y?D#`*6=2PQ#cBsz@+UIDH1|#iHW=`J~|oy@b4VB%fGsxr&rm6YNU{ zP5)nS0eTRep<84ESgZlGyrTj_4xRV`kiIW_^ChlJrZqzG1>(*;{X3{ei_sHZ?PUAZ zyVmoJ{Rj&e8KYMT5{Zajy3fDv>8J*vo7AMwt%&Rp*yg{#1WBcjFfrWPUpR5eNMt+_ z8fnzV-txeD88dKfzXctyi(CV`Gdidf;J`B0z ztyU9?)pWx7*mtjF2^G7!>g`XV=T(du>#NA1)hU?*#vOf8;Y8X24R!wmF|?~%CWMqk zNuMO`{(%hrcJ~IXObHxq~=cfg}n`L ztSbSXfW#s6&;%DOG zN-ig^H;Qa+(L9Z?Y+kw67e0Y3>2pxc>&X6Vc z)p0N_$d}oLvAywFXQfxT*4x4f-+EyRdg4p|Yb#cB00Jl4q{lVT$C-**2l!;%0@PxkSSGRw{)UHZ8?k^ zMjjHMn#BOV9D`mD?@=S(K99y{QSZXf`VoBZ&Xug zpF~c`I~NUepaN{1p4dHW!1zd954qxS8n)e%27&>Ec>R+H330o=nzg1Bat$zEFgShp zSii%*@;IKDr=XRtA#r&rH;+Zo9^oGb*5M-yozO+6Ph(Bz|{r7m|>b=KH5xL_< zEpayaN&_(zqM*(BhKVE4-F~e3Ny)2+Zg;UKv>Q>rpLZPW0fFM=Vya0Lqa&|ZkiLM6 z0#$=YUK2a@loJCW6W*jHH~bZ)PW3NMVID?*0zqkk+e>)r==9g$9jEgoo> zX#fY}p>5qD4Y|B*E7qIs>C{cg(;Z_ZpR|d;d^;F`fF-7*!zJ4wBxd%Xp5OAtCj?`= zbYuexA%}Yrj1*@LZ*nfoFQhf?IBe=gaX~~K-fcySoJcwz_Kl#S7D{6oeqypF1JYVL zz?p8^4__c&;qwueTmV_PCB2@jOZQECdnM3aR`QPz@=aUbXE{v>^9w+iSnWnUY z(MB76SrcSyIX4*In>>KA$4-Z%2Q7_DZN zo;|nnpTwqHn$9uWRjV6UtRw5OBh#R<^@@Ktm3IyX!AB*~rc(Dp_b}M0U(UWQY&+^w z8#Yv`&y6`~1=*;Wb)93}B2j#Wx7*BrKR7V)Gi6z?VwLjK5TM3mp=g>Q06X(`tGa%O z=|Ov-1pO-GZobn4aqqw0pw*wb?Y`yb$0BkoV_sf;R4$%(E>?sNM1{PGSaDFCY&kNc z8M_=6!BQ0>cI+4&`;-6Rc+!?-#eKmrhqaXv?K0%}L=2<@y%_q!BX$Y`D2#b3#$z?X z==RnC@TPlO`yl<~-*09rW;bCy)2_9ltGyjp;I+x%>*sxTJRza|n)j+{T9yJ)z$m-% zXt2hzbfuhiVGb9kpAFi?&RwUTQBx_6AlZLg*@dAin(fkxW?6&0Wj~0E5fLi_p0S$B znYB=Etc-reIO2@R54y_foF$k(+Wib2*k zLN$sM`sDa++16)&YOzsHKx!I2jZqZoBT*)&YC{j*mGMbsy(|?#Si*TnCYXZ44TM1I zD%aqM?NnX=8quc zrRSTgxYJnDAW50s`@376jM|9m;{-34_DTt8kOzRh$Hc|^6$H`IgLb|*qZ$^0<_Y=^ z8jJ85_5so(St7*v0!f&JuyEaJtoNd;A6(u$?}aC@PJmdm+wFaN0L~V? z?mj2Diy*H=%j9KkD*C_1Q12sX4#2a8I51V~viwEGT}(?+6NG(C(dG$Ejs3bl)2H)8 z*Jfu51MG#jwz8spBrrY>FQ(VR6oWr(x7fTb#3@x_%o)eA%SjV7D9qPF(yRZTmH7bgZ$<+tCuuRs6ze%!k-QjldNejis@%eE(%q<|H42MW zk@Uyq9ltws%JRU+Y(b*V(@x%W!A7y-{Kww%%As+wa?0Onyq1pROO8}qr0%fWJt0&{ zhLJfAxHYh(;)>B!XzQ+oDAF<|DFcTEw2{LpN{74ZiYnGztLgsf*c zGm*Pm^kc_Z59QMmcYdj+f&-^GHa8%(1T5X)`UU(Q#BS}a3D9gTXjvlS^hHRlz^mx-iL^W>qY(*ADU;q(Ud2XtAbh3j#-UZ7%* zY^AsI;$6EJV*|tr>G>&cdnQq?2eB)iIYQTNFw6DwSh||507osPjb>zn)XvxTX)&QZ zy|k=$6FJsg5r6lDLTo}dU&az%M=Ke7>r7^B5*On#;_0)e%@S*G$XdpHC-}MVyJ)ME ze|O0lbDvOK#^>3Na6q(R+6s^)gS4v{uZv~$>Oaf?Dyq}%wOeL zs;mesYN>2HYFitY8>t(5S?3}72H&421uKKrgp-RRLu7azSCc|X<18h(TED8dyVPi& zn62u-`UWe5_zn>7Xs&`nlZFiaHM?rJ+TmzRDfH_!(mh`lS>FPQ0z75THAP{LY+mx& z`zy-Du{_gLl|fs#gHq+VQR}pvZC$$+urTrfpICiH1cuhp2rgx%&mY!&6wTQo+>j@J zPnUYi62i)Y9^?Jo9#s9j;=K<7S+3-#zEcasraF*AWKg3bVcj)KLA!;e`;$`LO@eHS zN{4QtC9rdaH%!k_E_2&?WDY>Qvp0Wgx6xNBY_Z*EH~$fYt$Ndp zaj~`73S`l!2xXi#>rhLddk16l5wS^;|+R%xrYB1GuI7I3pP$KBCx<067GR zdFit8J}7wta}01V+6Q`@csBtVU7=5Gdfx#TR}4@6@WUt&AN0LbM2Kqu{yWYak40}? zR##Jv3FosFn$cY76cvK-@yoxj;7CMChfO$+Nfz#C6rYJ(?PCH%Y+;ArB?rS!mY-ZWrOl%w)duhLe&&Tty4lvimggk+HKF?)juHF>p z^8jCM_Qo%!JARKEXl*$*H_nFG8#VKU`UDKuJRLfS-k%o8!&%#?dwfX2`-l^#F37fO zw?6m_0)Tn6%#r)%^Oysa-#EXU?@H#rmO0-Kb*euZHGNo^tD>Q8wB;;bS*Gp2UYqJz zB2y{xyk}(mokLj&jM%AToR|z^YWqtNGDg&oQEHwNJ3fSI5Q!hg9mFp}ux;o0J2(b8d;y5Ia75Citfew{KZ+Jt&rU0F7 zqT@{o@I7jG3`ao%0SPHeQogR&@3MwKXB|D|Ub5FHkKUc>%0E}!!;(Xd`ZIUo$fs2+ zOEbrW@Nc^XY2gqhpt}m9$L`9>Rl(98!lA-jP(T3t114Lj(jR}FJY_`B*a3A;+daB* z!478(HDQk6hv{x7f3gmDkk3Yyf^f_@^Z3|oL)IYa>0-7WMy;>ip?k>)?A2A$wDxP2 z&9Zt+JyMnz+FP3-;oNmr?|656yF(uk(dv`15jT4hvrrm8JByZL<Z$HR&?xJTaw;XGEv_PDUMzpH{zp#}yrmt0D z&Vs9pMNlO_oyZqehc!0hj(oQ|!}v*%dT40yN8o6P>5UW0+F&jmIvRTdF|;LGwKumG zy*+$FOxIQW>gOd-1MD74DO2rMcU?*K+|B!~$k|=<%CH);*Sx4xJSp6Xr7Gru^@t|< z*_SZwP=LW3mwrTVBh1;Wzj~w>QGUMs-{*b&T}t&QCN_rCns~N!actnWepJ#%J94a8 zwVWJw=4xqJWz6BZ%L5Hx>+SC2<40h`Cw?gQolMY%S?VVSKpS|(VNS`B- z=|lCA1COIMeqQxPZ9BzIp!q`2`cZlc%69)0Z~ll}BdGXJw4Arnma`H2*;#UO%z>>% z%XzJtXBu~EGVh@3Zt-QF*yeV>>hR}JuB88W$?1?kUN1v%NnZ`GeQljzT>*y=G}4mq zCX=`KYagD>tBo^yVjaBlE29D*(plX@+1OM}MA2iuQEWo2qr-Pe&dijLm6!cbE$nQVO0Y?N49ja!J-xM@weT8q!NqgWX{K|_3 zXc3|-ucRjuY*2dXDDZ)2@?n50pENUB(Z?BUk10u8nO?vz8AT0{N=#hwOR+L)$XA-> zSc2;;1A5c#Te_QT&@N*+G{Om^a-Lm7$$~YAFk{@^n(_l?1!uJYX@3XGVSiV&FMiEq z41!!Lga5Dy3spi+(I>xMH+fN^xeH|f16?^nw1EUUO-iH$Uh5jT7+U;=ahTp&{0Rnj;d`D^b9>&G_dCoC)u zPV0l&EFO4!nOOA{+R^LwU4K=pB7)CQw=+vnO?U?NX9ui zL08!jHWD;7{ET}QV{`gmTjLkc28^O8(h3)U=DTl2h>OKxvV99}D*M+R%GQl69@DS< z(nZDoGKTpt_S|(%2H&%K2ejjUcJ_#!TDW&p{_mH2DsNwTi=F$KzdK!Z9thL$b6Zf|DeLs_JI5WbE$?yr>mlyHNAboo zJ?6Km#t% zzsyQ9Zh+Iwp}ig7rSIkF?ZlqpWDuI!6Mqz1wR$?zs3Y=c>89cNg(+Cu>fvq4@`74s z?)gP(PXVUvQ1o`n@M9lh21_|L9ukyFPb?;NLGq2UEH%32tD%H<)sqeQ77@rdxAp#C zpCzQb>113Gno{zNJ(mM*v`428c7pAf5+>zyQexY`%y9QPU-(ysL#)tL(W#5=ZFz zPt54aG$?CvPH+|eGk2yp7L=ezXN}!Ph1}en4?B!?UgjV&$9eDEk9gHHCq>*o;H{;` z6)s{RAriG+n9}l;{W90> z6V^S|Z>LxtA2p|}1c>QkD5iA8)yYnXopMH3XXaRF(yiyH2Yh$R4IXNPw z*fUIJXKqC7LJtaE^~40pQI(@;cEtYN7%+GT`^Tjlpk|BoiRmn4sW2J%<+ELTJx|n`Y`9ZguB%a zOdQeUGuYXK2wx6D=uTY)FGgamj>oY^y|3HZTCU+@h@^YTl#Cn79i?2t6jZ8*ma;Yf6;a&3%mdT>WO74kN^ zg;CW3x45~)XxZjmey$X`O+fWcTxVN$)TJ6APbPRwN*f)BW1egu`4O8VG@<6szt9rf z-`%9m$i!sKdH_ycmNo#Zue-CyF zVcZ*%VqvPS7DUBFInFioI=P&1?Hgx@9?M)(#L4BQA|9YF143M}s{nG&g#=<>3~Osh z>QxkWExyy|_88K}J@SK~mzxE+ODULgmshUm9(m0uy}$K4`T+}fp3x~(2JKj9cJbY>wSI+s{IO3|ur<)f=Wgg#8>jeJ*UtbF z0Pd)W6IDM)B2Hw~Zs99IRuVirQ5Zl&QjbI)3%yidN>1-z;Tddx4!Y6951mg*G@LJK ztcm>N{PSgHXvNk}c&))9e~5Gn5?`?ubnT*i*e!IZPi5FT?mQ91_o=}Ox9U0q9w}JLO~Kv|5Kq^Z;idwdwEPNL$e`al8^^z*FXcz905|g6O3|nPlxHh3C4R=p9>ts z300En0U*t%$f=GuZ6uNmUdyE&K=D~PGmnEvkVRINe7rb)+Niy7_xMUYT*hc6c~wSt zT+?`u4Mhm0LD3v)NdVJ5NoQd`kOBOisu8kaql+FOU9I=wYl`JvU@V1U0<9vH+q$t# zT4nMUmE7zUMoqLgrTj3`QZ?r^;1|k!*2gb&KmMlU;<%9wKADu!IVq{g_4&?{7zhrG z%sgbqq7%cK^1^iz=UyAK<_cAOC_2EFfMqxr%6%_~D*-n0>`SU#Td^2!X9)}!i%b2t z4=bY)3jTax(U9(hI}qm}PY2Eg@%l1vGnbpQd05R^o$hn9*SrOZlx~>6+Tj7FaaplE zF@HUwo{VQ6G!Yd zkiCNsc-HT3v3Pu09eGz7velG*-q9ey#irt?v5P2Xt(>)wOewE<8^QhNXL_oh2+hy? z#7X#l@*Tu^VW#%LOF6u08H%BYDsnS|-bR#LTq-s-3S{@IJ5jGk?9~Ol|F5I-4rlvo z!?+bfY?Y{0dykm4M{K3lrNl~5d#go9%A!^qdv};7&PuDNNkm9o>s|}$v6Dq-o5;%x zE70R!V;QOMqA*vOE8Vi=qPo6M+f6BJAe##Aiu#BWUHe8Bf0Sm zQIX%de3W^XEADWL8lpx2RHUYzaK-0_VwU|4c{yj58(q{BZ6YFU>Y!1P(i;o#K&)LGqI<0vs&!Rnvg zTt~&GKYll^cX8brmHpv4azVqod)}fsBDvX9({2W!1=qC)w?TSLel5i6cyt7Hali8L z0Du?s5wY)5w?Hxz^8eQ=XZQoQe4q`P*9lem#x2WZ5%5WPrAW0mcjg$h*4=N}a7gX| z%d$v9fYF&c%M7A!XbG40^i1{Ouak{-JgEuPD!qtG-rQg}zi>HA zXG;cG2qXEyFNC&`UYVlI_^_;u(0^!I(OSlDgX(qw&Mn2^#OS!#89i`7hAk75R@;IMgS>=oD#EW)= z$Hc1H{uj{&9neZOwVJ!=;A>3)Fj1*`>61F-4lftbl}aKrvWhhH7KnB68Q79qNsk58 zP!ehZK;g`K02&zh(Bfaa?g^aM7z{1yuN0aoanIh1UJHSL3R z=EGFCa3Vu3Jo|j!m#g=sL;`rhkVxv$MPuvb1@XS=6URlbKRYw1^$UOzPIV@LI7+n$ z-*yn4*8s;*ZwJ zKzVaDvonDZs(tcLG>1ixD{6OEFM#WB?rrsVFE3IYE=D}Qfl}W|h9EX?e~)RZs?=R| zyFRDl>|7Ez6AfmM5}opd@5hwR_bxcV?UfdTU{Cp8OZ?1m_e1c&#o)#?ES&r{>0yqA zPPMT6o1GT#BPFmEUDiKa(TpGhOrUve-`>HcQWdEkvQFkcjGOvpbK&(y}09GS3rKKY z9cB_Y3C5q`=rRJxV7@%hu0DvMB*wyU0)S#d8hVeFJy)pw$Uw|HWt=Jcm9OumI6uGt zaG;t0+!f|-t>(yraKyNL2RO7VPwVuq%OiVw5-2H$z;u-0I}YZPWe9yXFOKmk2nU-+ z0O_so&$HX0VC3zb+uEJ`QNPgjM{IQU9g~#a8{^6R`7Ie=dYOybg4>z{d~-uq=u-0F z)gh$qOhR#GNVxjy1i*e2!u36R|WW$ z1tU(;#1dE9%A9LNNQ!Byt`p|K$oT#P9m+noCPTtu6ZGjpBjp`AVn_h+$@~V&U_{(M z+az|WpVs%LW(%A@-oKdcu^^PDLn|^wv2Lwb6$2k^&M8Yz7L;zV1|UZyU2YKnaRXE! z8{@0WLI;JJ*8eUZ4tfPr=$toNU($x=(duZq$|(a~PHv*3zKYJ3#&Dq`kF$ zQ9tU(rxl#NkjVt|Zzah|D#Oc_CAY~_;&TJ{F(q-bTOd4++c=;pyu6*H5>|iV2+q`4 zte~T@H@)cIb33~`w(HNb^zmP>uLAx5`%Ci|<0mc#aY$u*T9Lu+cC8E3kp8u>=i>jSg#?BKquT`K`vN4d_VdJ}vjwIqQg&c8oQ{sk+~Bw2ozugI0O=Au;( z=9H9veqm6}Xg6moHWAO8!1!ZqH8&4enBX1&XsBsyguVG>Yo3@F!p8g+hLR<( z*|{`;@{N1-_j;k==(X=;l$0jP8)6@l%RdkZufZ^qWT+i@ifCy;a`hBsv>gc;S$S>X zdO@}Z{I_}xSy-$QHSmR#!RDJ1I@^%ectAF32b!Nmri1?o@2F`7q$Tn@F;X!jpQo+$ zw}+bKt(}-vbAu?_vU$iI3fV53y}lOL`|wWpzORW}XemZ=nOWIfIpj6B%A%||RUzq)x-;^;n#bAo zk55S)J!MKvZj}wscThp2&x;X%H;RCPS60eU z!E?{ol{Gp93$l@z5i2H>a7*BEODBZz3Q=+(NR4g66BhJ9*v?oWQ(u{6oo8&cE0BOZ zgS%nCM=14qMp}8ub*v2JLskI74UFJd1067n`oIJ?dI3pSlu-f#7XbY*TnAgUhrQ1h zv_4&{Tl3C47{Qp#fpoNEfR+~dj}#OILs5y^`jn!=QiKlKbC~Q)>0%06x~loks2uD^ zK6JOfA-nQ^fA!&wK=x1b)*^>^--1id zDKmkei#UjO_Yh|7;xmX0N@GwKNEYr~2Vjrtkvs11XHb?as))v%mqBV85CW~vHz8ikn$1iDfg*B{V?Y<4@8>pt9E-*>0?i3k) zen+P;mdmQ<2DG3Rq9WCuQ*{qbz89mjzAw1WfxhC}z-W&S-^y z%5M>EZ!Pc3Pb=)28r81@e)wGE)o=g3Lf?=OrwN0rH!cjXU9Wcn!@I8lT7Z&tYrtQt@!Jul={7J!C4Tt|@P1ADI# zC>c0KyOlDVcqUQKRsw6!r}^x`x!?{>fo-PaDAP`P1tsSQ8E|l2&%pAQ0e2E$ew;hY zNR5g88r#y~t>n`d3?coI{tdL0IthkA(wqZFxgkgwWPdTqO4oVnW+7DNBeXl)cIBi2 zgb)B2mN>Ei%(zVp2ng8RY&RD{3J(a>5-peZxR9u*Vr(-K_Z-cpCwXW<;-$SyxN633Q+00YM zOZt9x{`i|-qS!I>=RWNG8xw>`*Cw+kOmf}Y`uY$yHqQrFTIAT-x>xNd3iO+uxG0?6 zV*d?I2kc0Ezpn4b#!=D6AP6MN@136zagE>*zxZZ&!}Kb)C)mr(X@gH^MIMPidhOQQs|;`d@>2a%6nkQz~?5 z;2qGQd_u>iV$EIg-4a*X-=_l(hoKALCxh0OT(@Asv9SvMI_uFXg%ibWdV`w&Awys`3~Z`<`%<95Kdy4R zz@2f3Bd@e&hXCJIe-|+b)D^i8R@O@2-f`d(0c*a_uVKQaf^~a-;a&ZYFVsNyfMjnI z6Gv#|kg^bG63c;ZixZ<{VN<>Qtymc;;CEl=`A{t@M*r1K(rJ|(X1LpLGr=sJWxc>< zR+oPkctu8|dp>6dZseA9cWe0?q6wfm#Df$bs8}w^qXp1fNea>AIpzuXU7_JB#%=&P zhEA~86ry!7=9_BCql$m(*fxnTfI~Je1`pbnVts|aNRY;Z<-`e zar;$W=`)JMHzYi!@>@`3QjoB~-eQ|X(ZSqUeqXLnbgblCCN;Kh0the~BU{j!N9z?M zMW^aIxtT8rbvH8wrA!7BOl_L93y?qw6+NXFiv}({#x>Lx3X=C`FzzFF)tUyG z6=4@JLV77hnkD$dz_w0Z;Bx|tFVte&Yf0?Qp%usy!$TyQ|DL|7I#W(=5q@3CFj0T| zww;-of>@2pxp%^>_D&&*f7hGOTj}jNL|rYqeXW2y%2y}Pj7C%61bB~p8_TE4cN?Yz zYG?F?*hKr&(!A}0@&v7^ z+4|Z?aWIuxBLGUYmwq*M7kp#OZZn?g!;Gk|PM}X!U~5Z@2W7*Zy)B9qig)*y?t_so zkaMNc1Iv%L!t@$>9BQJ!*T-x+)aL?f{ADlpc4f{Jz!gammeZ3ZQ@90t!>uS>$W8+2 zdRQbO8VSM~b#J}FYUr{8c0)=6-ovoCH|7pq65h?2!h=r7zC=j0_(PpY4ciAA1qqKg zWG);~6IiJjh1(xPNgkVTG+vPC=&o-`9%*_efTRu4^rpdBxJ-~KGptT9>nnR74PtVo1c7Yq4sxM@ z9fZhNYy>km1;J^tS#Yz@+^8}@NA^fIG^>jzQIM7bIcb~ZkK0ZtauAM=35h_dmEQjt z|5XDhT7G>2;pSI(C+&l#7_O?m2*G~1@XS9B{Dm8a0h-7Mm;zEM1en@if+YzIP>7|T zjDy~tYbhbs0^VHB3R8_4AxucolxJ;GQnAD)ty3cXZn(1v=2f)zH&}&ebe9liIdV*& zsNbhBJ~Tj=`u4*BrakEq8@#Az*DWQr^Xp~9`*qDJ%D z4K^3+2p8#$sf)k9c7OLb{RnjpZUEIQZ*J-Pw(>c8HFV|ThPYsTPo7}w_I3-15L-H! zK=MH-SDo-r#WyF179nci7hcT`22@mhIG~;YvVJ9VSOa&yFihc&(bio67cIY_-pMj~ zs4Ly5l?rXKWEJ^lVUhVwuIJz9#hjhF0BdI@?<@;7(;6dQ=Et+ebNu~6^Z7=Z*^>X6 z3-$QX_V_X;I;L+srRTGX`Z%&t=AT)w%W6eYgr*l9zAJINyR#6WFV=FhTlprU<^KGP z&%^V(9JLg*>s`t(Np-zOUoXk&EwHR^Y}-S}(;3Zric#oG_Fa%mfd=?E)^Z)Q6(Wti z`1T`H3RV?ZR1mY$s;itKi zV|CB|zL1xwyWfSyD@ts;K&jxN)Xr@Qa_a1U4ZHtMR)L+?s;LZuO8z2yomxtO;FAhF z{yvHRh+;=f)GZVEEXa}rKN54{NL*5#FV-`8t|@p{K`N?2a-t7VOJ41le)26Dh7I)~ z>ek1|R`j4!t1?Vp)<|Y_X^>6N^6D(RwZ#?+mwdH4UPx=&0?QS;VlT;_ANg+}(T z^hQ%6WZJaO>@(K&pwcHx$)0pl4c2F`a`B8F3-|2s ze-^)vI5YG&IV)Gorq57d~;+U*_rS2bphYTGI|o#ojlfLmRaX8r_eps4>EX9G@c6kIAiwF!6 z&P7DVtV4(}FS~8GebmY>Y5_rzmxg-TGCIPfEAV@AQM+Vxv>oIQwZ9*G_-s8VL9=P< zvBXGv(y|!_-=vW z42phe&G+px-$7Bizh~{fsnu3^?fQRmFg_2bwPy9n0NKgN;~Jrl3%>2kD(xeYWyg zE~)6OwqV`~*AX7CZ1>UH@9X^YGuriDsg1BWEB;{2{;B9Y1ZFA5z(FIAUzPPn(x;@L zyk@ZcNOgbg&0qWE?_S9D&=UmVIb!xDBDyxzy&qCKyu%dS$g6(mKIBO+=H(ELD>7Jl z@DsU0Kv^|*Ptp>X)V%iIfzf=Z9_?_w#0^fTu@CX)M;5{ z;^7N*F7=XV)8qqNSZj)$g-)`36QPq&QSw(q?=QRX_&$7VM%G6-x2H}1*cgtJjK<4i zY{(lS!(Wjx1K~Kf;i(w-*`l;Z_c2PxL%4AbAN*Bxt34epMJ*=BwGNlNq z0n)utrgk3oF!COuxH_3z0;L2J{#+}BWKG1WM@PrC>+I};EKpH_P7$S#I-41J)t42| zRYHzl<_SLNT#{Uh2TgdGAS(DKDX;FqQ%F#B(YK`y9-U(^0X2!>@G6F7fB;pB`TKrj z7RoVqN=tuIKP=dI#C`Ri+}ixKrcTBf_LMW8)@fUKEB{FnlYHHuh$u7r-v)2>?63^| zUz4buJzebHoG`1#bR-N`9Jv>&T8A{~QYyx)|Ey{cw+ZX>py0PQ^!&oBdwuq=Q?D|! zimrDJf6eE0qd_QZ&s=gzbkS!aD6=2KNcKrW?kvTh+IEH7PtI7flGwSK*qn_W9JSmi zvj(C1MrjFd`$l&8$PHyP#*e3G_oF+urJ12uhUQq#x2yjg`NvX?GYci$hu`3)pl%-A zzN^L!7dr_FKDtcL$?Ra)9S3jte7LCOGqSOwY_lt%Mb6jgGxzHo|ER17Ls6ppS;f`D z#!dBE%bi*IA~6dxn!NV=SG4i5te<#dm8P?hWY^g*wY}@o9VMfA-;hD%_oSh?)b*n( zX+|ca)MhVWp#mDMcdwQ#HA%?|!&^yH%MDv$?6&oE>v7=S$;NZjRmb&`yi-Xv(5-Og z^-S*iQI}DMr(m0C5b5|ebyaekj*m7MzR*_U`w z#h#=m*J0rFJrZKF_}P#!QwI6bp!JdXqfzT4F7*Xpl`H8BPbMGUK4c|KLkd+}C-snn z9Wm2FaNwV5*>tnzX|`>&(1#-PZ+A#Eal|q#DH?D)xqp=V zb*MuxLy*Sy@eGWXrY%YY2XnKkX*~2*qv76sWRki}S{s}i(VJJ)HMixXanJHy)6mzXL619aJG$uGO_GWzv1(jTJZ=h*dot`j`B{%YAZ+D}QU zE03atariM%Q8D*?d;Qd8;qkx+vPAg1Z$XA4yH=1&^ z_iavbqx9}WZeOo=Der6?^e+c|NIz)K{af2jdg|Y<^DhF^@h2^oEoiF2X>#<#c|uIW z)QM%y$nH*0`h3bT!7usm$?ue+%+KXzho(m_db;`FQ+15X7AE#P;3IB(y8C_!1?B(f zVRz*9^}9y_8}47++xoUG2R-~d>`oV#c`_K^87ZxB9^c;W7u&IW`TlArRKO2*q*i}! z%@Id+IB7nED8Rt^soHxF$+kdv(qJK;Jq z(FjX3J#$+sFVZ1ooYCe*{jv7zaE?7J9QiU6`p!~f?)Jjl9S#`e>HH0+-x4Vir2Bjk zzq6GO$*82=s6`SS<|9~-zTct~4|kE-im;BMkwsB+lIKjX z@o--EG2;y~AM(ZU`dG;PX?23Tn2`<^u!6dT-P{EuQ{In)D-pEJcn8$s|CS`4W4odu zm!t7<@bfp5EKO0jIpB_7mTj;vmAp_f`$-f#9BytnxT^VVf2M|n)536)_@hp1kgP<{ z#j;Jf1abwo7lh_{MF^9`z$6w6;GF2T_)gRU{2CnHCS9WUmy$_?o%u%{iOXF>pXfEd zBSof;elj{xUVCu;Y|!%A!^!H_*v_2rzi1DF-8t*>-l-a zrl+{;1SFiHluxe_L5$X)qs6*dMVp#$vRMY z=l*QtIrsrn)nK+lK#@IgTefgl;j7YWKTe=jY^s@s6o{gnLwed+Hq8xw0sSQ+qXu4K z028WY%qPcwxrosR5X?yUpQqANnx+i&r$8>h<-CQ_H^WkLnvWqI=w&fBXY*&agK$TS zG2YQz?gQhbWcbBQaKZY)KulQF|J{sd(-;a~T#O6wlvAVUyxw`*s+2!a;_P!0-VqmY z!@}1+H^yMiX?41X%!%sHzY3+T)3^~2wb^!#gMXi&N9wLOclQJoSoQhmR`+qv5UO@8 zEz*ZWd$)$`aR$yYIu!o-2ISG&2SQ=Zo2C)mpX#s5Z2nAssE^4!OA2~c^dL_wYRq-D zW+c&*eoM08LyJC!$30hk&i`NY#FF6Y^G`c_7PrpTBoN})L(sk)6wJ-737WMpwx(({ zrCKHV#~2-MbgGF#S)+y@df!30bS*iQ%SjB_h86srotGZ+i5$6Py7BHFbgw)NVx3jo2zxn-1TrWgwzF03oSk-or@>$Ihi^A*tkd&9?o3(k zN@>q_A00Taz0GX$02e00sOZBOJ;r;Of@g*}$v=h$YU{b&WP7QIS7{LavKb$HDbyQ6 zbxG+I+tVuU*!PK*7|#1DBO6~Qc47$q><~RhAUA z7W`LM-%r7vV|!Cpddl(%5JRPj`1uNV>64R_#wk&nm(ZR*mY|Y%KoFq1#&M4AEx}2iVSnXZL_TG+L2c>gfmrG(QWZvK3ERwq@ zvc47R)d)?>Ep4b*z^c@&{EE8TrtasZjvS_qI9gFPHe2{a28vhtm#mJ@yN?Jj2|E1! ztMoLus9 zMsTVOO(Mb?sy5~*wl^NRkE&?Ij79Gh?pKT=VbU&a!c*;UFg<6BolkwVvfZu(j9o^Zf`mRO7Rs352kuC-i`# z9&WUTN=tHa@nx=rxuahxv}w7JTCEYOSOtl`Ozw6rKD-9{0!=5veQ7DhA$zGAc!aA@ zrrm<8fq}gbZz`-d7NN{(>*K>jPOB_s4~i@-Po2_KCoq(k?!cnEVS?Uvoh}&NaPsb} zGGmrG2ypkGZ^Iv0;a%)N+?;w@Uasbw+t zRr!=C4eE2DUU5*$KgF5x9%I_PoYHdzqoSDDgFmWGeqE5Gpi#<>Rv2}QDPmoRL$B~L z>pv5GOt2JzuoQEeAdQr;o;2M!8fqz&8B+o%Y(*(PSL{|MC3xRE*N~S$SukY;LWnfV zG|!{)a%0{z`DdC)W}Kov}K?3tp(?SlyTd?*~Z!VjaPO zccK9twA^&mC3=BO8)rYBl>ePBccPPgG^nJilgws2u*c|X1#WZ=dM@ZrIJ#4&E(5et zt?!@_Q86$I_L-Ipqz)M^O!m2UYXJ7x=5a1!^>dUfOuA!bjLg7DppD1n?;-VU+cM*t zc>5MEike=gYz=4d|VqmwPYXr~Qf`v8gGg`9i^GE@S|MWj?T zM{94rN0E0!O;fmB?Ht4VJg#ao9AkUnlvI~put?c>Mg3^19^rOV%AFK8CulW(oFSHN zixZQ;j4w@FTx;x&_dHo|P*`NH?zroxeWpyFiF?Zw&polH%!XXLbnSUP!P?zVHd z#=gy;A)8Mz)rj4#b4$D`96~tGo8*Uhv{AuPgIY&0kiUEO(n0MVf}Pl7xHB z2WMj-n(2Lk{*}w_+j~uKtY1h^%05+N8-zsu+b;dltT22p*t9{x>F0#)mRzgKPrnnM zGIcp$%Z;8mJK@nIr3Xk6DWZ2h$hS=5(a=|M7S? z$Td3h5xudm5VUjOor2NBR@0%#VPhYYA28y)((JF1KA4=u?@Ysu0GnPv=}PzN_*47S zUmZSEMCxs9<&pcxEx*0_w^LXlC5&TmQ}pRv&yL|l@lqRYKydf3s2gXuD7V}v)^Y>lDx=f`72G<ebS;=T5T6zPQN0ngRhowAHtHkT|HRH$!_OIA+XSd)NdNi&wBY$}2ppV6jF z(@N7+EG<(DD#lSkP_v{`!8KCBB~xT|0Y$;(x$XNr$L~0Pe{`fBg>b*``@XL8e4ST+ z|9aHV@|z#OS+Qb;Wq|*|<11FImaJH@^3Si#z@NC7T)hf@Gr=GC`=1p|p`9FjvkJTa z$o>^8USzD9Kerlu|25A441UE5o3+coOx|zNB3Gec-XB>{PoKX(;=T0ZYTcok zkh>Bgrb~3E?!>;CS!`j?UsLXjJ4K`I3meK1a`crlbe&$IDRo`kaC`A~_$=el;@1IN zZ)+;0u)vji@t=iPk*E2Qb73Q=CL3or7FB7clM0P41Lg#Ec1?D|dvaEfc(SQ};3M_y zch$w@!5jH&VuBZ1rS6%rDT!gItjje7Q)P#4?T76jYgVNXEJC zMY8@H`!+w+aPu9Vx^~?YFO0vvfZHS+D%6>Jz+P*q%6``|e|qGGwqODyfJ9sLRhK*5 z#mmpk?)jA=3ok;5wr2IkA|DwAd!f^6NqHP=Q;`unFC6nHuKl1@PK_{%@*oM>P}SbJKN34p7F}7W9h@UrIgLd#>raSwgK*JnU3+e zgf$F(*N?0~X(g?ApCTFUJ@uVRPmVIzNo;ej@}x4Wg@?$x)nl90XQ(IiZ!|}Km3Gz= zW^!X(e8z`v{+;;8T*}3nDmxjLW7!Hzz>b@B`Ys&(ZS;T;kqe-R-~nmoUwa zx}M19{#k&PWt&icA^*~`aF)C&{(#re@%X}_mls52Q$I)T^$Rl>`8oMhF-80W*rxk+ zo1}qRsZ$R}GR&ZJ4@Xv7Gsn?`*dZtH+0^XOZF+(z(9aK%@pRsWlhyR({#3{z!#!j` zxl$%%oBE~4Y8n_b6S66vX{6X2n%LuW;=4Ud%46QpHb&e8@=rZsTGBf4>(cy5!du}Z zisC_C_dki&G)pJv?!exiUKA8_v3Lu)$~oWF`jg}?4%X`Ou$a9c`bXhZl9dDZ;t=xs zl3H>K_91h0+ui+oF?f3DyWcx4)kK&XBkwUrP6ZGbBn_tv3miDd{dB*em3H)+Eejs# zDwBe_)G5ZB{R_W(6n0id)E3s_9FMoBqqFGoM0q)by9HH!ai7z>wFOM69=BWG4~ZS1 zVnu~uyN}inJT>Kd#S6@)O$YBCU7C@cP0=HYU~5vfqu?nYbGP=30Xtl2LhV{FG@oXF zIOicQNqpof?~fjneX2=n2)VuZD17FeK5}2wg3aWHDUW_v=f@Epp5?IXH{}HbPf+;J zB=C9JUhbyTanAQ#*-l#8`&X;gS3Aymq#End*O;UInrs51gaYq=RDlq0YnQG;@F(_r zOzjEvz;Y5H!V;FLL+lJZ-RbK7{5kw&<^_D(h-%EPy$bL5U1Qwjjm*j&r*lG6Pr?Y0 z=AQN|2mQ)L#9k2rBJ81tN^X`!nKs6eE{J%^GT{poR0x-tVAqBpZ}cpRs456jBxx1{ zT5m_c^TXqY&sP(_R*$(t{Rjq14uUOu>ePR6dgTcp;`pE^+*VZVx<$J1SsP+KR>P2K zlQi#K3WVb?2AXV4q@Ahw>EQ<4;)h305gjfiFw>@(>G!4>&l$V9eYzRDuJK1ZL&3UX zD&{H=z(|uJ^`Vg)M5+miivmuAJ@H}%*bCgvd)U4DOn0zXV)lyc4K30yhcwq$q%?33Y*d=JCx$~ zl}1#hS*wM}6P&P}dge`;pZ0#Dx^VVp##m6Vho-;_5m@uE;s9lKUEN%eIo%kwXl+i0 z_4PejToMgNhIu*H!R;h2kzz;c<4|vrhR*qQ5ruqeb=H)rLRJ$#qFlf4`vGFGx~jj{J3iLlZKSCqtwHt-_=U zub=Yaq$%qxG&+bx#DTrS;gC0?=W`mM#o+MdG*AZy`H8n=)%|vju_Rb?RhA!#m|7gC z-Ryh|Y}Vr8c!JG8YtHXUt!nok>DMHR2Gd>g4;a2P_;9S{#`@XT`I<`(T)0^bN#|A+ zH3DAG%3`#q@7B?&>V7ih^+N7&EMEPg;aowX(Ji~Pvd_wQVyS@cT6gy zui^hk>O`lg_pE`m?v=;k1Q$6qgzlyLRvJX16YdY^YRtnmBNVB23vGiWaf8Hm$<~~V zF4M9zjiLP*HtUsH45HC**udB%U+i(6;wgy!sl|;%gUF{Ee|nskTI_XPD$o_yX*^0g zEAg{ws}k?mpQADp6%8vycHP5l`CFzYEI!2)j^cV2<`b5D%*oIWuIPAyPo~c7siM;0CG?w9$ic!&Ld|(eRGYvHA46 zAGTZ+^R}U46%*e;#wAw{i%V`F3vR$^{kO z{vLI3y>p(f$qU?UyXa!Rb8whLTti{zWZHi3!d;KpFY;^3Z>;r^U>pu)?B`w3Ux$>u ztQx+gNmoH@pfE|F@_b&{w<3G`obSYT$f!5u{a*Qr%l;WHd<$QED}Pvt8CyJ~3{K9J z)Z*nAjXw!biX-i7S8kzDerfp*BFGI( z*cTOmv2MbL<1HkrF`@->Ez#c^dHu#>-aTta$=(*1^c)o$7KSP@jN#?r$3L$7Atf$| zgKI8Imkp=0{&K;(n>5DGNIb9jkK>V$CbmrY$ANflV}pl=b$uu{(v&j$VsP3S@l;uH zeviCwu;Tm}qJ&*H{%$fqoll}pRXUGO`6TX2yD%*}TdsUkXhx!}KTMEDoKGUH^T_Y? zp*rhD_j;q~jWu2vhvI%qh2J16tKpI+pel2I#bsPhi96q_t13CT-Z{1Fft@JR`k+Yk z%&BWq!p6(Xok%W)XHzXeDKI4^^qVzJX7e0^OnfJ^&thP%D_MV?n^~l)^BlxOtVB6A z7k0d(ba1b8&-8j1cIYN|zm%{|GVJIs>OPx+t~WS)4eQR|8w*(UbK8p}SD>vs!MPd< ze)DwouqWHR(c=UP$q-=HcXBP|P{{jSg`pZ zEI7qQ{TpcijbpbL@t7lnzQ+y6n9*wtyN4rY z`1s2n%ZGKM7ZPM8*DS&}82%Vs%`qft8?I|2_EptJetg30Ax=K!mp0=1r=X2y#7*&m z>i^>9HAy=NM-02?@~9guWG&OPBk|e~=e+fw$>&1{S}aXX;cPOjJIEwOYm`O*T_|OB zriOfF1~tQb_g!;@N~UTtWfYrWW##RVF;M$0;V-`nR=qtZuHOrHHNp{)>WqaKot%1)fF8RSo zj6>#56T49;I4@+NZv!IFR68~SRX*!8V|B^L(Htk9_1G?O5^zUFyv9J{w2PfcUc)fA zQFTVlthEz%i-&TQt!Gm=N^cJg)!Tc2+d|A+Z6S;Lr0~v)%o)p>|B?KGsz2lV)ZirS0g>h09G^fjn} z^s(+o+8f01eVBIM&pnCmmz56U@CO)jRO$`lJH={r;SH^;a;_#J>R;DI_D$u)n4}=_KAOo|P3LTN z>gWzKWp?>=`{k%MgfKHE){uy4eek?a^8=iaGN(*dPp(gONU%Ox%Ivw@F?kgwWp$ex zN+^|&I3ZQTsYi0Bw-=;$(LSErhjkNNv(mqi_)U{C`Ow7`+kFWh+V7ERhkEyVt)thV z*%2MGp}U}rxrmoW7CgT!RD!(pmH4U_C{9<$_OQm4duWc`BZ`R6A|z{7x5rl8Sle zF5=-62j70q>Aedt+!YpEwS)Ncfbyk5wyS&kY5~(mrK>EM{A+2fj9BfKkt~HLB2p4s zH92D~s=kRGGuec?gW?L(bX@EkVTqHLScI^4?8sHlQTK`aZ|BG%9~R&|qI5k)qht3{ z9i;Bunc^o$flLt*|7Rh&Yekr0!u+`Vt7amHgeZ&{jm%xV%F}Nfu(tF3%SNu~o7?{~ zd52C#dqn%H8lgYQnBS+Mf2ui9?#Ev-mhJM`rfMkvkHVNBG5Ba~0tjYLGX0xRKQH+A?xiGlYuYluPE!P;CQCP2 z8V*!nNR6t+WhA`ZR1~4#l;34VkDDvBl=&O($oEpT+iEWaJKwAD0ynR05$9Y;`4l%` zUBWyUKZFL-gxqRhV}q_Fqxj+0PCb~?z(@^K0DnN&a=cYesY%A$|jiMoRh^Wp{g&m}jo%Huyc|KnQsKjml9iUYcaLFf9eU<(7$kOacGc$vv6^%j9#PO}(w{Pi3nIckR()b+53OLOAM@c_s{=zr zu;Gl=IU15WUFKF_wPx0hS=_m2jN+B1$r^%*3BdU{1$FH48Na)#HM4YxSpqJ#>I}u% z8dux}>!#?(9Fh-gwN4^x1UGvDo-+8B7h*?*ycw0!=+#}wzDu;P z9jdJ4tCd+%V;;9U)!TjGTsPK+t{u7sDN#OTX)(})cegf=o+iG&)E{SCE3X;wP5V3) zbttv{ew^KvJz`a=uJJ{?gxTssXuc$jz{3r_kMiZtDG?nQ77%)M--~)o()U;YW{_oPhq(XjtnFYctx@J@H;5@Sy3L`DILL z=Ep}~`Ndp#F>MOOVy%uGo>d8zU4pz37idA_! zVrbGhtH*ENXEUf*YPWw&btbg0(UqO0p}&%&hUd1>=z&DU@Oi11mD~@*_KP`KYRoA1 z&A2gxscI$}5{(VgR9(ONI`oXxTyJ;}iGSx^!m^i4@?1v-Y;X@~ErZNP4#MHC+ru58 za)C~a9-WU&`O|*xgnTFVjC-|LX9Ve1>a<%4HhqI+;U)FI8OnIIray%^Bze;4u~@!e z91Sgoo9SsGLAjjqLo0#!YVXAR%~)s#w!rB7LvAC2Y&*{WiSfMemG)V2bouK#%XAqb z2-b36OX-i=oHC^-jx?3gdC=6E3H+p8F&yt*%~E?XxvqLk4dye=Y{@>AM804v>aH51 zQv&1Z4jcnbV+)bU1968-W&BcD4~3Cx>cyL8d?0jTYrZ`U8aG_pu)77UH@5*7f*F__ z)bupzKe=VEiSU~(vedNNLf-AgSG5puQT_EeW-iyvSF1vljLV8YBhp>j=X3pT0kZFnJ0JN}M@ieEu8WO@(iq+dr-zS)KUtVIWjn z#t%lCG{)gA29>G0%FqcuwyiSaz+8OqEhZgKiPwA>8uoM&y>Y5!odV#L}tS80FS7j*z$=y@xui0ezn z-P9Cwu(ogHy=sBEcC?12Si{oc0Yjm_UK5{5%1J5Ba#aih){P(?!^TEacB)J?Q=^?hKy&tMf(cU>_h!esn&Hy zFqyv@yxaxb_Czai6-TWo=ES9`dV2gPE{x0n&5Rm{_NrFi>ZfMI z7Yb$98>ohI$g6hHZf4XiKGN@+Z>^6NUj7(cC`r-L>)X_22)ov>ORPb!3QomL9%K
      A>O&B?#r>_Qa;U} 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

      XiV{QMT-kR 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 zȴ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 diff --git a/assets/images/example-pda-2-81d9e41dc9526915a235d07c717a6a7c.png b/assets/images/example-pda-2-81d9e41dc9526915a235d07c717a6a7c.png deleted file mode 100644 index abc257d6ab3b7af40108c13373a4aea82ccfa10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370392 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 oEr0yPlXzrD!53&$I$Q%s1l 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 z zJ$#4MzW!O<1qCMjnN4-X8H83%X(1q?EZMKot&vHZnaA+v!pgnQ;qrFw%*%Mu>Q3&V zYsD$aI!R|1o&VO5J^1q&oPZ#bX!Eggc`dwF_Ypf3ZxPJ~K6FV`&Y<%cS zW{07)iYt*vTc8g{`P{eGWo%lfH6*W{LUAW4THO$o!#8t0)2Ckyxx=7$^iW(D(1UTc zd_+K1shgS9lB9OvCDEnHE1Q>p)N!QX(4mY4$Gf|~4(o3}0?pOB`ShzUI)52OZU`LJ z^Q^~H3h=B~4EU|A-{zJ1#;eU>wBHx^GJDLyhcUHqZm;hD66yrQkEPkbaUfgfTk1M? z!Vu^YnM+*7=-?KAo8Fi-T8$8=#WF6~DcW(|PN#MB%iw$%6rB2LMi8h3zk}!1NBg&r z4sV4(((CiELdrt^hf}াbo@w11Y%4U)gXDFfHe*AoL^v%8sHm8HHlZD881$P? zbjJlo%>2U9etyKSV|r+~Gha?3^A};YYJ1fnmCLE0`Z%JI$uL(hn~SyIx@)eGywrT}*xPnxA8HZ4+XuLz2$;Rgy+bKqi-t`(C^T#0gVr^gOj?>ijKrF)SG9 zw^ZMm{QK2Oz1=h>c5|&)@B;VMO5_viw6)$;>N216J;0Ycp77z8#xL15Dzwn-45AT0 zG26G*Y_4@mOP`2bYqv$r26@B4Ypeog^mQGahMn=-N+uYsvrPuL^CV@AHOMOZ=L2eu zo&Z*V90xAR?WYc9|9}c`Qc72DCcg&`H$7D&ENu%&UqA@*nHL!TI5|6}7Is@|1+q4r1lFRyAhq^;3$@yW17mSFWktgKfqOcX9;k+Kx2h^&=MIJS8H2&0^)D8Jb%HV;rO>Qy8e6pv;k?B} zI3Y|^%r)-U*N>G`LG41xvr`PtZ+$8Q`a^FRGwxA~X-gr9wO-Ic$fygV5Fb#HC&^~w(w2>`gfyIT&zAy3IO3<5mThEv zhR9jJgznx{fLi?zSn-b^O&3k0s%H1FU`Z(7pU)69aQyaX!)U}AC>O-8ju?v8&_F`n zE{(H}$T}6Pm+kK^281euObN?7Kg1iQ9dhW;))9pK+FSp`e*hd8Lo!Wnw>TxxNV5hI zN^}jf<1VW(!9}}tCqzz{nW5zmj@wT$Uuj7EzkVQgC=coK>Pwdw#mA}8h?$ZC@}?zv zno4QI#7rqq6tkUj`NmP(D5zh74c@K1vvU%2$h0APp(W2l-n77yUhayKqeA;Kf~KD$ zr29kLU4JPYA>m4DTHYOqO!>>N+<#SMCTGRA&R@)Hj0QsuKOPxA_>JRJweJy+`;T#_ zj~;CkarcQ-SpN|)wlklI3mWO9&8`{G!u(RJk+pIDpu%6n7;dt~lmcth1#ey@NCyjo zTI--ODEgjVg6?kInVM_ZQnmUOJs7+7rg?z>WKHvu8$o@qHQ;m>?ZK!SlnWYRxsxSb zUgT#30(~pC77o~GgDD~C67$zLV%^462x_1AXc6OL^r}_!>8177L2Sg&z|fP=s?u&t zMwmx|v(w+wSIs&6m)??Oh`sMErPcgd(KCINVc4XVb*o-qoA$Gx3&ChUfBoB1Pu&uU zEd+|DyXq0)Jvja=v?uLT|x!CQ777I<&lN1Al*8sQB3u!rPe*0bu_irWg<17{< zd|T$0UQM$ECuQApx-<(eultZb6Hh!;OAD0J6)a^vvbhn|Au$d2`JtjG{Qx}CN$8B2 zUO%x?H~}w8G)-e{m?`Q3-{;gYJtk_4tSt9lXg;=r6mdh50{R6Phw`8GWsh(uRCN57 zwHkkrcH=P*m(-Qoq><%ulCPcs!k}OFxR{tLiS;(;w2M!9BNuR9pHI=Bn%~JM>Hg$WEo? znW8Oi#zARd_VJY3oT{I}wk|NOyq$ZEoxG1K{O-6|lal2R#~(#RE`zCcQ71DWzj<*Z zy~R9>Ln-Yti(5U`-|5}IBghErlTu@%ZSOHp#tz3EkkM1wqj&h5Ynq+45YU8h^42uM zdIA)Lp(A0v)4=j+Od0qvPXPM*Y1CgH7|3Eckk?wru+dv31}f6qpf)sN6zrmC`vs{V z0{GR+M1?05IzK2sulh1@(MU?>Chf&Fl-CNe=FD~6zX2tGhB$6qxH)8atSp-PQ4(fr zm$IEkw9s4_ED6jr3csG2x=$cFXzF4*gd_vzeb~%?Vb63C&1ldPjyuj^7po#q)^AnI zN~_OA#zyEs`JhJq;80!rz#1noR;&>7?8pHMsiS&)xMvlp9E?-Lz26s|;w>V}_=#}= z2gg}3Q+dp%-Cu9drIlT?gX;N#Z@%+CKzX02x)bVdaDjV&zc>64SG;XEyyIIK9MP!x z$Sxg-sm|4}HD-X>dP{6&zy%C{xC7sNoJUhYYEmj389_BlAx0rx-Jzxw1LTj8o?Cj% z)xfTyag{AaAsA;k{xBPu7@+TTeY06-*F>Yizt+k!3)a%p{2j`XHk{E+uu@D;6k#;hxT8Kk(UAu4B2m4_v6XYI8U{>|ixEMWrlXkJKs5 zZQO#?04un}s`>_=OsK}tGE%%CV;?2U&|QXRz6D@luL#5#@Y+RK>_?YkT3^ztj#^dA zL?yIY>G&c`d%|Q+mXb1d_2JgLDZ)~mKW|$^a4%jL#oBIpK5z)ZMW?jL759kZWyd}U z9@$r8oEpgO>K(4hJSuSCml`Jvi@ZMQ6qqw!VRS)D$@HHKQ-)55xseD_mT#8=M?C3v zYi{Q8N7OCc@%@(KU}~3*xEoAN1B)TUD#!i6EbmXtW|3PO59x?XFwFsH?H?Clg3)#H znz`Zy{KM~gBnkDc3=kAgqmq@u?RAVbl@Cgy#XA7xdu6<$R+5;W z>B0fua6ffQ-`pc$R~U6DdzTNI&og%Ew#Zx>|94|KSx6mYu#Fx{mk_tArdwRs<5cwC zq{AwkBp{LHqYwbv{C?unF^?4DK%kVqpdRO=_4Dh~tj_a+@9{(2Y|E*}2L*Yh6K51C z+zDjs(~kwlQRsfhq<0y8IG|)9lSOz6@Bqjrq^7wlZZNlAo4A)lHZ+bfhcub!GLF-3 zT$NiuR@GI#(RLdSj6@KGHeTUKplrv?Oy+IW7S|#R8i%#tQgFHq&1N@z2dx3#JU1)~mc01M z%Dz?arTK$R^Jys|(l73n9j#0Lz-*&7tSch9PTF6PLGfM#jka9 z+9_QpP)6;XA+r~oOASzC+CclTzJ_AL7_Y96H_>L&7^UG}(1&&`fSk`}u$E5rTXtk5 z;j8DgQ@Ee5i;N2NmS(R#K+W2vvT&PWq|X3k1uAhTkp7TRcPg7I2Y&{jCjnv|N!b%8 zcK;5vz#2r3leUCz14;BD%_3#fCLHzifN#2Zg=UR%Z#e|>1J#as(B28b6lRL^4$M!w zA!j83_hk491atTS(}Z%|!}QdybyR1jB&xip2qe$^p-EtR(=s&PPH~sPPNpkTR2#U% z6GiLF(@$d_t#>O?{;*EF>}zSNc_XSxLchz|&me8(?uf?afRzGYvb%0;W47--r=Vfg zR{ZovGFLd4Rm8}Zu`N{Tuf0om2|(F?_by=Mi+;916V+!+AZ45W*X{E2O_~oenlLk~ z=4}{UY#05ITB4F>YuxTCOgr?!90A z#+r+}=CfrR@U~&?8lZsn?N9V7libRNL!6Tj+W8TKhM#X#f}B>|!$Y6G?6tOq$%|1E zG@f1F2bU|1Lx|K8^o4+7)QF7J^~O!QHLRlHo|#EW&*-B5v^8A_QIX|7Wq&bR`y3Yd zr^q35%#*sXgo_p;X@cNNQkb7#JZ9#IjY%X42@5fY0^-RAg}5fXOGe6PIwkqQ{wVV;bxr1NIaT z6hLouX$uQn^z*d?u$+&HAoQk>2n6ay3P5?j&yREHOADd`5J{)bzCj^h5!NHoaR2!t zT~jc%$*1{L9F9c3bRpBokhIJ5gAw#^x**BOcj+^I;>0C@`NZ={=!@Y+=bnei8LCQ{ z4qIc&e>hD2r&IgmdcR+RH3n4x-?^{iE^As)axTmE#`Yim7_Y!60WZgE_*!VT`Jqbz zwKFFWmDZZOwA2(?70CG@817LibjVDSJ&+*Soz(bzp7)7+`}+pHoM2MFEKa8c4qB;_LzDmzH*tS z`y$L`av6HJauVVzr|vOGVmrhC2~vnOkI6P61p)enI|da~3p!vd6ey9S_UArH-nS{B zooTP0e}dv; z^f4fg#UCt?9cSm6S(orNZR=J2a{&wvIo`0hm*>o!xF|%UfOMD0q=Xu1mR+j1UqmJBFR@C`)StPgCN78XxPk>&oM&_YKs(fMqV3d&z-m=(lz!Z_ zW8r35l;5e?qYt(iqN1!Sr|%w$Q)ae|=OQYkH>C62+g7 zJaOerd+c;e_b^QwvphKCgi{IQZmmh5^L<&hAyp-kJ8!~ zq78g)Ja9Hq4l4e#@2TkIM@uc%`$$C9`e}rU`vL)%H_2+prUm{ zA_tD%FeoAor#HG8$Q=gs#$#NlX@BDrKe8O=`CgggO}&tJi_u;sGrP; znZj%*?xa$k5=ll)EU_^JG39g-yE$0;!`0N(1|hmeT}^2|?ylUUQ6J*~Anfzc=Gvq+ z_q9)+fSQ6$AW0cKWK5Wz?6{qEacOEEuQP=UdmS(|gPB4%IrW^k>1}oJxqf z=)YAnU7@x(%NEfvo3!>qqOuL0PQgf~kG9Kxq+=3#Y=wrVk`v z%z_Ul6nN*j1(5V8b$So-)~Z_&D?`nTomZRzw_kANTD?zYn z@*gTiK;I zwqSvBdN5TA&#;-wQ%d%rtfhT~7v#fL7-U!WrI!Uns@b0?13l)amOO)P4n4|Nfqhq{ z3U~PW3Dugskwd06^vfQ&Q6=Kvh0HS{Pdic@P%w>I?Z-vn z_F$aQMz%l%vi)iyH2^_UcH0R!?hJc$eIxxNsNeX6#@R_^h`@M$<1p~YJEy(22JrZo z@7C!1+W%S(l{bW9{ZUMHKZEIji@>MaAb()v)Xy}&Itk<6Z@T`##g%QT@Pa-tAgIk} zfE1ZHQ{A{qe5tthp6ik(RYNPpsUEDxwI=hxFiyMucuLUl0nYi>PMWD`jW**b+azL| zA!|ICkZH`rKi*ZubSj&jh3@T`qIb_|E}Q!EO*O}0CJcd{&IyR`Rz}T(zn!e`c8@J5 zX}(t3TD)oXvl`-ns>#1>E^;Os*r?=(I8+_o3<8U{q`VWIP zGc{!f#zLpedt{sQp9p^&OkXD2zBCC#2+c_dhk5s9oiMl@g`m8iz)>$Fewq;-0)N+1^QlinYAUF$(w-S22eW1M zoQU6yNYgHX${<7UDy0V2L?{E_=avAWK{?GSuw$X$2I|k;tKJ*40ceC7%you=cpE6> z0qW~KvQt?T-Bt}&;AA8AM%J^tg#ZE9DJ^sAS8;@2E`6yEZ0Z0J1kLC4_!Bg4p*J`k zisYNrZx6_tm}V<{=Lb_Vtb%^7yax}@Wx0F%1<_%q6z;%*a&3PmgZ>2K`S*&O9oZC& zqFs=+5KL<%veUGNjpXY$3HAy{m3GTraM=}Fd1vu1?%Qq7zt%|6m3KMg)ji+VJ4>-a zc^=4Y&wV7f)=js6T5E;yq8B6A@($PAwKlSaM5f~--B~Tl#E9S!OcbGe_6_}Kjwv{3 zlI;lvLQt;4Kz3~R$!t^j8AGt{}C9hrQ3ps5V9jT$geTf%1l9%9Gd z^1<7_)&jxdmFOD3V?5~4c65O#uq|rb%I-*tKGQne`f^fcdFXm+o+GZa_?zIyH?xnx zmStdKtNq*Q)30+o+w^nU&l(s~=olsqw{37|<}Q~}w0`mCXhmpla%zVUbF&Sl;5^(7 zOwN8Ku8Zg4;x|@mMcxdIYz9V;fQSXljqsrHI-ncTqv=>+2sB2QG%BIc$46?-Oou}e zvfFBGERfa=02(-1X|9NuOYnCKN#E^-gO!G0_1b&w(H~a^RI87>_%<$#PB^ZddD>7p z?a%kQ{#>A!k!vbPYNd_LTLz}lI}!LQDHN*9HA5<|zHcHLIFErm zu3G=7Pf~3O5B{_i0st3E^^bT?!KeVhTtk|NGg?y2v5%6)qu;v@^L2QSa7Q1;LFN=h56>NIjk zOyD;l6Sa=k(l>Dm%Cn_@O~{wDw+i>)qVEk}tj5hra}FdIL}wBemdtaa_V0LyIs8B? zpoW2uH+EHnj8)&t5HE_J!1o}QvG zJ2C!zs+F|K{35kQ3-EINuL!GR{Is2U0Sk&YFnjl?*~oLTESH$w`iighB@i!bI`Hso zGhBEzC8fY0?uwM%va44IUO~&_DM0E*28J)k#F%lZ6MlINgUTqaOosBFdl#*%*77{ zTdi@8cY)sPgh?N>e^koGY=zIwE){Lo5V1!jE*qzu&_NSMlmc@vwAZ zaqsa@;8>9tjY2pN5&Jj3h!a3d7>kZ$t{~UFfwh>gAGjgvv|40K;Xkz)Rc)Rhiq@sUR<{ZF4~x!B ze4MSy*5c~9Y?d^1@v`p}lBmS7#^5p}DW<#W_JLi0Trj1W1aN_eqK!;m#`VSv<;90> zt*`0{O$^%HIA!hymDPXt&Vs10# zaKT)SDpv~S+p7d-LgU-QWx=u|(ru$}Il_sL5cpFA?F;9#$%>Sp+9^DosDEcZOk^HaqGZ8*FKM_lNn+ zgr)nhsCri;aY;wNS@LO8nc7JRi=JGAfj^#0N$@4Gg_4Uvl%948gfwQp8xSj1TCX5f0$$DRg z5)1i@Ae!)Om-vCw=f7vLZuu|DlJHB)U+nLde&U#$<)iJagT|gzbm{HL3ChG)dW#{1 z5RMp{y~!9}y&jbB8-)46NS+{fCPy4QwB)e^DW8kRA(fXJH&8Ss3bV`()DIK9VvUz? zVyGX$xJw-!S2a+Jx}TEuJ-|xi&n<`l0&#~_X_mMCl`KzLDxT{%N9MXL-ad4LF7Y$J ztoug2)fw-&7Vq9l8V3E&ZFBWSB+NfyC>yvoLl&dQwCd2ZgIP=k%K2-GwMzBXyn$6s z=8Ij8ja1Q%0Mzx`-52{X7Yl$dB_a=)lZZHB&x1^r$Zp*oGa%!{d;XI>9ctExeZ>sw zi9$F(Hz9S5|GiHD?^tO1Gp5-a1nQW5*f+x&`=7d{AvjOnd4|Ykb;cV+mf3T=wrMZ++?YkBFrpG^0_;0g&3;OMSVz1-1f%t( z`JT@M7R$G(5;piGTGR00vkcfdKnBt^1fWMA-M91veS3`{ zHG0y$=`T<9raK~6=)^%V9zA+U+k_Gyxy7&W``u-{ZE^t{^}c*`l^Aiu4Vk#$&~R3u z+&0-D>ZT=s&N~DbmSyQxJw6a%jjka)&A03*9+`OIqRCn?aHv(XzO?VXXsal^+C7)` z>9~ujaEJ49n_OZxT_-D5kp zHtZ-s+RmIvNbondCFqy}Pk;AMkZ5mp0%}YmP-Fb;VETi<3HT_g%o__VaQANeiT}(&hHLVdK|Nh8GZ4hjeO4G(9*Hi>u6v!2a8~kV*Q7~h?QMD1o~>p9JT#VZth%W zWIhX203;`{yM5RR&tc<;^C*fr1H49 zEE{!?_ViyG>gGeg)YurPP{f%a*Qm?8w0{RYo<{tU>wc^!f1|jq?z|Uoy#BmaUvekU z19!BK_foaKyDw!$Mynrny-~okByQnqRw4LGuQejX0EF%y+H+q!_MAZ|)&urdCwX~=szE0289drQpSLv#_dOyG z&u8V&vF3Zk&0Ob#USDk&vL=!XT-Ucvb9)!YC3gDs8_+##q2Dm8D zeVc$jDHhZl?eu{dj1=To9^fcD_TCC_{zx&qUYa^Q~+z^D^|L<#> ze?+zRv1&2K^Q=IlTTZRB*a+IjHZrDapxuv8cg-5Kx7s~lN5x{7#r?Itc_$_!<8 za-RUP$;>p;h@E;{SNgg50sBCDceD{|2X$@Y!;kuuFV|)cTEXG6aa#RjH@5q+8 zmR=-W<4b*Pb`)(WlJ*)=0!(-kYEZ1`?P`%etQ$glo~lERQ3a)j39xhqo*<<YdDl~Df`+}tdsxx|h%a*?qGpJU(=yKyRoc8{!?7OdsJ zrMogP0S7R=F>kQ*dQZ$Q5EfXq{N!MQAnMf!1Edb2un|>3*FpsF`J#GhtAPb9aYv*#7~pF(XiylD?(OfMn4(+WE!$qQ2&N0x z5=!-T+{&7LI;XZNz)ASG8~Q z-?A;3h~L`#cKRwN)D~^u)6nb&6(VC>3SG*ubJ~o{`Lj$nEWu!Ejp|{ezcTwW+9h&N zcgf{h0a+)rFB%t1ND(JrW`E+o*m%2sDO<7DG=gD8C`op^LeeX%;k>1EgT_V~#F_ls zMZzpILA!7Di)A{`-85iKX8n|e5Q0Ri$y%Dc>vTcNE6OM~y2i{o8X*T#=p>++I{^ak z3vGV#XxNdz!vC?Xj?S%%2)<3tn!3}ZYgPkXeN_WsFhY-*rb#0r5vm+%48E$gEtt{; zfH-RGTyW1C1EJaiJ~sX+9rZPewT4k0z0>5xo4VcP%G@pWdg-WN<|r6n__OOxXAVjl zSOPId8?BPQ^Ihk>*>Uz?{u%ei0sa81*c&EIZaY9OZX;43h!VrTPSsF!B79og8gf+X z?w5TarH9q8>#3F8#}yjmfluySBHv6>1a_KeC{nRsS|{=eb-Bms*m$gJLD?9|q4Xl6 zQDiV!i$R@>1pn_|OaMMVAw*rLp-?uFM4?8}lsA(7K!RM6ay}p# z8}xcXpTE|>q;Zi@+FmQ99+5NkaI}R1reepHCIx2F*2u%$T5?E&vhPYap=|AT*(Qwk z+Zh9*nYxtV1@oLYI~%jQlmSlpb3QJIa&Cxd23w4eG}UG3=ZzHE@h*XBt3kU>i$WRu zO91Pdxp(Bi?_SpoTD%eyn2GdyTp;KjRO%c<3sXwYnh}6UkKA0@%${WlZDsedb*qSq zdB$KraLuIcOi}aG^a!NYNnZm3aD+z?OfR|&n#nmI2zC6@V5aWOhw!$97#Q#UyQAdz zi9NH?ft15bKh6tX{Rl^2P%jIy{6G8oD28)l{}9nLT7_YxTWDqCtHWCRy4VjB2aXca zV@`vNw!4U0o{^b5h>6`hqzseR+sX}B0{b8JpKcsN!I0*s&z@^_xwQL{r$Eea5avf4 zYk(Dp==rys0H27Kk+0)3h`RQ7+e_SFNqD-^g+TLjfx_)r@9~(taZ}P(bm=#2X=uqE z&(G9?vT;%vX$vcRO}S?W7%a&$Y7eQ;vgZ`Qj286qvg(mo*_LVv0K--@0M!-HkAyjF zgd*vStLa)$=JA8sKW#-=xj@+=IbUeX07aBxk|)a+we|i9Ye1gp=4W4U9@2hRilf^U0U_-f+bTe_fZ!* zNxwXQ;YR0Kv>tE;XR$ORMqtbef*6+1EoyJJ+o#kRqkg=SN!@aZL@gfmS8c#IjkpBL z16^LHHUh1!R(@jR;C6AEtw#W2%z!C=Gv3N?GyYG#vpatAW*88sVd;Mf-~{E8 zX0g$)Xh3$KdP}gB-pWc+ZtauVp4^dvC$3^@HOuyL@*%Ui5wf%A&D1cj3Gm?swy%;N zp2s8ao3!-Qdl#4R43o1HsCvo7l{tG~@U!0~XzhKeo_tQ)27Mt9O>cWqDb?5@_}KR? z?PY5EcVl;1QDk3Zf*)*ARJpsx1}42P&7p+2KW*@lLcP+P9e?Uj`;Rykbg~&tB^Fvvup96&!+@RovLdmM|S{) zQ3)7NenyM1oGuih~Y+;!?8CzcU(z41o_LZ6AJM7)Uo7uz}{R#n$5 zV|)e_izt^Ft+^zrxBOhmfIoqA&V*M={iV?y;F}8oLvMODj&20zdv4NM$Do6Ze*Q}k z=gdtfZ)g4oA2xW!N07wa|L%djD`gm1X3E2ROSXNuOxe*shYZ?{=X;51JJRrp{F*by zjU76p2kh<(T!AX9)=B1$g)L{Gv!JPHrGB)<@8VZ{=zZ7%q&T+lLFW-QUqSkJteZoD5PNgw9{b##r@-4YP4#Tl=_yF7NbXM(O%aCFzvZz zlZn)gFjIp)_J+;gF^kcGo>5~4YZ!n%uWdAb@s2gi{(-%n!Y+vS`AIY+9+x){b_EP* zwUIs#Y#i{-kVvovOMUVe?|}PEM2K}7nZ7>9i1>b9F5EwVt7tu_8uAFM_oy%Z=LfTU zsoWQZ7yaA;tK<24V`@JUC$+z%G){*Wcnrk*N>Yi$Z(a=1YKPs1L&Ox~k56|&3qaXO zJ|S)TaKu7!BcRlSXcDPqjrlvv65#na8`T@{7flt!!u~=YyAVX=@d~ESkzY4$$?>C0 z51tP-)%_;>!@R%^=1MrR@jEjzzJ<2yHyu^PRUE|7c2CdaAzBo|nHfz<#EaIC*^1GT zmoA?1md-q|_n7T@-!O8V{$s;^$GH$jdfz1cS98hMY114=uG^bdA-o@`&nX`sKJ>SurpJGzuRkTGw_Nf3QH_2 z5(qO!?>V&uoZv5=cMGci+#8zsgntj+pG_r&&P&?lG01tTW&x3(Mz)J&#pw}tCN!em zqVD5*4@YBd|NO5GnhU4-HC0AUYtMM}--u3X2-P>Z9XQ_pG7_7MMawB74?-74`%)YM z6v+5o$Ikd0T?8Qs^akj>@l%l(=Bd}xLlCh@J3FlRo+Er5tB(aLW!qEO-pFJ#3_PVq z;tpW@1~7n!62aXRqa$X8&~+l}aSTN(1OVmaV_={#Yi;oR&(&mtSazJtj;-feJ2AAY zpEpu|bXZGei=9KY(27t8aX!sG?ushqDjkI0#oI7WR_k@oRuA0mvU4{#D)x0jM66fb`Ws^#=F$k)_qZ>GHTi6$t=bd_IX0a<}T(`UM%E6P=mmVQyCdM>D zZ2@~-9gEs&YY?rrByaAiL`(T_DtX%4^}nDmAuqx!JRIt>Td;ukBFsQP_6@2ScG?*5CXoG zvuBQp$%wM<6I)kdzVc1|Eq6RdvZc7uaA2F!{AE$fzy->MR5ugMyNA7Ae)L zDS9;8_JJPr2ur5$N!s#%2d;lAsqhhBKdnG4&g>1CEAIbS3ZC%w(Y~jndT-dF++1VT zT1k0Xr&0iLk>1=_<#LVE!f#@65!)D6A1NlLOg%nsbdI~P2JCacmihYx>lA~!YV>K$ z<{HmvT`(LFr+E1BTPMLSXU`qZeO3J&OntexOC-e2MA>_>!F?RzG%#@hv#wOgC0BKOEb+j+4}hfTKV$#>8)NrfjtOvK8&2>Vt#LPIeT!* z`axE-!}x6IhyYn?+%T(Za7lyl(9x;xYWTPG&C_>oQsp4b!Zw_(T+g5r{MMoWDRY}{ z!MuSKb3Z2iL>A*spi6PI+cxv8g6sm!xlHRtP{8#QO4T(s7aO}T+|+I-HnvFl_vsIy zjZNs;*QMoW?r2qtqOK_dip>S>w;tiwLPSEO6c1cahcR9w6Ne0ic@z^c4t7yX7nzqP zsr`BZ2n$h&c_Y#rC#_*B6BJ(9+TfGJr7%;GG&e@iFPqQQ?=VuFVS%vp|3q1-n0={}&ByzKLB!>LTD*%bShL0j3yY;xNpapRJ2yWT-WIF?PtgTit-t;)EPzj< zYA7`v0|HwBwaB-3`!PflL{9@(=}_O^<3QpN7H5s@dCYOENRTiUc$_W`=5i0jrr~@Q zz5IPRZ>02muLcDc(jFpV+;!nncD|*VN_oDe%u}5p{m5A3$MgYtEBvWk8GkV}ccgf{ z=`NjVLmI+px8fQWB2Rxa-al8&yW>@IJ6rpCST9@;|M9N+j zEHYs5?X`xOc#Fj#z@QQ@DQPy*b>_(mgD@jiyO8mCO+ti$fy;*(t=oT>`-2lyp`(;SDB3BLo88;SMpeK;s>Fh72 zY1zL&a0L-pw8dFz0ypX-FG z7h6b?H~mM4104dev=!0g6Yrj$P;HbstHWnFNK`=6vmN{xkH>qx_Lcv9p0&vQIAf>S z?sIg>D?tS~%vag#8o7No0jR-w+b$UNTC|?d3y@9UxAV%EIORT=aO*rMSj7}Z z2lHoM8Ie4uj?%e}kQ;V&L;lR8-B7heuR;1yVf{X+vXn8OBn;6mtm{J|LwsFtxh?TW z7-G*B4AP}p+Yh$0w(a-QFIMr-#%Hzl-~G&LwS;ULZv0v`8@hj69vzz;(N6(Rg4>aM z@?CEI9@3t{*HMtrSJ??R6kZiupNP&=kbLq2ZdABSVDt>oi;XRga{v1&3wTp(KG1(o zg8sAPGYHHFo!wA4`pPKStT*579qhmy+87Z5Fy^`Uccs*YZ{BKleW5 z)tg-4vain@t>2|uU(8 zhvl^b2VN>zllIUvbrZz&Y91Sk?m_IBo%T`xmD6AEz12Q6w-x^EtfLvWK+$pW+;{Gnp`4x2Su36 zHj~TH$!!?Zkr|3|&xTCqVDWqJ{QTt~JUo1SUa!~lN=ZWeZCyLhoY(813ni^UV4|9y zEeafp>xX1U8o_JKmIxAH(1)N~mmi2fgWWrAB(gDF|5HREhxw&j0lMLx3La&2zez%` zlW5>~xl&rIbEppF%N8diWe|m0ovgC{bf?WOYdsp9Oxsi1`ga!4(d%;RR3F5~_-Fa=FS*ao+WudJH zn1PG49{`5Xm)wFHUH=YBPhgw#a91F2fbvN8APd-}3>_HAV99-S-sSHVJDqGczTnht zvc!r}RH2avfUz%!3vezR83?6#Aid$Si$M$U==hPcz_OPfV)~W>D!t8d*(mvIGs*OW zZ@I(#1T8C-`3kBJp|VPsVVhgRngMEew9DPWj-x;hifcN1FBoGvG`Z3d_namz^6_cO z8so=;1B-JIi>+-Im-U_xn+S(u&GxC@J621rUch=M$_C{qsktqE2otY; zl#>B=tx=JiVf4H>``aahd&g%kVa*gr8{Tj_;uoGAlYm$QbLXQ{{Je)I^+^|G-m9#E zk~HjfD&BmZt69bC-=cT%;{OPoXG}aNE$@FO_&pi^cVD+(L6aBQ@hw9CJPy8!r`U7? z*kDG80DbL(So9)2;5)TC?tE7AK!oSbD!l?WPqx%wI#db;iq4)!@r%FvrQK{7+~k;&dW5&(mb{jy!>}2*cMt6!DZ;d7j1)}`ydV@d2>nzeuOS24 zOe|iwYgw~UszcW2h#&N!w`og67c&ljxs)c}0mmH_kuaZXs3BUG2BReCHph)W| z??j#+KeAI`NcdlI1Q2Mr30X4Z!>+SGp)8dY7D{h>kI7;1-h{U?DWoUOL!1|YIy2HK zV`3NZdB)p}Szj^OQu-bY>#L{aczZ%V(Riz}t}{O%$TKZ=#VUDW*5|5rZ(diP&zAwA z_sDoOglE;^StiO2aPDADuKnA*P1B)nG?s;(YT+z=%6Zgzh4*HJfj{}?VAP+1zO@@~ zL=K{_zU#`u$ex%%Q|H{_>r+B}b-uNs%-RoV_$%5ki@?R}RgB$ris+uv0Z+e1GuCE0 z8I{RlY2I52%bs9a|F0qj)2tHsd3Gsjmb0d^bWi+YjCn7o2baxeRNY~>#9RXMpmMs) z*l3m@;%ekBj;X-(N8)Xk=Kd=dFN~MkH$pD*KQgTtH_LL~FPV&RNURJo5`VAn85BI3 z)`yd#Fh*yJ#{0(uTK2&O!Q%_aMBz4p#?nxF#0k;#kuigilCN1-^KpDNo-2>bz zv+po1s0+zZRhy${D`nM*6f2XEtB>91E!KXTdxIRjJ&|LP;%%vhLC0UKN@?`odQ>EF zM=I4N*?Cb-)yE}hKP)F`P>7Rpl4CoTa&`YnAm8qMw(6i+5{e!03*QNQJ=jpKS&>5H zh6zWHR?Rghyyq)SRMf>Q#ns(4{#!dVI}}j8b8QLq;-Koe4_2P7L?AT+mV)cvyLs^k zj|ud7T`kA|$!d`)_W-~UW(OhdmB|}IZed$7cEWNlv}M#9W=SnlH2X#N*4!-NUlxU? z=wmiKNnIEdMb(b@wKq%cR^HoAHbxGl+-MLGw8XWKYP#ej_>eDDZRAPraNwjx?6?N1 zzd(fQLXY~V&Pi*!N;W_yDvrisjs2J_lm{DcLA3_8pU;HY z5=X7>P6R* zt%TDX9FNL>alP;!foqR5~*gsnQ1ab@Di6;mr~mgKk_il{6-}%L?T{x8)7)8=2sqKc-J zAyGL-=1w31c2a+-&aQ}<$Y8igU?q(cwS5TF#F-hCd{Dj{P1*TfQA>b4O--xzy7!oU z4(r3ND956$mKk|Ku*9k7r2RmXAr5?URTNiVbUOP z)d72)Vj}WNZT`fN>>#kumoY`{z=v=m=Dj}(9ARUk$X!sx>EpZ9m8vbZA7uKP08xS0 z&`0ma_6*>mJ3){^nnO1S7jGXnC}w0aw@AR74s?*w;eG;#5u(il1t+xPAHx~sC(8ip zM4*gbC};PNh!hUWs!*dFej%SY9YpbHg~^V&J_HITQySgxS;8?!H102JvrTMr$Zk_8 z@8Y>wZ~cJpUZ6H-^`9<6s$S2Oz80!c0}qspX8Q-pyiF6PE7JuN^tOS`&w6 z3i^)Z0k9_BP)aY*tM~Iv(G@0ehZ70ichW31x3>)uhC$i;TyaS#mDL)~IKyqNyvCC^ zJWo%I7XCU2ojx-|NP>g@SeKZj5j-oa&f8aEn937HwaA+RPVHU&`}q3&*_|N)fau9X z3q*K0-e&%fF>09iRDN!fQ?=`sGQOGdiruheC>WrY3Fv?#&RmNNpJpQ7ce@W&d~Ur9 zJn26IlO1o6QKyi(##M2zN4n__L+ejZtE@bvtGwl&?+XD3po3@7yordu{zzZ^wE7Tp z&xaHw)*jp#cd%Lo9QYSSd7I^o^y{;3tj9&jNT?ku({~W@ex#d(Jhal(OWDz@_k&K$ ze|Un#toXI(nOu!vBz)w1&sV5ce4(*RR?2Sm;@Z2i8e(rqezy(p^lHN$|3MH=n2_cg zcHst9V?}7Cqx-jHga?ml)W*$!eGC$DyRu|B@;kXGXCt&h>uN?4^Mi5_lEpX@Hi zKW)ns-qa=cV!iD#U*e}TIWr4wkr%KHpS!ec0Rt#@wG`w`(RRiIE#*fd@vQu8PwqLV z99Bo699kBiENbtvaX+5|nxT9ZXg$2iuRfu^E1APO)H!ArBMb$z7ToUIheH7?$~+49 z9>`}7rortOBo7+)y=78N%Y8E26Z8Wt&Po*!od|spY=L|{jS3)3CBsCg@@xK74%kYf zYYUS`>@k+#ywQ^#a7^mg?!%tcuTB_;kA?+AZlnxCLf_`B?3=aB#XwD~kb2&cZxwuB zithi5o1-1dfo0aok7N^R>mx{w;k^M)e~=Qc3}{!B#r)6dNP#IZ|5{A6nL+cU(Yd4H z9I&Ih^IonS10PBT()>6}aa|L9N~ppnJlTe!pVq$GvG~$!_4y!wvFJw*2<8MiT{FuM zdrQ%?b6a!=*k1tF5|yvIP7M)%Lh~XXmB_7Jk)gbd<;Mh8`XoWuX4BOgBJFRFeH&(f zr+fkW-IF+QzA=Fk{Rwh|f0MFf{9=^j8@$3~IbXi9$$3@exk8bw^Fx? z9icZRKcQRGHuy&;ZIN#BeGiGOmHRXV7ZRoRFDcQUBn1IyIRwIL^?sQlO8`GH{@06? zm2+f`9pw)d*uRi$X@ccC%sMJyr~IggH9ZN2|17$Zr!9 zyGk>;*ZRaDS#YhTct!EB%(ofw0{?MtkL5lpvy z8Jr=ck*Q!@2jE6k3{HdP?~HcM?XG6j(Kd5b}Yn*(@dfymF+X8Hx#Uz;Ry z49YihK!;MrM6{$qxd{sm_gJ-6veothZCUk1JAZiRuYik>MnEYP6j=^T%InXOs|sDV zk?Cs;RBpy7K08eqgt%aGvp$A0!qhDNZa$-49pb0QJ<8H8{ANC-U1Gph2|7|%`qcim z@4_FRay*jLt*15q3xy`T7iyh6S2*`QHLBcK{;jsdm|H+(dp>^qEj}a)lr1S~2*B-5 z;k{=UwP}(QiLz8FZm!!leQ!tn&HSNnm#|n>=g8Xs-u{ zK7FZahmD{Kc!u8{7#()|4NO5fbOva9-J%dk6*Oky2{g(VU9c(xH2)vE^l5fJI8PA5 z(@0sT^G5Cbu%QaCEQjN;>2Q0@%i&MS(x-tt!1P5db3_?&X<@;{Uw9`KkbUkUC>#HQ zI&u%B5rlX4iU_;X3!7y6T_Ab7Z1=IdfOaC)=rgpovU= zcL4L{s7^hDmB6$LL{Dr{^=n%>OD|V_?~GHHFfWVoh{$)-zrYdcAF$TsYTldGeTz&4b+%3{`C)IPYcD3CJ8}53WXs7@ zqbu>}icdbWoxbs?Wj5frDTA~LP*EE`qz5rwp^3j)ZsuG&w_*H-sb?|%cGA;pQT&5) z(6g3DR5_~TvA0~ftVvlq(y@?aWsNM(n4!O6XqJv)4eg}w`?#4_c`ekI)fBGmzJJI0 zOO*VbRecgsdi39FNz6;vC^e4vGmyE`A0>8dSjphEp~uXD-`RJyXLJnuKI~1D9nItb zk|~FEW%{8ES9|Qa&+c;+(+|L1Dg- zrB7K3)V37MBo?(dj65WFV;cTeDr%4EhG@eA=a~up7Ae)&Cu8Lq7$qo-ET37?@tg+D zwtbHCW7l0g|3E;v4Wck$HtANtoq)LT%!sH$_|(u}`x@3r18{&7_w6Uy)KQ(9)^>Is zY>NGit?g=BYo#!{$A>K-B7&nN_1UMhKN%%GxDo7XtZ^aGlf)yq;$gcb3pUu`oCMePP918yg_9?}kA?7zd13eE& z_N`v*_}Y4fNeWoLK$~<~;)*7U@r>!`@-+1nn9tv1y{rAC zRkTg>A8aXD*CCMnSJC;`((`YZIOa(;;r2mfu&8|0RPUsJUf zh6`{08ixrRD>Sxj-SP=HAiHP>5Dz+FLe&e$pDr;x$Mq($6J$^3|Q@nDICEi?4c8V mTJ806QUy(O$F_skw#9#CHwrmMZwdbcA9glZtShZc-)i# diff --git a/assets/images/example-pda-3f9f8a45c0471959b1a9054f010e9ea1.png b/assets/images/example-pda-3f9f8a45c0471959b1a9054f010e9ea1.png deleted file mode 100644 index 22a81f3e26fc2da0f1a73a4f038cf03085b8ea0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402863 zcmXVYdpy&N|9>|+A$>k4xtyVMjw4epF^##EI?;(-(n&Is%T^g4ah#bBi>$-NL~ZoBQT6TP&7a{oZ}Pzdx|;vG=z3Yp?g~^?W^_&zJk&o^E^9ep1`E zZQI^I&isCU+cuTaZQFJ{`#}|WgxzQu0Q}jGJ@0mMTQygI4!E-m>2l6x+qRmA>YG

      PpEq)A8OnS(-8=Nf3I`p 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 z%0D-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 ilW1&NqQZu*)_m)+e2(`Q#E1NTs zwGC)RiM|=uO^(iB#g1!$o1JuaY#c{BjJLIE^!#s)!Nn5Erq;osmsA~LjMm#JcZbep zoxS~SD;f&*vKV+1Cv($bu9_E^zh;GpX_foPmaJM!7|kmbO(v!DJ3+I927mRS4J&d{ z&UTJ?X4JL$d|Xpw#!`{O7hS2Nn!4tp8Ql|+;d!mRK?jemE}TY~pH<+ui4&c!8)ZdZ z*LnP=>Kjv&9Y-CXr~xg%s4rd^2^)ZsM7Kc7ly3#ElMS6VfQ~J2g!4?Z7WybihU1JKY8XYz)hN2 zX=`B7CPlMRKNFx|sq~#By>Zi85UJat*n8~!ty>cLQ!zCc^zdwXch-bR`zdj?T>hie zmy-65{m4Vr@zg@Sj@mHl-9gv}4IoVFQ-3U%@EUam#7?rk73Uab~g)Z^U6FnI$09s@UdU*k~zu;zE10^T_y(;K2`)5lg2 zsQp7wKk=#Lvk$qpyxMIoXeYC2Vlj5V5Pat?cw>%6$ESB27qH=87sH$0LSmnrhdS55 zvqA4h=>Sd&1!p$oWP;*GB}}29#X`}uL01vrA4SJNzJ%elYtPE*-*?~lGf}wg)?g#- z)ZqOf=(TcY^uNv`7gW}!S1AIbhXzUf9}0x8kl7*961X0G=2s2v_WkFS=5r#H3biL= zJ3#C`bPxkk%(P(Zs6CN9;dLfu2L^9&DR58h9lJoyc?E9?_is9Mrl(#Q zZcM#k1^lH9dz`s=>03e1U8#DhhvQP_n)Js8>`27rnh#);`)rsn^Yttc~2t|`kbOd|J; z_UqnRmxwElxc6S~#=&>8g5%jcF-0m-vpfe6t(>B<=8JRHxokB>CkO1i{x_^2$J-Ut zd~GTG&tgRIH$T0dc*&1film6fyNDlMyC!zbgdbD2*uPaN;S0^)fnn+2kc*!%C+Fw* zq7XzPLJEVg`Y;%yTOm^p3(hw5$ccr^_!3}yG9}U&J`}j8mpGwPkh(@oBdm_gmO3L_ zo+-d)jlhhByaev=b3wIWhEb#Ba=$1e-n0?8dfV;8oW+r7A(D1A+m6D;fd(e&kRC{E zm_{D^k_ct$+@prC=HeJ7YJX4B84x_|D(Ku->d)`altfzVd7DNB31U*l2fg__!CX6_ zZtvIi9-`(Y4kB61aW@0f_3pHsH16&rXndj&>|+CI?{r|{q-BQ)Bb~YpkmW)QUIP?d zhm35#oCAJCHA!@o`>aoGf*IyE{Zr9wU4gfeXh6N?_7L z)t+SDsP^wolQ8flR7Xx8-bwT${eAx?3?eCd?=A6|VOKtRi{iROt*i zbj3v9JSQYhF%&K)(4quoUS{vk*0~F-7@gEG(b~++&8@4D2DsY{4MXNR=HWAU|KZ^NziK*G`drYZ<% z`(6HxpqhjLJ5!d(PVa^>lByx&98)|H!0?3NUT0Vz2$u7}IH|}DGzqY~?lm9ILc30}x3c=%9I|hhN%7ENeJ6&94)S-Q>}M-{`Ej>N8YgaWd15 z^y7K`_Q;9NWRZbFddZogQ)fz*l_fYSH5Ys|K1MKu6(UD9d5D(Cw&{^`4^dJX2XDlh zICPyoovLBEqpEzxp=-xqxsPHNb1be{1e)w}&1T^+v*KT~9@6F{gGIhyjO_`m!-e~~ zpY=5kZ%icjdjq0-gQtp1o&G^TNNIHyp;OeZX<1p_0_zCs^yiZOZXbq6^LP!?gh-n3 z1E$JB)|H82OHo`l+Hs>@kExXI`)>%Q4V4vVn^x&ww_rgei+=qK*PCy7K4rXr=~;uN zvJ^$$>>2i6_2vcApZ*5{N|;Yspr=ZtufbSRX!u)}2u1Niw#Db&pNlDO#Z`Kte z?EMg7&NT`BngkA2s$YrHU%_Jt0C9kP>3f9OvP1%N5`>iA2|xG{-T&keWE6yw`soXFvd}P65Onh3n#U!i!g*LRx z0VgoUPaZ(#4EbWl)1#z_q>sLWs9SXw!U6c}R>%jyR-80!0!%((t>JcwfPr!MbWpjk z&SVU%Hj3+y`dgT?x@@V05za(bVqZ)tJb%rfdzo+v&bW10%nrX5;%_mCZNj`aIJCqL z63fTeOCWsy2lb*|CT?g%eAg;0c$@t{R@WmWK?trrhURYRZS#B8)_Rm1iem(BP2YEv z_`F`eQeh6gS0LOgU?m;U34JpQE(x6EAir|^ z4nz{pxuf)W*85iMpks#Xs(0>9R$BE6>qG8S`e61ZKh4m#e5EH*>u!!c>krgWl|cke z_mycOHiq!ukx1D3vpvfRAGX9yj!K?1Tu^Dg88siAT|7S6y)B8lSP`o`U#N88nWUk0 z?aT?A>Ca_9a+0K`@4ueY!QD#B!a+G6Po!to8nr ze882643#H472*7eJ`q?Dbk1PU#N&>5zuvtmV|a&%UX18r>g+Kvv|(1Iy1B-XVFb|0 z*Y`8%LJaM`X%#R%n3=VOzQ|qh<7^q#BO^h-vEyttwXFI$X>+HWR5)@tF}83fbFJRf z?cmXZDZ_;0E8m*$CI6SIk;Gvg%5xEo6UNMjqn$%;4$-SH~ z3st@kQ`gkTgWsJ`JmBA3XtsLs zj56s37n?sV&!)6GqB~y9?-NH~1U?y#6L?80qB^JfdV>c4?EO{dZoOce4R&7$Op_rWQE{g?gxrp`N8_5N#jQF&EFU)XJDd_4&wvR)#l0Rh^-oU*xy;YT;Zjt zhMnwf-*Wdh*5uU@oXbUa3^DC~b6=Mi`Q~Kj1A#V$zbMPMM<;<-pMkC3#174{r5uLB z==z)kgj#B9*qhgGhc4}&IJ-?or&V`+#YYU?6os9;A9KYg$GQ3O47Uz892h#?EetGo zeez|RwQ-YLj~lO5*b;t9lx+OSCJ+4eGjs2(st$+}oPzJDFH$jl3ix1xD1e?!2#_d3 zUfu{zSC$6kaUv(*XM4Iiuh)RPG{?OSFV2Sz$S(jYrNy3-zg}?l=z=4}isAi70{%(l zN}ZVo;K#8cPbKb-2f@#B{|Nb)H@JW%E8OB{_5tCpz=Ysg>-JQ^*C#DF=lzUbM4%{1 zcnUHI4f;o>r}}}p!UJVu^}lLjYzBC$iC|;~RY8o1*6`GizDe}ysb*lWqq~m*Vg$8@ ze@*k%Is@05&H+}&{~iGR#(_Ohs5qMs3?;ymBL56X9^y!m0oXg{pb=o1RQEiJJFLX~ zl1wKL!Hbp_gF<2^>^|a4-8;TM-|Dx$Ja`c(gvWBkI33sTOvBPpY0^8B8f&A2zSf

      miM)X=z6hHW)&Xvc2dM3MQbDw&j?EObMxybn%9uaU#PFlARq5=&b zTbw{Z(CW`4xsLHALCifV7sPIha;D(XnOFx4I3Mw@hd|#-E$s&Nny)t131m|qAYG4+ zdez;~jKqcUe#NDXjQOM*s(_P~&~HT;CV0rJ8gO2T`;5!sl+;UMQpe=_th&XZ5(Di5 z6F2~dJ&M!~wHEY&hBEaDy~5UhNo+-yj~yVU)G&u&Fu ziO{ch)UfJCn4KI=kiMeEYYy^gC6%q5+-+#?NVd0bn7Jf=XdZU=@Hu+<_Z{CNW_?d4 zY(5v-=Ax0;v0F)k{3xY81*&2dR?gyR3A>aUU#U&a?r2FQBqmeTr*KL5;Oaz~)cwsF z`b0Ign4WP)2rJvcxbUs+HPq~u@Tdjk#5YBM^Xs*D*K_2aR_s0!%baX6bw6wsSRD5y zQkE6gFN<|jg~$Qtcyi9XO_%|=)~=g-q{Ss#?89oaowC=%;D+^4kud1yMGl`JR1Yo( z&%Qs6wnw&{@LI_n2%0yku46V@jDGfTM?_tTw3SziY+lk9@a^r+qV^LdSU^yVFMIxI zBZ0Ryuq68J03_B1;k^p;NM3s`^0WFx9k^9tl;W}~ub4T(t<+!h(eTRE5>?2*?&!@K z(0}0E5W`(`CX}a?Cx1(gQIGuR{D10*9N}y($uT+xamd$A1hD!feplq;{Gb5v(S0QZ z*{GF#h{{&G5FrKi`B-PL@JtQGD%OJuvrOvAGcajf5B{!ATFt=s1m%+cVT~b(fQAM@ zgpDtntN{Tzxm|6*`_*uB@}H-Q(WvNXdyMVOoyHyHHqCTm1H$2x3s=798DWYD`c^c?q9?2kux z##SQ^@-n{u!4B7gQokoA#e2E?yh4@0({5QR4A|%Dprq9NmN(zAn*l?Tu*qt#rm;FHG}-JGRk>qX6<%%mOG#I091yCW2Eo^@5LhO;(0Q@c-WIpwIPR z&wg9xD~~XL3#uBvjgcE5->#N0-LrsMd@L1gDYO|wQMtf9{U>=GNo-Z?P7&O2a;p_Paa zOssoahP8(0{3AwNX$ zw%-&}dApTlQD@dlTAWrFhXdQ9kpV@9Xk(Iqzf%?;SM%}BDPru;6GZ>ASl!%!ufq9R zUP=y=Ip(dJs=ml&lGo7I6Hd(jDz9~;3GB*`w^E7-Cq;){N2D-`YghLDwM(kGa8kEo zn1x~%AeU;Rwti^X2V|zI>s;>-uaAx3Zb>h(#uc}^9UV)Q`rTUsiZo9*EE% zxF@`%04K8yVA(!LDiESE_0GS^yvfYp+EmV;+r_8KM+)KQ)CEZa2n0seGcA*FZO=u? zPS`;^-XP&X2GS{46Bk)^5PU$u+UXHKY>IJhs*0ROXtK_c7@GG(ajxXTt63)w%ePcZ zjh`6!;XWb>c>@^ymq&cfl*KcW5mAJyNjM6pKu4LlfRrB_{P(%M1mevKU_0bcZ15&_(jGeTw#&>TD=;zqMIz;H-8 zK+~U0W%b>`RH}rS)9YEh%)%jf82Zn8BFTI&|MoP1;Rg~tn{L~f5FKf`TR)!aG_Z~} z{ifP%K?H04YZii4pS88wrjh{GnK;nI6)wJz;4HNd3JuwBl)CE1?z|<`1FK7oEjX4S zi79K95jOT{_Sa7tJ~dp| zF|Zx%b6jH#w5^rNXbrh4{r#c|g(k;Z&nOyw4nT-dny}X@M5J2VtEXk(S9Jsm@9bLd z(^T+)O?7X)ADrI&pNwB7|=7ZhR3}4|tsPBMGW+y+V(voUY>X4TNUg@Tz zu)e`wE3Z@cyv1D)a#e~mkYn$NKD_5mYul+Id{U%X`wX9AFe@=W4^O>ChRZiZ41xJg zmt*m%tKp5Eu*@bF3r1Pjc7vfZ=9!XE>zQkayhbvJ zxB6GgC22$d8R12Y&d?-z+KieuZ#h~oA@ok<+HB~G2w3oG+5wDz--XVwz1_=1su8BT zAU;FUpOQ!=;&AB-VRwJMXPdg4+!mxVhk3i#iBIZAP0R8#%3Q)-j$l3wJE)rO$CQCq zRfDFXE-U0Bh@=*DC*(q6XTiUQqg^sKjIaN@=$3H8pfP zTb5n>eEX#EZr)52Ly%KuNCbfESbGvq7n*f=`S_xF3_w`wip*lZS zF7=Znordj&BL7YC7Rni8Bp{!iz%n+;Z>YXiQgj?Qd#+zxWZmB4lFa;h*Yfj{&nm(v zgt^sX2`49%Eea@(fZ*5Ze_j`4K-k{|+wlx|jd37*s`m0-ofHuceN6N|1AOL%c%EX)9OgU;3hNvybuHU@Y!vJ;_2?)dO73FL=RWFyl zMYgNV6+ja`g&aJ|+VT*FN|z+qW5?O}USCJr_3e#D{`KH_+)@R7phtPVID7QZ_S+*K zbz8HnPyCAh;qc*xzV0Un=*OjEaW-sNS6T8G&YY%#M-y3W%FNe0*Kl;yfXgRcgD_6T zTKBf)(x)D8VfdD|T}GFe&dt|s6J*Nho6#}K@BgHe3qBsJrSM&>;B{sN^ATCwFDAlY zK=;>i*kH8h6l#Fl_Qy8(E+Jzfc-|yRw?ydh&<|lr=L3*Eo_sogwj~Xd68}^u$iufM z|EYJ_9TU;VPCeIC%}3v4j@IYQZ%vp)qY{jIrvD3Dr*wr9!MX{I9Q%3M zs6FTOzo$=*2i7Q$Ql@OZWJ=$+eB%@_9uNJw(uk_xYNINzXopLlVd&1>&OEEQEQ+O{ z4$=I`IH|^VGMVx|%|0~0d-Rlk)Y$T+XmZgr>)md!nEQ`CFgRYw4LmZYuBCr z%z45tzE4-<9dwo9V-+8zCZHdrpyTQ|4E?pE1wLzv3C;puXMD0|LJ7Zgaqk&DGEdga zMD_HrXqnQS87cCPo$caJV->qYH?KTczxNt@j_S+0)9CgvF68Qu#+(_%OM$G~z>qTN zq+O1Twyt4_ZixJ9#z+_2v%<6rCtVk?2#DEyk+{;w#M;*1JYGG&bAox3p{7>k0wC-E%vd8(8jU z?DGHxVV&6S;L5(sR*xE^D|jEYGAKswLyw|ke}?fU9W78|I3kqhZl#@RPfq-kTU_JF zIu~8YFE@&$FjH?5dEo#j;{^BhYx?uAm8@cx{6iV%8lRhiBmS#bGUTNDKlQVRV8}h zR8J}YLfS12R!Rudc6I)U#mLz#2~dHfzKZ?cAQYj04_z3OrunuXn0^_?8TXs?&0wSJ zIUme^Qwb}#{(MwQDf@%P9NX4i8@7X?_C#XjT}8-vpQ zNuJ)4SX+7}emqe9B(U&YL6D;`f25gaXs-R#CRg>9%C)Hi;KZl`Pr&@F9Mx%IAMr0vds_bjDIQhT_rj>z`Cj(%Za_6WP-hZSKpT{Ck?DLTOMk&E@N*ThBeGza|y& z3@Vr@zg{*f%+BOAhZ5X7sR@-q;~v%M@{22ckh0${(2-1TL+J#-nio^+fZxCw7QT;j>~yd-!;#8vHdRK3=<3d&&{Zfap`h;! zxA&E3E3`f@)>2ZrGjM@!o#jmy<@%A9|POj@)!NQ&gk%*3t)(rfqK9$Y5oG**6 zJd)F_VTLul!MDuih*FpIoiK}1oZpVJ!??(q4>CF8j-uYjCQ6%d6*IRp_BNcE9h@D= zNKjKFt&U*mrMgzGS(*WrPiEFO8#QNczg3mZ0L~&h+AV(badQGTvAoP`Whcz;`jPbl zf!{%Y&}(7iHMpY1a`V~2B*=g=qxPDx!kJu6mxJ9^4$1o(kZ@F-K>pLNZ)Imy>z|58 z`@B*%DvbH#8AqOGdaek>mC2CoN+rDQAa4R?pp=@Ii(h|j{<(6IxBfuS6-tZBR$CeS%o@cZb$;wLDa=lDpmBVqh5l-Qozj&>_*K>B{ z&z|+uTT>e_(>&37Sy-y->gzcHx=XMV&)Dkji4|aaNmI^QKlNkssxy54`R0+5lCyHO zdQJOFlmW+g!UC%(X&DV4CzQkB+vAWs*oAdLPX1jY$~${iw|OVIUA*>rp+=~SGqE9T zOR8Bj>Ji(-3X?c2jKExM+x(K(yYwZy>zW0-0wvI+wl%~|!~>>6 zsNsVGpUImEe;ko*kcF(!J5ziyVGN`6V^x?vxU*fp;pC4J-gR-rF*1z6e_tEsxQvU z;7s(-+ID}*>3%gg;{W{U1iKAm{|u=Z-?lQT1pRVs+OeYidS^CUsNi8`NmXFf{OeG! z15Axk;YxM^J@fI*0XNe|xVw{G$fm{(obh&$$B!oh-)?B>YpgmNHKw!Aj-@uY{>#G_ zxN6xh?0=$>ef#`Fh5nbLhW#ctzMYfI(IC|h^aO^Pjj#TM(l4eR-n$)RP?TYZIdxq^ z%08_aIyTuQlezt+^xAOMbTt-PqyBibpzzb%ZGpFXW=m7gj(J?>3Ve z6{X$qiR)xGbewNesGU*G*^yP8QGanCt;AFd{sxl3sLncn%L}Xdz;B4(`M&asJ^s#M z(#Jh!=LLM{C8;Inu0v?0AC&do0|}j>&>N%?e^nJq8RH|cZ}>DjR1)OO#E^{*@D6UD z9-+Y;4U8u-w2BMC0MCZ8`}Q%rG=a_EMn@#$CxE!4{%)sO()76Fy`}bjdo7rX_{2Ap zyr{C=U09Mljgh3vLxndJ5)V({5)InmHMuWfT-Cw~FPq>o>z1av6X@uQcu%I;LUF=x zEA9jV(eDq{JoX37R8L*nWx9B7EXU!tUGQb;IPuDngE9W>oIAV%Uac1(9Pg1QOYibe zc4#E_S)9t8h$+3Y9pqa(>zIYoWO;ZzkLuxwpdnhBDE;jH(n(6G}4k*H9SL-uJ((#ULx0<(IckFKaO6UDM!enZh2{q#Itrz*+ zJIR*K^m7mL3Lolw0xryiXPm(Mf3)wH_*Ae0U1Tci`ghLiT*xqrKcwec5_w}0Zd7@2 zOw0qp2?==-3=YIhAx84t=zOP-m4sB^T6sPrSMQ^Le@-;-Cwe;9@iSYlTBLRStc;Do&hnK+|GImgvJiV6 zn_jKt8bh6E$A!rY2g?n6r06}N%k8{%Za+d1*X>zDl!4jbn+Trqt~9*y%3>$6&S-(=FfBE0oc70v)9IoXw9r`(c!8qnmz*a5bv2 zC-I;l_8&6LZ3vAbH*K;4173EaxWCHwR>!cP&EEWpwdvN7_3rN zYat@|1AQCYKC^ZV@<+wY4AP8D?-hC=nBab<+r{o{3jXZOp>quvjxVIQ=>{Kd@FOPx zoA(Zu8Fsi7l?lo3zr{pO3abn+&xz_27`CX){r4z=@~851ukS+ClX;lHGV69!W#S#O z?pP@gA~{J_o|aLQyGx(rhyM0J@tC*k*1Ip^?uCz#z=vg_?l8~Ltpf1YbDg&$0Sc*j zZp4HToBeH6W&)QGK}}LU7LQLnd~ndBMdy5=er0Y49kAle00n>+htL?)8Pt}?0%XCf zs$p};3~4zO<9XADdF@DWoZAz~J8yETD=%u=tTyohn|9vYDIimNPZoamDD>yv1Pe1m z8&QESk|o-Q0!%U606!2K2l&IqkZ3?^2t2YVWk-H4tP{i1+0#I@BT1`9pC@=>aFl)W zsrIlmE{|C4GC}Qgm~-IXTGp`PQc?J}TJ7RbQo#ML1BE9&)H#z_$R~%cUC@i*qW1-z zDS?k^e{y*m0zIC~t@>hMGbQQ4eGuO{m$HuoS0XqHMZez_L~xMLcXg})B;>Zn^X?mY zuWvB6l3I49Uff=$jP^#d^{%ER&nYY+>p!y$W+534$~$>>5FBQMp!=hP4GK&sUj_qf zATJ!0jdG0xOSGLzGAi+{5B0G$M0yBJt_)jdeJpgOmg~Ow?Shi)`Elt!ixv~2nV=ET zMElKr?EA$dz#u^i3_B5B-C%~PY46F`S(O(MfzjfbL&8H9Q~vT{4+~M7!3pq0`CZyydgc#2&vK7Tr~1W4^0Fn` ze}8^uF#GThmgeIP2|CFW1vGbg{h?wMQy2EmbO99I+y6L z+LSX2Od?3qO)H%@uNa>?;7!u^t=rIrFX$_;FZ+g>!1Puxl%&+YDU$+@0HM!<4>(uM z4k=<6ROY3D4Qxi{#iQ^JQDK##gE;$bmqW#^*7gewfaK_Lgt1`{k$9) zHoQV?OFNU~si9-Khd@3ID%Aa?GnhLcM9h~)k=hypCVbNEv8}+UHq>IQF7W#mfE}v0 zH&tFExS2FcIS-e(ybFA>pJ)a@0h{u~fT1q)dv_GZqgJQbYRfQVyHyhAZ)zO0N22W6 z=~LM!b+2|rUMJZ@z;**dcpbWAppU>iH1pSHB*1kH9nuJI;sd_3c!8I>ssd(iouWNc zNN@dW1(dcqw)JDoZB@13C6ys9TIkhx3RBBsqwj82sQ+l@)yVzMkF6Qf)7SxFqPuox z0TWm|;8f~F?=q+TirhdUb+)~w6=4tSHpdQe{Y`zCMIzCRI034}6R%uS_@R@q3dVXA zDPl0pJ2qDy!k)0}>=CYY%KeZTk|7_PVsf0Kya+d#fuHpf09-~rJ}|y|#%B)9O>@tf zew291Bte@Wp9e}$SvX!@rMC9L?uA`eeqZr$X3XP`Bbw3^j#5*1U6^?7%S=x~IGLGkyI&FlVG6_#aR@+cY7%7vX{Jf4 zj~Fm!#ym?$XxPgA!4Q=fESRi|Xkx1z^%8~{%SIDp13}SN4Wgw3?>BC;q(RJ#I(VVF z_sD*7pcgKzFPQgSN-OK8M2hs#kHvNm(KPOzcHa)*-na7ox; zthn!1n5?70T`L*p#!)lLiCnXuHCwlvv(No4dW90Xd~@gH*XzM+FGn zyPHwPvxKar??{oHJbYaHrF8OjSbmc|uw?;aHFzEp?)4(q`Htt}qkTr4I)N(aw^D^( z(=g>SnIcg`;WvdAOPO6tgBdZ9dIta|06XH??yGtCefEOGG}Cs~*Jt8`XMs2@9`2~D z;;&i4>D#LJ}U>>A=5Fq`}m zx#C?0$?896jiuckVe#02hVk(ZH1I0Jel4XZ{?jvcTS{H*m!HeWPztmw8%}}4c)M?+ zX0sSN`(=sff1nqDtRqZ#Y`7F0Ed!-)^$_419|A>#Wy}`-JB0ih#kq)H8o9D4$mS$f z)ZzCri@?Lv8#$DQ*nXCPNJgq6VQjdx`=}e5xNQ$?lLhjG+=1T#7KqrGO9;bixXO5) z%H2j<4uuv)%A>d$!BBeRK8a`;@J2wwKxWBaEW;7Te)qo2{VCwHn!^A%af~2SBrqUkKoBv%5*Q!gn_R9wmEv#` z{(+IMfOR7aKjhmZJ;^V}J#xO~kX_)nmj!iVcc?H2Vm#yFU$Z>|OB_HGku1Jv$lq7O zn0*q`6fdvWAJ*6~>2+|7F#F~R7PxmyLTyPnScTN08y$Ve#HyzYF6HjnGgl^@I14`(qmAiw!AuosHLjeo6vtr zIEH}>o`4cz4m5j@;05v-TD&>tlu~~~$k1Kj0v&*#eY8)|nOf@4`<7r`AP-s=Qj~Np zO7T>G6jv9BGHR?PBqP|COpHw!h)G)sz!2;An-W`>xSqdDh|Ie{Noc?VUi@OyD<1N+ zuz9Q0gsU)i!D;Rjp)t6O(Uuy-CtDQUN5rr$`y&W9)RTF6RM=7~cMPiS#P-WWe8|0G zToO`r2;w`Bvvrk!fzbf}iw|<}51~GNfVO>~)ENeS3RWapXwOioa8F`2aHB1T#Daq0 z(LQ0U&P+4*+u(g=b(fn{r~P9BPJg9n3vg%bcx`ed&(w{{X<_r>l2AnYEKfdojdQTv z0ggZ4*EuxOWIQ+yRRSsMuef6z!Kno{s-Pzviy}e5($pJBQvC=AL?#8scwO@PRzPMB zwFwQNHxPYg3~tvMZ`VdNQF(2A4!HB}0L8*#7_ovU0s{)aFF<(#Sno-yE;?gAghT@v zJBEk7b)=!T2t&*cy_O=OKL^l7@OYP$Z)_;f57M<{hJ2ro%5NJJ%R^Vez1phk%|_&ku{~0fvR?FDMq1 zeBe0Wg%Hc7S+o$1i5!^e740{JK&Mjs*U=EW0>mONqI&0-=iy^ps3!Ns%EZGDaEXV# zz}FbCvOP)6eW80EmtfbH5``}2ZWVVk(s*{D;OBPil$v}4LXgS+CfFgoC#}i?Qi6jg z)&KWiN^@;`g_Z7lk!`br^XXZT`X)RM3BPxPQg?Y))-3Qw-k@eNRJRiW>n^;V>V{pvy|7NvkpZM6F z!k??&5p$;>GkP-kdWKiBK3Z{Ech81vy!rZ&>34uP0-W%7Ar|}Z7z2x;6!N8s+HjxD zy2$`0y;EB$0yORQ?!J*5CWm`(%cm!)@>hcuH%7xa7kVgK9*s{@eXcehmT62>-Wb2m zDz_r#0vE_1t?r?#xVz%tks)U+E{c;3PeBN%SPPh+ksIz61CoMiVHI0= zIG@d5;~G0!NrfS#v(zmU(o7qU{_UWoe~-+%dc`O=d&NF}KHpRo-Wl0atf}w1d|^=X zf9g|B=urvs@RRR+x$^qp1y1I905%A!7#24RKL!ec|Ej%E@JKv)TS%9%t>1LQbEX5p z-}z$kv=|4!Z7y_Dy`0(yX<9&hosIA`)*wW3e%onFb+txDaw#(l`fd#7ht4w z0E?d;I<9|zdCqE&iZv)Qz|uQ41Nexb-v6ZFqZk>0nNf1x#kJYNu4Kym8kVDSpm@(l z8jwiY0t#X>B6B(y%w0L>&5Vd?i6jU+K$JN(3U)jwW%*qJSLnzYJvOczbu~!IRc@RK zMR_Pha*Zg!O})_qY7XLdS?4Tp{YMuApy}RUpy?3+nk-bfYio@Mz_gehL4eIeQ{d|c z#z1=ieeMK7$WX~{`!gqQd3>S~BW7*gyxvQ7Yvtn!kt>2g7W|oZ)-3e~VRmUp98j1X zfgqNdVzQNX5-RDY+!dnDm&HJng~qrYEq@pX{7?1}pbqQPJyPrAT%C4bIcM1N=KexV z;9r_i-p{z2%12>7QlH10J*W{gWy2c>tTF;QY_1cWh};wU)dN=gBebmjyciY)?341hHc zy+;~Rvxwu~G#YpQelB+bY{tcId|7kot0(itFz>7M1@8xY|mCn{ZEHka1s5YImTuGU^%QWL0v`12-|trG47%_i3xJ| zz>NWFygT5T?gU8_G-a#@+5d_zBJ;H@H~0athCq3m8_iK4K+bITO6{jKNo`VGFhuq; znkXPo6OdjwpW|!`j;x9uSO%I2d>}fs%^=;SV!wp+ zsew-16_J?nk0_%hv>($0q)mR%sAz9b?npE83|Rq=x-OdO6HG4U&2t-0~nf zO*M2r1h|->K4rO66#G}t00DZ2xTcz{rF#~0pP33nO*OI!7ubL{U|ka9nNGX7ZZA1T z5$|Q>&v}=4!^BNoMKS_PzoTBXdVwpJ_xqbbhW~fv@@R)F5JxRG*uzKp#_F60jn|73 z5aEL+MBxB4Kw&%aSBgArOw^k=PR+bEH4+iU5q50ceC!TGozNW@XZ3b$o3@M&_;E0>shYd~J1E7z zO@4C3ep~dpM1K@7jO9iq$VyED=*e?AL$m?Uuyw10ykTf@?nOT2n(MZf(m%xMqu^># zX>PU0BN>Z6oApVcouO6j9o%hm(tqKyzX4~5H_0D<0_#K8KBMnJSa}zC=Gtc*IC|Ma zDqJ55CrCRmlAwDf^7udgjRZb9AxOAPqHQCM8(EWa4aWYkk2@;_fb^M$O*c>|H_~Ru zw`$11{sFnOyfzfhZFpZrFrMe8?^*|R$us3NPsMX&ka5G-O?a5e$fdf`&Rtmt>JeJd zqbO}>Qu0HY`DKI#xSKaY=f!c)q2wlOqlvIZz!EVzY=j{m`wfzEvcS&w{gNdI1E&&@ z<zftE!@jV-shFP02AN{7{*b&xu0P32%~f53+Rd+Tz#V%35!AxBmjap1DQ-Rqz6chQC}Rx#n@8Q1g36l z;1=DLT9;cu$Qqt7j+FZ4lkRoqz+)-pDWbthr>5~+I~+0p^Qgl8&dS#jX`A-b#E7@$ z1@%%8H**~+iR44P1v}**L+r0_t#P(&TEpFnm&4NMGBkRSDn8!cpdGIEknul2v7bEz z!I!?$EP%$9Xte~66u)d6x#4=IgKPYpVxcKbEtMjluNu%2*m;K8@oftq{qg`|QN7`l zwIRItNpyd;@1!t_k1 zwrv+0;2=Ff?xk^`#Z@e+-{NWniDtn+jU?q>7Y8P>Ivv{b4Zl>nOu;ddahN9x7-a8r zuACiGYM504cUis&oGDS!!8MRaU|_QZ(2rt?eu1Evf)gMBp@LR8F{VW_@+6CX|4ggS z|4dOg*VIb71PE0ByJUm7|KE}=9}MDw!pa&oYXjW@Uap7D7nfJhI`PYaL-6*V9ebE) z`c4GUMEYOG4mc|L_+kRBs=Z@L+>YvuyUfir+-{YUj9{LpAXj+DQ-DpRpMu=uwu365 z9XtW9S8PAFWqwV`HL2I7=Z5@2qTV=^tpF;`#9oUQcVW0El>G%rFA*?)W_*Bv7r0*@ z3JKRt4jU5`JQPJ2x~*6ZRzSm-IwGj#+QDlX9jxS90}6=U@81E$_sEYV)jd6oypro= zTq0B_1|@M`EYTkHt=th61=pzzwEJRO5dyX8X0$2{JOnNPhHR!R3sbr73WYAv&eG_}c$d zah1{u=fC@49`G35Rz6|s(c|y{;yNPous}2jAgg%l$E;9Qb1e7A;_C(8xK+yf56GCS z+%0p6#|jB29oW&)Pr8czemBER$VbuTGZF~cY9SO*pihmS0Rg2+s#wNH;P~J*Uowph zbuR=d%=pA-!R|AHWw|dr6j&Aumn>gGsA6Aq&g0;M>}SB53kr7a`)`3zo!ehc#61MQ zh)JqF*ZBY5K6Y^wWJ^?9;*Aw_NMsO2FxcvNM_4^zbJEU>k-3 zib(Gbd62c+z5~Qf={If~-fncr5kyUZo?u+p0ZlZKVW&iK5<%TBjW7cd>e6utnSYK` z1(1G?v?Uh}CK()6-0tvmla39fGo=3cO#a8>XQ}OJ`2{t1`c98r4s71*Il3XL&kZbt zcoJ43kZwX*wg1M3&$O=>-6^g@2vHedUJeS~M3yQAzp734ln<;oa({B5V zs4h8g43#5gyz1Fe?H~|LwW*y)hF&Bn!NmRPRwL@N53ld0d-w5GscsIscoJVd3a}LG z0~slxDjefhh0fe0r%Dml+yUS__eK$TYf@a`rvNF_-w8{m-hiVq4Uki z9G>@WJHC(qqykTO1m)S}AAQLG3HmxCK(s?;{8tT*Nlv~w#g%-ALDdyl)P7n%3fShq z{L0Or*XZumL!yDqXe*%vtji@ttO;?u;~H^W=k$1(T&hnj2s~_6po)R*_6mp;&#J8j zR!l&jQ~*l1ng*oK`CC1VQ2{RvL6kA!Id~_cF!9nrBV|N{{Q*bm(mv*&2CD%vKSB1O zG}9=PG*ZQL836N1{#U>@fO`Gl`Ge`n@ieQtHMw*fr|ZoU*Dha~HOar{ayS$-mO3X| zIUvA&Bi|f>c#$hiUx9(?X?o__h+oW_zku#q;VGXzvb7Id_)|3>LPIO&DT(j28v;^L zc@W~U+?Ra~WorGEXw#c;hhfa?$(MI7w&xYUYn#A%7_i$pWxdaKyKW4*eXgwzV0lyr z=d?vKKYNA_aooKdh(Zv}4&iHO^lGK;C@ys~ygG(_hor5dzYlf(D^D5X%lS_hTa*8} z2%1D=P(dB;;1;w0I=~xTlei6r6jwk-7vvgl+e4p5bD>bM?yjTZ1Cf0009}6bCD@A= z3^Wl{$K<+m`Bzu)*#%2k!y_WY3IMYaqkZ^Z1kI)~GQ=8iz^TiJTb;%TH-Mi>NEA!d z%K8XSUNG^h+Q&wiDUELtmwYvV-_7-+XwFI$u)4uA^`4u8BD{wIZhXvNAWRNWYXMxt z4M>=GZw!6=)r=Smbh^g?w)`OpAvU&E-|ML;ddl=unwHq-VAReyJ5RYDJ2RZQgJ1fK zOD|n__aUoa&zQ_)yWqvINlbmI{s+x@9Gg$(?drJ{9-1n>%1T&D*3-Fa2JcD6cZ}Y6 znQL0(d-`kVai|4p8G#Gj(i~X8cBmN?)0TJS1Uit3r$geKn`BtYqT!nhOr>U!w z^XBj!yXnt*dRJf@(}HVMy$!P4)M9kT2b9x#)D0hPL)`I~HTAGglEr^j>Q%zq(GOGj zzHyP17sE&~)mAW$5UVun1_*wxYMi8+^Fx63Rb@Ft9|CNBlyLxCIa{UF;6cGL!~RDT zsM%3rY0zNL1^0?GMlT+vAxjeej({vgAyxB`_POSk1FF&J_nQA5E@v^??%UG){vr)~ zv^qeW);|NLK;Gc|3xTRq0#{5vS2;-7jNIaJM#4v510Qv362STKzAr#^+YxKpxH**R z^?}X;AO8;BP1K(31nop)la7%V3h{gI@CB5F!w~9LmUjF!cyB$vzt|mc zpE5L+0{w1dd8$FmV+G~7k+QD4DQZmeHN>G@MrBkV->l%egNP29P&Jg`Gp$pCXs8&7-E4!(_Va z%3vlx;qIfC_n9+-+zOJ)7W?r2=a&-BE-gwp{rDJo+{$S{5(I={Su^j^!=IeRmP7xj zq1UQVzi>Z;p7l&uGrv4}n0oe+-u$si7Cmh5%e8-0YZp2smYD6C-31K#?+c5w%S2E@ zgN~A(xLU_Qu%fPG%bTcu#y`o0N;#Ot@TT~*C@uP3Bv`%?_6IPoSe{i3SVda?3v&KO z=|vJ3yd*g(T1cJ1E*La~f-A}TczNO~whaVL#ZXuV6I`$5QU~rQpG|?}d7G)13Z)v- z0)d-`!*3r22{3?mN8uF?Is;J60P@qvTeeEirv(ym^H_-wUU+(0|G0;QOGDKy!`l8A zcDOgJ2hbse^*~5RT{Yv|h)8PhM-{^Fm?4S*N8qJ`Z8il#T9GvNOMh;XL>bA@EI4r9 z&gH0-KmAe5O}A1=5oiz5H?Tc3cX8U2F%%aE<%av9f(nEB2viN+oiJc6@|*`Y0rqPp z_xixFgP+LZn(_e)tz1gBAY1MIhcIGHMq+@r$#B~RK~ylJFpqKx&0UgUbp>cluM9?U z_Cn{CuQkHexzUi#N9&^jS^td^0yV-)r}fW+yx5+fSgf$vL0fbG3@77<2{{2dvj{|`nRsR#MBI*k2o z|5~`KDTlQZ2AL*^jJ`LJiOC7;sxfd)Yvapt@o8BIUK+d<>dt9&P@Tj_-yGXoc`nnd ztsHvMdL`Th)kVw2_j>nx?|zd=El0Pb=|0J z?r+c4d|HDPb}*12A|Y&>e9Iz^Ik18}$q7<5ry(H|He^5EQMmFS!j&2+8w#ahu9tQV zDP=(RBHf}O9H>R(g95UHL_!HCUB4cQq0Al2y7NH)9!gt-?FT%?z!tO)XUK0%##TwsTEZTXY9RYO=J4R`1W}oZd;iMrUm9+F)K+v;ypc ziUa3kwY;{e`?9L4?IeP{$ag=nP0uIAR!>!BB4R;mP!#3_A~w|hftSf)UTWsn;*-HB z(&|C<4GX3&BD~Y2%A{xW1I7kva#)7Q#@V)weJ;LBoZLseGajxh#0=fcHgw&OeHQK@S(^;^dssDaPK+r;z#xF0u_QcZIVSuxeB znQ`CW$a|uQ(y&<~ruY6FrOQ%IXeglwpC2>x@6o8}qN~l6L$F~zqlddZLkm44JJWk? z=R{Ll!e)wWRcP^z!=YCy4@Xv9&2i4kgYW@$eXjB1-6!!>x}V|?2ZS3ZY=0@Le!n@lfCJE$L)Q(cPjoO@NFTH(x8Fx$yttZw zI2dRNp*N!C$E87+SDCmdle*p)tKRb09$6tT9MhPjYAlnAj#|HB*Cy#=c*jicfq_LZzz*0G*}8Vy)_mVYg{D^#H=)4&f=5WftJ@$2c! zi0uq0^COoiu>D;uFL#$SiI)nLQZog@3l}j0eX__1gP)QK65Z9|HCIJ{Gzvj+N>03dk3rErq8Kz0hiTX1qHr|YDa%y<0`dvlF@HbXUeyN!skhwHY zdgN#KdZcbp*)FDXi9>^}M$SRlxF>q$ zKS4eb-2q+F#R-t~whcP%?z9u$=cj}9-U+)?^2PJ#aERjGSKd+;pEaX4k6=1(^Oc=z z{Y9R7`L5*C^2X=>*6HQC`S$vy!TLWoJp-!vpAmrL zqK;?{vsDm-0OVLKF=pnQ9Q7qfkiARPIdBj;C<&5?YHIxvCO@L8ag4}iE54^-pFT~G zgn$spu)o}|Nk9VtR5@9EwH;v3z3XRL|HoHSg&yRN%}xPm_5zqyJ(Gjb7MJ=TRM~;} zYEiEbs$#!R=d?J)Hu{x-iR?XpMU&5!0N?~y1N;dS?mRotVowPU7>Yv{Rm@IfU4RW{ zayo(#0je)MuJeO50%lD7u+?n^N-ypxH9NfnyfxCM1Z_~7md+zMu0DMdqVsR(e2ozyhWZ}t9Nk!U^bby1$PI;o z1ol4FKj~$s~zgrp~`RES2C0P)# zUeDoiFVneg9BnO={fzg+H#GLHed{XJa(XcJXrWe18Sccv>Qi2=$wGFM^J8S~)R8Gp z#9K}ixh^Z%+LtCv)?aay+aLSpVt~vuOuQM>psRE+(@D<^xz)0Ss~cd$(bH8Z_c`lcxn_|IWv%$fEJ&N# zVJ*9Tn+ee!lU*SP=3_mf3j?9MH;@Muz4In!+l2(#_kOZlTJ7v7VsSY2MWPogH{4!Oy2%5 zuuU!(L*hXi;E@RFNrssIr&-Nh;(4^bH>NvFj@QF2F?%gjChV0kdl`}LQo z2mmY64Q&7av5s4n0&w47&8bhS!>mm+ge`Lc^eQ0ssWuhiB+ug&D^I=iBZ{P}(my-8 z)fej`%KX#am$;AVe!LdR`@l!(1jWLl2ut4&&hXgGMHx>q12s}(2S7Rv&p&P?B3#Uk@t;? z4x3g3z@+Q39JSxGAcJf_?Ei*8{6c(2*xVH~t_#D%@!N&9tl}RiekCmDI?ofb^tir; zebV%>s!8eMVa+EIjGzlAAm_4t)+R0cYzFo_2t19!HP4z%7qOpwn`N?oo#H9`co2IK zUZb!prG;LyXKI&9%nnT~C*!xkRBf_e_6JO@?1H#w`9bo+{@9nRUOefefoFyKp`fo0 zO6L!|aFI!G(X?B`X|%oFO{K>=T!n3{DWCKo+Q|9Lx$79gDe9`H*P2}=x;5z@R%n1*JevJ; z1kF22h&TN(MYGmTNV*t(TUzu4jOa5j0D1W_&9LZq#Jl_*Rs?{o!0;G5@AT@Xwy!)xzY z%z$!G+^K=_ib(Ra(1q${T-~=!lMc{t9y@}FJ{kfiB}vE4emQ$>^;`~oBth}Qcxk!g z<4|vneL-`5Aj%=(ANK6vc@jvdjDR#+(gso;dgp9Sz^wGL|3X6*f4H_S$NBK)hzq{L z95PZ07{NwR?!2l?2yEy6+>si<<1Q$$xEu(8k5d1VAaXyfUM8Jt_=hYkv~R2mO)pf7 zaI25gAvlax5u{9WNr5SV>Ljgx@IN*$6WPT*X{dYkktqPJ1J-O`4}kHUgbkM!V=T(R zU((t1vYbyJ#&xokvauPJ6>f?%lLR^U|+=2T!@ z^?Y!5fY?HeG;kR*A}aqoJL-cbcCq#`%?kl^_alG=+!>{pe8Ci1v<8f@374k1^M4={ zMwlE19*mIc`P6$|u%{z;c&JEP$*jrIc$Lfx2(8^g;Y7J|DEUVWucC{N{&EF@U#RAC zyaZO9Q&_| zv7qX}Es=;{sTW#pb3jf*hH)&sFU@g!^UU|dRpvdTHn9U2>?Rpm0590NAwVUw29nR4 zuTAzY4W;o;{}90R3Y0B>P&=pI-Aqg7E1wunzF}`%lvg6!T~^|HGgRFugHHv=`ZXYd8`0dvvR4KHzK5tRzKyf*vah=@L7X^} zrMw)bAk?83ws~r}DyU3uI+g{OS@?`F&Wzpg;&IRpvK)Xs8r8AALKdOLUtWKxrvqY&f=KESr^_`z=6O?9 zoV8y2=v=v^D}Ky)9UvZ0Tf#J7|ErOnb8}PS+w9Pn*4DGo+~*n@iB{{FvXHAEjvtnW zQR{zojhS@SnrbJ{9h0M;MNJqz)(?Pe!`opNdUai^WRYm=%q*cWhZNDp&8p6_ejh_o zxwq`J(9s@H7yc%19reCbZV3tXvO8SjJ)Z%lpr1f7lJi4J`4c`@1f}oVhmVe+UjTal zO0z*^%+4`t&ftN!U`%ur`j8U1&hu1+1*-4L|CiX3&a)H7Dm^gfmjY(MmtidDzcb)< z3qD6fTtoimav`c%Xa&v4hS*jc^en zN^ZOqdj||Q*si<*%K?w2nE>q!pm%sfDWRF@m$$oY%)b9N4WQ3Sog6ZkSNvUY>AtbB z*b;&b#cN*uDa{-&oWx=2FI`{$tP-TKxzU!!~F@x~?g zm!hS{bH3M3iP`g(n#4xf%5DnsP9J$;EnV_{DEpvAnLtLi*~lS%*R&fqErTlpx6o@m z1_=yvsrn=dP|5!~a&G#g0H-@DqL;5zV*$>iVwfuBi9a*wTK9H}bw% zL;AelaN1J1+spJ^p z0;Xx?t+&qFuQl6W?N9bDI|wGG@BgM+(gy_jxC}XNibaLpUxr*D0G?}QcREu`cArM^ z{oRBW)yKogCdAR*#zY0?cm|*&@G|`X6`)0qirKy=23MFyCUA$(5rS->m@`Y^uD&#Y zr!$uk0zpneqh7YMitNMu)!T?XD3gb_8==Ad2LfIKL79HB$%tgUDwZkgJ`B6A%x;L{ zuwNl$7`YU~A2!_B3(g50m0O_HQFOs_y33#`6c zz~pI52k3}v7b!5Hc&C!%jK|Qg*E}zvkD+8}Bl`>;wwO@XOa1Zuo>QoP!K*tmZxLo9 z)FXUT-xcigm#rjl=|0)oZp^2*O-J=>rRPj549`5}K|$uyqJ6HNtmk6k1Kn1({ARNtHO!k))tA#ap_lDDo>$%F2A*KKn2>d5)_t&{po zMFOS0PrF(y%Q%_2xe2$0UbJXZ1gMLASSS;~64jL^24(1+>SbsF@CdA1-c{Sg-dGNs zXKnaJEKUycKjCdi_SKZ)V`7qJezIB#kNx<{V}5bId_D(oen<;hP=_3dZO8LoJ$5(7 zO51knv?Rg4)XZ`oyWnrAoV4lp;_(JL^XJ)`R&a?zt-7-4+fpDLp)%i(ZETwNVWV-e z{rF?O$>+u)$|w20%+@H=)TJ{KFaai{2~V21`;h#(;>O0|r$r9Q;?I`$xIu+n!ULfo z25-eO)}d^6*X4nUtb;?qzTEKj)T*sOFj!l50^X#b!41BBSo%)`$|t8tluo;=UYQxG z^3hq&GfK(bn&lsBQ%I)KJN&>(kh#?PCt7MyT}mkq@G`0Fb5fZhan6dzPG*8m0I;edK($3$+{;0PY>MRiD^Ts-OkujAjpA{94S-0K&v zXUXBLWuX3@ZuS`qdVyih{MdXBO$^kt^sGl#jP%*idEF&jANp>)Gki$?=_OX34D=_> zgR<%^UrNqmDAK6eUx-?zfoxpFkDIYf`uEn3JF|gjB6mQ%F@q_mP%=Sep#@ubF_Mk* zL>0660L-~!6SpfM29S7!T5uv@)YEohD06Pv7 z77V;sFk(NBvCkZY64^p?<8^H&#Iihv95CF#gaES7C7?&0z62O{7+)Qg{uw~}anR=+ znPHzRizW%sj?=bS*?nD}$61ebE*#)Cz~m^7i4cgI?X;Cu^>)2(au~wy`wJ8gSn$J4 z(+>eYg8*~7k}F!{XYyXOYYUNAa>WNVNHy3~T36#}K?dIr@J+=i>~q#ee>Aj#P>f#4 ztge^KwH(p0+FxRnWafC>oFc%q@x=yUY}@n$uk4Lr42JhF1)dKbl=KkIUSBGSh=0L9 zXFV3|c69Yx0~7z)h@kPub2(wofXAv;jd2I5FFO-m7Jful+yf1n$x>78oP{*A zPoFdX(={r6T?`rC)cQvzMCe^TX17yQqhI^fEAY-3hin=(Yb0p|9wM^Ce%@N2*}S{N zh?tGPuHm_e7SCm`8*bQkH}b)3)Ea04^xdxCH?+EPc2oUcj?UGdgjrpIt?c&4U;9VT zOR5D*ZVgqtgWN>mhKdxWv6SbA6hpwob3%1lr678>o~dtuMSSkZ1k7RYVp6o!!pBMe~&Yco1RS z&)^$hHv_%SWAhiT)8`U1xD-}hfG7fLEnp8jLibSux7zsWKIt~tFEc(4=1=#RVsQF_ zNxO&s7h7*04|V^x|Ib*H(3SQWDoYY7$-cBw5}|}pAqr#c%UDK{R+P$?C0UY?Y{OV4 zF0|NXof%8Ao3R^=<#)dI`P|?8ems8v^v88w50`k)`*psK^EjTzfT-__pqk%cdD`gy z=yKa53#KuOoR%#KEF*@9WyHV?EF)HgpSKeH4M)I3**?#90@6D>1gQSuQKu2h$`;(D zM>v`R-0*8L2p;Iz=z?e;rrq#7tB56IyYL16y&zD>33zyw=Ds21R!=hnWhHa1lqS&R&ydwuQjW~z(2lF4XVWXt<~WtA^Za^nP4LS;~1 zZ{2>b#LwB}1k4SR&Wu(z=%&zJwi8G#p{c*0hSrLV9rT}&n`FIdilg=DLt(+rCufx~ zn9W-Js2+_zM$s!YPFvFjg>$pi!bajW>zT_{9m`&5oO3cSsr<#slZ_e+2b^AxFLa>Q zDA_z-oD9`n?2i;7?&!9%cS_Vy%jMH|Z-9>F2Q*w8WBnR;ZTQKJ)zOVz^hba74|kRl zKmw55@B{gw zZ$KKPYs16CFhgsR3W8de4ron5+;#J7#J|F^djkK?=@M%@dz-qxRTf%7t;+cAO>>71 zqv$jDsPl)QQqKbkRebp?+T=H1+Rdos@vB6rS40=GPt?luX;ST%FkM`|$Ggbn~)p&D0Xx zyWwYMyVEHFLY3S{9XbM?xcf)_bX@1e;cF)ZC7^f25vV+4#WC8(`)S zrPw?9V_@;)dHh=Cs)k4*G?YUfNcZ=YmpGHo^2n9Yw0k8qJ)*R|wrb3R1oh`{kysUx zQO`MNJ8ne7nv92-(I-5V3T|v_&;$vqXbOwW+T>tYek{DIH$zHBsdt#t7S;_DeZ;k8@0+09e z_G5%f!h|<@Fw?(hN8cltx{4N-#qytew7cv0XmrBpD6A^Z4~?xk-~HEaK&&k+H2E4P z^G#^ffpfjCUqZSs7kp<|n8q1#GEhTG9U&G`AJ$bL!0%bEsl+sngUJ4jJ06}Lt}V4b z0@+Fja{jS8EMyfb7U(GFX`(~a{;Jp;%CuT~cJXBV_GrgRZms8*Ge!>^UUHWuuPeSB zpSOL^Mhy*yWGW-K_iZyTP?K51&-93iQv}r^zD?XXIf`p+PhdfXUvW@qS{fS_bcQPb z9}!(Mm?H_q(>2YtLJT$s#s2bxqW$H0>}28Z)4U|v)^un7OPi~Sq>_>V>0=R`Gwe(=KF zQGKt=zixtO9F^BqICf+QtTJPy!Sjx{1am!j(DQ&~_cx|;%J67*fqL53F2HNtH;i1c zEppIo&fY-kBY-3iu=aFGi#4zdi-KWbv=B8zK!Pvym`Jm)Cknf4FV}u{YEwUga-63M zBHGUlR6UsPrBTz~+($hT;!?&>v38*G&+d4OOVpeYTOD+^Yi5T>Z$I$#aomCo{Z;$O z6w32Um8;+qWT>5JQ&Up-^DaYkmY|wB+4#a0f~DbCAm6P+6tRQnmP>+40h*qE5v=cF z5<+^f07aePi)0Z)n>R@!#S|dA5~72_=vp(`-!mpo1#=&2I6FP_;{dA5!?=8KyZ_?e z3e8ErROf{o68UCV4y~Q95E$+37BsfHA$POXtbJKal@_eJz(OExh8amA-|vD5;!7y}my7jz-{g z&2iuH)NszlWD_;U{-ni%Gm7?eyCO%vYcDsqJkI23XHOd_Kz*Au`x0)6UsIpG*(?i= z;2#4|x6LK>mf2`3#Q(up*P`7`x*SB+PHYbgt@yqFGitO$fc6{u1|HLPC3Wc$p+S1! zX;23%Kr3h7Kb(Ko;cj0ex=%4_NhV-@IL!1%VpP<~>z>JPx%UaIW`*jR!KS#Cm~$#b#$5zKu9ZEDyDv!WiLKtP;t)@TKP-l2SWE&9TT+O{|B zn4g7LNuN#C?2o)wCW3`TXq%R+;};rwm{WXvA8e-5H)bjU^tDVTAcB$ZB%;tzm(;%K zOo(8EcA}4H^N*1i*{QoffQcIc&UciZC*FJv^&enNPh-MQEwtzVpR#ip0_smVhjM!q z0Hh9gVkr+wLD;UolJU({$age?M2@H1{Prc9e_joh?h=G7rEZKEV!?+LGk2QV21o{P z{}G7iccmi5`qz>Pp6|&R#;n31<11W%70LdEkny+%RwqylE>^B`TfYrv9fH?ir7khO zrwVrK$;jpt`IedWXdW*u8`ZLexC;w5Y}>ucr}rVt^^C_k$=2t{uqN$I@QiY|Nzm%q|W4E}?n-oBHe*}|n4>IduH$92SoE&T7- zpbRvrCPQ?nDe!f1MA4%X{B@U0^+AmoeXT1j<+~>G}T6*t=2p z6$q{3`+nU0V>ghxzA_>w(E_lVL6y%ttql8aeO#PD$y~YYq^_$c8Mn0fI^UyTw%ktS zr-T1;^DaR#YN$6dhjmw}AH(HHW0S^158F>f8F9RQU$ipnG(5-~QZuvjiotJT3Tg;0 z$%x(M@?`nSp4V6v8P@HdkYA`Sx;{~HGj9D(Z&8c5F@}7f3t$dbGxpOS3Zm*$7 z@l0Z%pHxs_&_5j1X@d?o)n>1Nqaq}cdZA*iu*a)=7d?Le4XRlRh7jT@-?s*<(E4Jwh0!F}Jx(`6(M}j*1)3Zp&jg7w0;HyFMgQ zcO53%c)TXXo3l-Mmf3M^MI;y$BEcYnx&qQD6qtJR2Iz6csAmwu`E%M(y%27;H1hA$ zvFa~4lFYL`SZ%Rn`Rmm@5Ll#TzS!=ip2k08Jbb^9R&0RQAwkfEcE(B}5VpKj{)GL-8Ttayv<2C2p z!JU49#yG_+j>T1Ysni#n0Q*o{KI9HfUI7Fm*eh|n!~0YNmaO3dddMSvPr&N}5f8V9 zRoczH_g_Jd7JPQ1K!tMvzW?dK0VZyJ#aZLM*SezFk3U|O7UZJATd>YQ!LKi?HF@3n zh(pS%G(RsnLBlbdaFaX_u8<3I6G0-+lAHx@yw`cmOQ~OW47pD;OAdfz`!S;E{j+lQ;Ti=gLF^LomzZt#cTw;b;HM+V2T} zcdp*fng8X2+_`-h)i*h{jOoN%QQcx16-{rh2@1fFU8eYI=QHz*x)NC_qgBJr4*orY z-T|vkdOE&+?z0!tcBxy{#{AX}Kq$-+B-Cgv^lJ`9(F~1|1i6VKa|Q zFT0leu98{s%{AwRSBNpaJ0-0LHR|@1DTyKB9uR1=+)=b58LG^8yq1^W?EtU2BK3IOa@J>6-`5rIfP>U18i11^FT>V#azz~p#VRJWUhc~YLaR}s}svP714IbVM> z+e)Fj*=%mIwd;)vD^d(>WF-Ae`i^`ldS74~#p`5!pCg*SA*P_hvj&j1t>S~I5s*=+ zugk1Dc&AkAU=sQMSnbj&7R;$-aDURdj@QSrbD>O(9=%|^la|uA@vzldV*o{xNAOE+iGm;H`=nzGzFZ$9AhjJeC5{%9{Qz zNzMTlqPzjoXrEBWsVpDi+ zQ+-v@kvmSsTz*fR+VQ;xNG+Jw!lJUR}nxHJK zTv7}d_RKWfqvx3GqddwrRp63F3=UdObNb=iYb|+OCZZNB-=#*HT+G}-=&D%hKh`W5 zuBHzLfK=4j*ucv26V&ShJC!8XxmZQd3@umGg63*@)D2Zj_VV3IWptq~y1l5HLBWi- zf>T1#0}byi&3WHG)8flw-DuiV#aFG%UFM_jScyCOoY|RWKLuK?1*R3sz=GB-n26IX zpsSTFRff(a8K@oo#mU&JwVZYEYX0NK^(D%Pe{cBOjP|VWI!jTYX}qyQ-!@KPmyK%4 z{fPg1h2M{R7y1sy2f8%wP?qbHU$|0Ru0sr8bSxEXE|Tq(AqzvCZdJ17y}6^N zgIE*Ix+D9`oe2Xv@$7`353Vq+28z$I(Os-u;_Zvrrvf~O&+VOF;!s{IJf{@k7w9QA zm?K2o?{rhcd){rygfnod>b+kDzIif$wbg%RNUOxJuY`#*<{T*>Fq56EkWE}l_nl9@ zDt~fj{HcLLZ&lK&wK@cIfDJYLd`kYGEOgx!Jl6SVK%sR5g=_c10=H1R6X%aBM}_~~ za>EMe$3NL7d7giyw>SOwcg`fC6KMlxu$K7N_P~L?zpCar?@`%9 z8Ofi84`aoHW>DYTJ-7PpG>~I;S>uFSXNk(SM)ACq%jZtjHsy-KTvn7qR>!K52mW<9 zQ~NLFwz?VnNo$H5{zwVE7;Elth!KC-4KtHq8GIh|_9NL} z4_t0X`_`<%Ik`G|89qPUknJUDC|w12T8S`&4URA{s%>%?Kr!Ud#DiU7p2vB`X&P}u zy5@VFq#(hn`YyFjEHib>HpajPJ?gw58#y>tjJxYkB>q`XQo}vZxm%I%jb8C=6o?3u;{q?uMeS=M;TY@QnFn9ER!0w3 z+rR!@<-8+F38k?dcaT;Q*|A^2|K{L77ry99@8K=f?wDRWYEr(GpI^{b>@7#HQSWv) z>~1(QRZ8NjEN-&oqT6`l$N6(qBvwbz-y7+rXH~to_}ArXqE0rr`ScdKTEN;h!c%p3 zQIJx1wGgc07X1AmLD~TmWoUwa%l>LWjb$SA!um927yTcD@U;n@7}7W{@$$6Y@7AKJ z>a&_=(o$aKg@*_yE6a60Bz79qv^P0?z3g&;Gmxfjv=oq`)~d| z^igi2W=Uamj&sE(=FZwmhbs09E`CBk%eZzVDG%Yo)JrG%1LB)J%PX`y-sos9b}k$} zzq{&;{)3gWxmMX!$0ZI)NuEAn5B&gQX8^g|dJ)Lu;V6GYtQG5?XW*7R%73GH{J z!dJz+ko7@gz@*I;5CNss`Z2vwN=Wm!AHxZhfNSuSC3uNx)*`XcOb3L7k$y{W`+FbR z#7qQs65OM?GtOhKJt?Q_kj8h5y8O)8>GQ~bWv>+--l^R`ll=J__|W<9>AXXzU(-j8 zwLHAyWeE6Bt=7>BdakRdSiDVl&>z?%tYzA@^jrhj+njEK^yi_rxLx34^VFMCHW{HsX}$wLj?I?YE7$4DhQoS(HwbR=Rl640uTjcm zq~?*UZF_jUNDZ5&%eH)~8gdM8*Gc1EY;!eAd2gu$9j!4lZCfsRLpM)8m)m_C-I5PR7*R68UlJPUdIy5{S40lY~4pq34( zL4-54t*up%P*P%^dE5L)odS;+y%z)7`77Y2d?#aj@}U@YMO3CaSJwF zg15oW>8QWZWW4ce+@Nc8S3xoOj?Ohj&&pLJ>3*;Rb6#qor>Nd6gsdOou1C>=Eznb~ zmZRYcduel-V9;dPMOYGM192s{s&rNi*PXG$3|b|eg)&m4&fIB@EL(0)63}iAp_#lq zJ?XfOtZCN#Z1vt=^@W=vu_qm~OYh7^T-Cx&q-Pgg(Q{#Miz+Y(ZgX9heeI}m#`|-& z1l3`2H&{j5aWrDiSClR&5p}dw-VJY0$*=__S;%wSQ&P z5}3uMGMj$cTK-sd@I3*IX%432BacP0(j^7Osc?h8hfID?7jh%8fZrY&kUdTY98@_0 zG%%PKA<~!(!->!3O8-KDprooJde@e0&Jsx-;`kXO=z&j`vAvFB#3G7?U^I>iANXyI zv~c)UT6sesTSzeeBHJIp9HLLd=-V2;7U&HENve0MYh}FlT ztd=JInv1$`JFgw@FY%q)`Px}sQpT}if_T<^7vqK9rqbD#+8`KUAsxLV5c}H!L~}$Z zI`p&9g!}6d`4|NpHpLWWQLUNl+y>zCJqzD&*{Y!d0vRE(z5QRrC*U4={^T0W2IA8T zAQOfd`$pIDPIYEE0Ywx2GR|F<@FfEhMvkflMHQUKg@@D^A4WNM0PCa)3`DUgYIu%JvI)N83>X`EeE+Q3ofBAFlJZ^1jj|uV zFZ@NnsXJ^l84TI_8&6w_C5Zl%)7|?7OwKva3RtmDFBjP1e+XyUO?|#L7ZW)7y79w0 z>C6YmpL_1|S)Z8^eb;u$;|hCLVp+WAWaIZU?$gDS)u&f|dzl~nC_ZS$72*wp(=j&q zGH*w|#slC}adMy|VZc~7owrZ%1?W*Uc%YtbKZ>BK%2DMOlY7uQNY~(o;ruVtQy39J zDmcNZau29fa)UhLzf`}h&W6b zL4ZTXp+26Q!Bj;$54v(fFEq5ydQ0g5Nv%cjC4|M_-sw>BsFp;Gf}BL|1)LRBr+}(Q z;bEq?j3Lo3G|hS&gB#A({+GDP2@FHSy-1MJ3QEX=Gh#2-5g>-^yhMu2Ku)IjBWo+L z_;yrrb_xwyNY0sQ7R|ENi{u4MY>7S(?(D7aK*o^W;e1H1I2~`Y3I3+pyONMxc}VL> zPJrvUsmhmyU`LZ3)n_K^{vmruv)Gh!lq_{?m)y+0>{%U+tn&OPr>gt?_{Fdhdmz>O{NvN<)ZhyKo2Kg0DgK=_6-U{z*h|c@5936mbS3VjBNR(v&W2MI z&fI(x(j;owGjQQ_&cYlgL~~rxDoB_fyqtf_tkv0Yz;W1-|}xOR$Aa&wm?nRAKNQ?Zw&v|51{v`%;X0 zj%OR=ngG+jgvRKHRC~C_QHA(m5|ZU)F&{P^l|&{SK%H#m@fz(Mp4<%6#G$(-t#Oz*U|Nbch z>^P1&$i~_i-Pkrdl8VVD6egm8)SM*jeYWlLBWeRWYd^pBQPIv;K zO?@j=!>xoK;cL}Q35XINy7d2SCtAA=9*Dfdg&rLw8zM9y1l;N2#e(4c+gAd)hbng_^N#r1-P1ZY%a`{A* z9UEW=0U`lMPA?$J${bR)5SpSYCqV1~Z=+U+KfgJeuHqGPQV#26R>9$%E}`W%zi8Kh&**K#+SW=!HWh%dn5*(&1 zYPJ}M{h&3RMthSIV%VO+vz!oh+6kWJiCtQrO@(M`yttMf;LUW9x1F%GmNn3wTu)_u zyPQWV_y+~8F}paB5zyh+*ai3zkwUinzGZ)iFCe&N(VRBGqs|>dH}j32+JzyG4H@(u zn6Th$Zj6C1PrGK(j~zroR;nc`t-FAKr>IYKk^U*@8ixVy3^WyJmj-Xh86W1GeoX7>~K+DIgn*TWD4N#HNLu4A>{xBILR~z^{uxg}V=kd~{VcC%m z1ZV+=Bs@UNxQKDVcnzR1bCT)4wVa25ol`808aoQzz;_TT8c$LeB*X|rNQl7@1^j-^ z)5mEu2OP}r=`IwuPk@>Em`4OmPWkcnvf3Osv4#_AC&{pUHs<(-IHR7yhwj7dDO6iF z^X+yV5IZ^Dm@0(-IX*IwE z#w))ri?`1X{*t%UTReu#MB;Oyq#uJvCeAQmC=6~N@RVE~^0_kT@ZQw@5#l7^0z z{@KvhOa_;Sg8-Oy5%_Fi=~WIyga&Ma8_cW22)phZ`(!mZgtGuT&EV}Mo$SXZu@+AN zW&?hzRyxE`@7q$r$S=bg9&<2wmi`ayMGNqIqNV8w0kB3F|2h4OFufx?o5v$3tV9vp zaSC%h9l)~hU5j{cS1&kr*x=vk<7<)Y^nV8#WUPXp@qY)8o?D>P7+h-<+5ZBmWZl}8 z)vqk~KZDFM!k57#`;G%S=9o1DDp-ZK6N(U&AkY`32@Zg}FhhD+7kGd<@}D85j7^7s zmbz=(C>$Cks2W=LLfD}K3_};D^6LU#>=e~ENEItl>K5~7S)HVErzMAyB5|-k1I|n!7R{7V2Hyv{4S1tXkPL87gBSMv z#Lm6~xK-MJvWBAyemh%l(6X#KaTC6WFWU9`0X#ljzks5krp?hQTp0i3?O+hRxqz)z zHIxjnzj0WgIK#Vri&PTwL*D`xvjp?MPml7(FWUs39R@F132-lZ64jWAfS2lZykB;N z48M8$Bum9<&zf|SOqY&BUb8*JV2X!^+`56Aq-T4TPXx18dlRKsDe&U%SEqJxEZ_piwD)zPX$7HhU4pH;=4_+| z#vNj4=`V1T3IJI55p70VCjR5TlSxBiD za}(gf<;~$51v*7pRjC694xS=$GDKYUQUAgb9EN%{KzsO|QygeirYJiUob3|+Ss2sS$Edb-01-m^GCn_sp3Az=^hB=cQ zN$tfl`91(FpX2nN@NM{kMO!;p(N#uoI6Pxdh}(I*l;3!hfq zLrSeXKIYNu`sOt@ybwH)&icAB@s=fE&QR-Qs2?q0Ha1=6I-W%PP$pyh114c!V84~J z?tHH@+);S2E1QRD3YSE41ic5Fa0z9YRD576UigDh&VUY$oU|(xG*{u7KtV_;Oa27z zjW>MDeKBHMaE(2J(DnAQ{mVbwAV|(bh6sT3Ps1|+=F*t$_|L5G3r8DIp#wslBx9bY zb;>9{cF)|P=id4B)eC@f zbpAS0ZD(G^yA8+i?)cC)L*3Rge1&^uVa)!p`iFKWVcuCtFAdam`+1FT0WfOT{~1xB z`T_9Oi>V*>UB`B47|R}daocDj7b8uEw+_SXZslqtRBYsRJ4joDC=FU^YMl|F-}Xt* zzd2qO7!a` z2$LhcM?jpG1h?%gTq7+sjSWZoTQU*IVSvcAzq|i@+Lth4 zR^;(aSgXq;q%LTK^*LH+n}Pb~&wc4+b^%{J@5Lho#!-DM1o(Vr{Kl*M4p|oenR$kI zZ+2z*_q}~?cr*JmHJb#h=$+3@@_!ZHxL ztojkMGXgi?VEPLDA2EuEh*8`_({TFgT$9^`bZQK6E;@D4Qj5mp~W@ zvad)%beM?o_V-G7pwU9LpT7zFM}oQswQVWlPBkDW)tVG@Iwo+|aLeF+pEFW~8k!XOa-*D#FCcgzd@`4+In`xlhz zTvS9G@4fIbo(zu;Ab~`pav$8IwQp?e^l$M$cI)7~S)-Re}s~ zPO;NKSku?+=SLIqPKXnWo#s{+stRIy#)Vr5(jZ_niZY-5520WK)ExZ=_+%EjVbf#A%sgJazLB_DVYBhAE9}|a5qy&L4w}`z&ztESc zziFbsVHrW~GIBz>0**%4+d74WuO zZsphwNab8MM56d*YdGO)At(D;t-;Lzjyg(4ovG}14-#T)x?PBV5pSl(1Y`p+dNyip zT9V`G#gFfguVA0IFOT*Zb0zY*EHaokEzCcn(oM=flsN z;*I!zeajx`+ONex3RZx#=yo_e{YRwUr#l}Hvu*DvPU_a0b>}dc@YTpDAqK@>?oDma zTMys+gR+PbeUAB@6aUa;8gF!^=Tgz-0z=yi2dmk=^v_+RnI6Wbm`j?Ew8xw*@rX^e zY!?d9z*A|G_RqsOeSi_lh?WE&E=b(VgYbmC#u0XECJWP4 zYwr4xVtKBJEQ}GiPiHiV-jFIrhRO|DsSnUsuuTgd+bmQB%mjh9XFQP7?W$YAf|WAv z=oV}DS9}uEqn@GE2Os2<0F{ArgX^;e)Q`M59^O;*1Oq0caJ;~!bCs(+VpIyqF5m?~ z#Cb@;rBDO;JF#f57eFGtNKB_9pxgDPU!xdY;!YHm&t1PDbxRV&vAn>(k0$%$x*;<4 zM+dT12+slJ6HQ}tW9`?q_w4IuW`70#y3(CLb^v|dS}4r_R{>*h%q%BcEfHW>ts44xKLt*fD#QpZ`l+roQw+f;L|*j_j@QGU3G>+E^H zZ%49chFT1L)x`TjKaK??(+wVMzr6C&YDhTFQ3m)YW^jmp+f9c z$@V93|E}h30=m2jObS@q(q9B8ISHdErR#Kkt!loujvVv^`PR{WB`KRzI z9YY2@$?X)wJD7Lzbq_F(z^@uR&Q5K`O68e$e@79aB9e^suC>A(p{<3-BN3GMub=tY zAAU(ciIcMi=I&0|o7|OT?@Txiv4j$Yd(D?bgWk5!(Cu_dH^$|}8cT;L3E>tADL zZyUIEyXQ|1az#`<6&k(Xr1Gc(>b=rx-kFau63;i$p(wKoT2MVo+dn<;vMPE&g|aW+ zCk82>Lin?kPYLw&K3!vkGMglw121&&U)}u3i>WZ`(fGnq^NRipQ|-})D(g{(Na&ST z!gFJv&rc3t+-oC(9*xgBpy3JY%TG#rSvmFTs?6}@$pFLQ?i_pez#DcA=pEJ76^b! zxQ4r+l}L1^)DC!7EeQF^|d3A|mDU5X`FzYSKPLJ_e+)A= z@1xDU`!IDnsTc!(gmK|rN%`iiCKVG-EogR;MqxYT%?WjI)7_rH?K8}a zs47d+dKvHn5r1UltlK_Bld!s3hqu7+LZ5|(4FuK4_PBa#&@V&kf81$ z?%Kw9jC?ytblsyU8{Y2+h5MlN`nZv=(}KcYGVLmICJkJ@p|5~rZ)TFu4gw1ZnWL#1InA1DKP#GozqXF-41b?PA~|2G6y7RyVU}-K z#von%*TTxBCw1yy2hyr9Y=7mIhP!dirsh@&tG0ipT95vu)jcy`>TpmSfqrUye;s$* zDN4_E8PSTAg?i6lbd`8zqRByjMoG}<<#+?acMt+tY%56b*ddrP^Bas25yyYyk^_rG zxEaEn{&izce~Nr`fn0BK%4L6ZLfGx3l3}`ugBD+-!H&>hx7_xJr6}E_aNfteHUEVU zddV996`D?NBAcnRQVB>0hXcnqfUX00^A_L^0pxN~U*{u>|55y*Y6g~B+A`i>UMEJK zJcA??>^C|Hydm!3)sm;#MHi#ivl}I{q+00Emjo|c6hnBlAH1e?4C5;__MM1#KrxMd ziSQI?H-D%Qxr=7ns8eM|FmG_{>t8^m;hmyD5fV~Fc4yP$*}@sFds3O{-3JKHvsy;a zXc}EwS%dS&jVz8Vrz4NQX>^KEP|XW!?FG|*ydvzi)qdA2%Ywq&>N*Ik=4IBND#6;z z%kJ`5Un^emnCs-S*M0s*Jl#7XM8&hm@a}`IN%yC6j!_C+lR2l8(B*k)jb+XSml%O7f02}D^du=C(hi~Ay^M*n0akI`PARH^du0j2PPguL zB)lI3!u;nBEKzH|mEUmn&#JM1QY9OMxVGu)j6;SRZEW0z_iDoJ{sbSE*mf=XWxs)2 z2@5Wc-_Kn4_ZFcgPKG;1oiyZ3%)8Ib>T?k*($jQhPhhVeJ{Ra>8u>#dpyKdi!7a_X zvr(X0KkFK&dGHw5cNqLsA?3Wp3Jo^0F*t`J45D6@Oum@82IB);+1$$bT;Td(ul>yD znBykG^!^6JUDNYyj)_=7nu;6c#=&6bhi?EWHE6dXDLD_^N}IW9p;Ku!N zbnMESzkOo5u8kFUU#?2ca|AVBYN4;U`8~9^&LAp;1%lE#xmDF$Rh47Jv7>80*%=m7 z-d?<0O=;QC8nn}JG`mQDgTub71v7Dq;^N;eBgb`#-xI-Ujr{ejzGqwXR4+y)B6uz& z5Xl3+aH!{l+M;q48BxkXL0;SR7}9L|n~Uis>9*S#>99g>zAVuetlIq@T-Egx=2^ik zPr3eb`MZ_sA3{lB36}U=)+=|}8(Csb4uADzr#4rpXNThN2jlkw@*7@53jG-Wn;#c& z`fuTd1%7}tFX6|BYy1_gip1phYk|rn^zQl3>eU_jK5gRN75$shM?0c^U721O&-a)Y z@BaMz0NpY$rd-`vT%RtW=Pa$Z!q`~9zMWo?hr!1?TPw(!iUYE(s(haaE!R=fJ4pKShT z`jrDQeF}b-LXucvE0el4LJz9gD)Hs&$Hn2C-!}4BF++*rukF0mt)$zXNtLyi(F=JI z_DHTs*deFsrxhdpaqG{Knf|>?LR|FlU{;q!)M$uCPD^;entZH=Yj%EQhV1bv&68~n z4YfHvt|62AEky!{IvoZJX8b9*$A`nFHA+v${=PPSU7?rzQ$~-wX%b$%mleBX$m92J z1qV5UYL}jQ-6Zi-umgn|Il4{oqvcKf$0(T&)4^l+S!Y<%p{H1Oa+rZS1;7X(*oS#tdA(ono#rEn7%xqLAmHvH9 zt`@>1-_|~jKIi6Z=ijk*T^U(ptOqC#0Lhyt3I4)Ht?P+p>uZsjB`wevCO~bZs(KAI zP+7thg5LH6={%SR$95l;7=G*4a6xqICXP*K8V z$$<9m@wXn==>8u+UcG8D8p<3uwM+asc1`i9yt8^9KS%!M810=pZjTu0BFn#=yhn@} z-}0>7j1re3N%TSiXjiQ0Yo|?KDXQrSC+dZHcRwe2KVgleR@k%%9~btSpPwvgWBPT* zADeb!R-4P`NvLV;N)OezYF-J+Ox*w-Qp0;ZWJjI6!qKPWvlX2h!YR_?m4RiZ&ULunw|<)RV~Jk$eRJw^N|SfZ>StCPS2}v8jud$}X09fVD=hbvOS}*k z^SoKOZn-wqok;bumUUlW$eX9VF?Srtlux^qXg|l#F5i+@I-9&tv!a@0bz$c1+I`Ul zv(q-kiTi&yhiT4uuDk6SnAU9NtC?Xxrl?U{Px>PsKqox%eXuUy;5*%jU0aHz6_G4X zY3^F_80b^NvF)qK*|jz?q~~4ZKOPvq=-a#gD{y_^^Y=OO!IP}l6$W^9yujKg zxxjPG3d)`2xYfQ|>`-JydT2mEQCrB0$11aAq%Uqnjwjj5BxuKR`82*_*5uN^PJvW6 zMmo0!qoKt6BkPaCN{Hc&_V?e{B-a~%u6AhrmUtWR0#AP@h206p?v7UcjM%9a#_4;} zf$MH7ODl~#)~V1$vsP^7J@$Yxu6QT+s6b9*OW=^-dfwMFdeZ@q7@T%$W95_?wl%lk z!+!#;&O}*VGWm@?8n!UmWL5SFfvF{ZzYzu~BC5M$CFA`q901HI2n_ z4q(y)6DyeO+07N1i?M6HdsZ6mXfSJU8}&T!Wc|_B^ui}BC$lovCtG=jD+bfln7b5% z*C%=BOAgHxjI*)Di2G^`-!9g7(sI@17kSgP^r^8#-yGildX8&;NA;v7x*2&F;Iz*^7Iy#508*?Krtj zUf&jy-5Wz#^9-(+j3Yfc0$$crhU_Nh;C-A`p&Rs!nr06xZSBr*6gf-OWPO{Ywbx$q#3#%os}8;G zxKKXnI>XCo$?SCzl#LrI)L1ZOIwQ{o(f$c*q9EtO$EUc8{xs%=i}7yXe|^9Ot_1ZK zTZzm+qpZ(G(YWRI_6H0mnXmUrQm+h`4lQWV#hJ5b65J&(c}MP@)MiZ%*m0}(2l&s) zGy3tG{W-g?wHR|(cGt1H@#tLrl)5-X#8Z!K8#qtYoI+=v4vL7I?R0kQzpUrAiPfRA zb8Wt3m~^g|Iyhvt_$e;1c^3P1QIeKig>~W8FYc`mnAYd)=f9#kUcYB<@1x#oyyd{o zOMVUYvxyAq*3_L@ z&54U2FP}~f(Oge{fK6t~)^zw^_qRCMGrZi(9A0b04SGx#*N1u6tj;`2rw(>hXwyAE zMSbr%Xl35=AaQU-pxo_g;Osi}tylT?hI9Gj!FA_Zn2IQ$T|TmNz3KflN?=%0^z>0)` zIe8Urb`7a^ND}wsjip}34{KDRU2l9*+4>`6!a}sb>7>A>QDaZph}M%7kxg{tFrlqA z855S*UkyvSiEsUy>-M}<;*GH0*{}|eMv3~T$vmfyI9Q8akZ>q=Y`o3%4f>Y2!|;Y- zbZtP zLw_#rc|-3Y?K3HFphZ9S)W0sp-fUTHSaU|&HXCQMTxarwqaSP?>9dwc6tT3PU)tRYud;cw-pV=Qd%20EUpKq96T6C1A4s-U0y*@6OBP8~nzfjrp z3u!zooH`7rHE)lwt4R6WF0bVfXHuYQ-!ZR$m2--FOIK3&#qy8J94Nb-(x1S?B;EC| zyR;fJ+3<9e*Mv-UKJ|gnAnoOXWG;WNzK%Xv!YXF;uS+Tu=iPs zk_&}rl65I+Qq)z2;HjqPMmpUAB-U$egT-W%>|&0_+MAR`>b{;K?jnY3aoj99)DP3c z-QU2rz{ZSUAHLnJ(J>PnmElJ1m^^~Z6ItO~<>X;B#x1JReHwdIZNuUM8;s`gt3$zf zA922gob@}$Xxgf)6pQSniX$<+F-J0Or{oDZ&6R6wWxv-Ck^`O3bd;UCjd{*6T}ym% zj%876#XPW7a_SNOj_=TNVjEu0fAI3`dV(WvDiRwinBc{v%|2d_U(U%|zn#Q&_}Vw) zqyHYKuIJ4Svep`vj)pJH4#+(@-p_ycc?ZuLORGw_S99&z*6~I4y0RG$=KQ!kEo#z# z;Evk5WYLuUy6Sni)jvR@U1J6*9F@16UKbLEpGA1!zJc=Eb;U>PDvM11-ya^ZKb$lDNtg8_;UTYU8PMx z-^WMp0s(<%))K42Eo1r{D*T$9yr%@$Dy}q^P_XOIS(Oz#*RB3Prrte}>HUu%Clw`^ zat=pwE7g%(k;HN-Dn*-Bs-ZqL_i&pa>3zSN-c)DzNznawq54cl>rU`>N!eFA$u8_7+^aJZ4EtwmUq=w{Awahpthbc_O&#eEfHqc(4NaWeQXv{TN6}UHWn$8w* z`p*{F4#W-fHNi^LNJYn#xT*?5NgTg!FrTfQKhKRzyRghWyzgLb~iCfJ6QCj5; zXizA1uCalR)sB5)boD5(-v+*{#?Hxn@^%U(f(+QKYXP{u%Z}+q+w=64<^X1LEZO-YpdJ-qkJ$f{J5abJa%7L% zEtWc79YyF7dwtEE=k(Y!m~SXMF&=Q9DE)ibuYtENnvpYC6JASP-!VoC7sg8Gp_kuH z{r*mE)#{$lYxECpsn8?_po5b_|F{mhYL}wLkE3**RLHu|hXlPgqa>xzZv@b z)9IUj>A%UI+hX{@e$RT6v5MXE1F_1Z7p+?J16qBb_^4o9BV$&4@Nv3)Oe;Nc;H91J0&&K|z}9zC zbrAu3@~x2t+hNI?(Oj~br^v0=%z^xr#q2f?R8Z`*I?o^u$f^-Jq6qn*{9hsc)K7f@%zu@zpAm7CsL6F`RCnA zqSK*~p8&dzu^3)@8g%&1^^D-vli&i7CE;@Py2Z&<$bTYB^h%-xK{&4BinCSF_fI@` z?MdfIoy4N=t@u{dE83s`(RV4$x2*Gy2%lPojvQOBdiK)}r#iG0&(LG*+wwBeMXBPO zhg9Utw090K?TqS<8QF!=P!uVG-&XtBd_G&CCK%nfoC>|PZ`5LDIIDWcCc?RIXk~08 zmeW%c^%r_gO9CyjUbe6r?Khi9dGo<2DQUsTD(3qecC!69q}6B%?WgGbh$@5&dN!V$0q$+R%e zu;Ok(3TI_~ZYCh?Gj^GKRa7FG-gIr1CLh|A2?XQieBC9q5Sw${C{k~3P2_^@tz=SQ z>tXAJbgO^uoH0>LjjPaW7gg3afgAW5m?&DlA}aozGmJz>s0@qCSj)vcj+qK}2se%$ zm!o6P&~lp4$3k%~Rn96u!qH}1f~tyf4Qd%t5Yo0N%d8&hW-5?-4Zu{|D`&oSC$KGbde4@(pDP@H^Fty{t6bcIk`(LU90$dEHSwC)t+ylIPLJs0Sn zL9x8*!Ok9|;D3JY3~yx>SN~fbf1ynqC z-MU~YO+mD+fvc=XUt4RDA0BHI_is!HJ)qNbXY&dhJ&Yg)tg2yg?|&9t!K0^SYS3Yr zw!E)5&(@NY2Lk`r5VIRb76LVtmZVijG%~k(hdz^pl29oBEV|BM-6Zt|QC-h$f80iI zeW&t*YS^`S|0nf$%qZ{Yxa$h@>w99{(S3JN5}yCj@$D2q{lA^Ca84Vz3 z7NKV5jM=>&Doxr`7sm+_V`?V0^v=i|?1)I~o9t^weStex@Q;5cL1GlxyHkG!Gje#Z z1b=v4bhcq+1b>pTG}pbeXiCsHcTFPv66CwbV!cmRlwbC)6Sux$v#`^=4ONUUZLjGV z^l@$r`sDMC{uAj$c8nWch*SEHz6HWIOX!vuo5m=*CH2sv+)Qh24ZzpjgrQAw?rYHg zWbcRbX*!D(a2)I0AxZ3bl^=sBx1^ZESfyF)xBuGM+Kel2-c$%d&)_9 zwll4n!g$vnC_h3<@|Tembz`y5(aY`j^|o%9NBFQCUkAO}U*`gsvF>|DPH$SV%xcRv zo;!I^RHoe)Rd_=WcMXcsdmDK~qb>Xl1ZBGW*#dh#V>Qo*P@~fp)IPi+a{j`A{8(id zUca`KI*mW~RKq%B?rPOv`+{nHrl>lyO{|c}jQimA3;R?D%OZ5L7-iGOdIkJX-zc8R z3hu$-$xeCIh^S<*`mUAa>RRTRFATT_(^N?$@7U}=#Lv8)CRS6rPNwPX6hv+2!n6cz znC_yosIXsIq;-6d+bw3zX$#^z{gLFr79|vu8*r@|7bL!GJoLtry`Y1dhJzyxdtsTD z?99k-XEnEvn6n~O^lCx>F=C5s7WP`LQS9@#iuQb@3X&wg*R%w2&Xd~`E6lk`P?IL= z#>86apc0CUi&sVuP3V`&5C3T7B<-;MFi$LeSh{$`tLszIBu!^%MOB~!z`A$#-Sm-h zb!|-P<(Mzp0xgy75bS34hw+152?wT+wTfP)LTppN5H3zTv|4uSM=vZp-x4a0sQnkH zb8Jn%?rU}W8TfjvVs%%gj(lHHusO|aY<@Nk(tZuxg!MiiHa>?%-dhvOHH^;ucfNWG zYX9@OR{e@nU7YC64=z6I-%uRMIb_*SRggtet({%w#(wEBRY1YoKJP57FpU`zBv`MR zPN3o*bAL4apeM`!_d=G=M@wRBz|J#Tzp5v$UzrjUJ;th{2A10d{jL>fN)-)-5O}q zkC{0F`lPT4mCm+Mkqk%Ph*@jW4pdWdvrS}&&mUx@3zkiNih)@@&heDpH7I(7-o zF84myyhhyw>)xZ=5QQ?_E|6)Or!E^zr^B9pQ@@YC9|S2DqacCfX)s*?g=Pr%h}K6L zT~ti+&S};6pvsd9XS6^&(@F4^?GCF^E=E*x@xKWyPhi(k8ub+65^+0aX$_|r%gpS)ZoXc5%~HkIbq)&s>zmnM z>i02Ux}L6DcSgUH|4K^R%T8aN8V9$dG-0@vC^2K%VtNY}du7+*!De2+F?-Kf`aSs< zjdQE{g2!_s(e}1KZ`5_Rn~_iJEInTLF*;^^u@NsB-ikn0^c5X9cTo>1mT;VaYQ$C~ zS~jg!Fe!tJha0&9Y&Q{mPUY{Gz|<~?#AireHZl9RwzfG}79-{68_eGATcz+; zurREUCUhZUGM&U;t#(tecMFapUfKGHAvmH;FURKv&q8tBu11bq!Q;vuiX>Sjm)A0F z^hf~NTRR+KO&@c*-&sz7s$x*pHM|kj(>%FH5hVBDck@w?e%!|Ko$EuGeorFvIF18g z3YM`Lpe5ICVx8#Z3jPvs0>Xe304O|g0={2B?mKkFl(|bUGZHX`5>~lV+x2$0kfTZ> z+|3AZcfT;GM^~|4l70;9qe0OzpimDQ(7; zh!^%Ytv%Ia1Bu>6M27RyAZJ8+!!M13y)HE2ygKfqcq;}{3Z7@rdhk+PaLEvn=VOT2 zT=7`*j<#TD+YQh@viYB)t&=#zUv{(8H}mR=!}#yrl%Smz=gDJ}6M{}d68jkTp%@(8 zusnEg7>P~1w%K;@w-=Y63cUR#cyY@W_w#$|bhyesk`6TjMcXZ|I}$NX67=u4-?PO` zoLydOKL-slxi4AngDONn6fXA@f!L?kq%F*028^P{-)}8&4rZ_39{H8614bk4*!Z_ zIxoSGnpss*XJ&1VUFygBuZW@U@wB0MGnp zX0=MksyBMYncRzc=iOM^@!R=wp5211wbYtvFPoNYk0ixAIG0u-Qi^Js_>8Zh`CFiI?`osuR3NEtfS1n-davlGt>~E;svJQj`>swF{jX6=KCYS<7qE?m~itMTRQ9#s_+>HgS`# zT{3LW25VZCLD8zpHDB$yz#MVA|4qKMDgp|gvKEbsk0^1?;@1!#KT1On!*n%v3ZSNn zOu!H=o>qHo1~5mw;dvyf2Ec1=fsp$1_T|*{SIVFC!<1*%R`+1xEL};Fxc?EI4AohG zyjVSYqh<hBmufE|Jst~_9^47N+#?z40PfDA}7eGwWLdZ5v? zaliB09q(=RSoPKknmK^$CG|u6=yKb~&ojYm-X4#8r;Pt}<%`|-tauyb%X+;u zw)v(kq44UXKyXy&@m*r)l-JF}i^5X+N6RhY>q+6hhMt?+7VT-vxebdqwK%2_0auwR zQV_BI&2H0D{}Ga2Z(u5>JhWG7^j@*p{FCI=yjGp={KD)QHz0w0V6EsCSFB*KNM{IF zMmmiGLz*x@Iv7idHeTp|x9vSY%`3=a$aBUTS?fEj#KS6VZ$ctCr7LP05A7GmJ`lg5rKiVq|7Uxc+54hY7^~wFx>oSth!(8bUv2`} zlUAJB=d9Tu?XZ`QglL|>-4DC?$bFn!MWwV*g*Ml!dKsr12jtf2t~a%&{D*y1)P)Yr^|`$)|@uPv)Ahhkr|XJzEe;q*JeKwN1_~hBVqwi$oH($+4M$^~KMU>H1iRcqF&{QTqVR`D1qssOu~C zYV@p*U*hcPF*2SdxBavE6bV2Y-zu@xk{wM>u4T4v(8r%u?*PJ&yx04|`*L9sq|CIZ zlloenFS4gWyzC@h6Hre#pv(d+^Glp{4g=!sn1U=2XQhw%o-M}(eZ^Am<6a+i5&mG5 z@uf{U9lKROmrW<$H44524)}L9F$zWoeAg#rfrb#m``06_xWU&j$3+CiRKZ8CE%1Os z`?KeQui>08*e_KWp(W*eBmHT7CnnI>(4vK3=XGg6Fl07k5^hG&y*u8W{;PRy@nY2T zT=QThk!$@MfQ>|c^_RIi;bc-wevNq!yT!NuO|Cf){5i=Dm^xcvaVnzZenylnL%uln z07MRmM8L(Z;#t0r!DkxYrqeb_B4p!B8=dk@5g62%^9wVeW?kFdJ3{R43O5$rH+TJi+4aI=p69|?=JSfi^D z*4p0$QqFk0qqKC_f5W)b?N-YQAvjvdg;(ykR6)?Vcx8IOUF*7CsjLXamG11D2m)|n-D45>mB(Iv4(0Tu6%lN` zSc6^H5cqy}p(_7Y7EhG&Tx%GZxfZ>cx|U^F@1we2sKW>P2l0OFDM+gZenqC@AANnr z?ZbLpJ0UfSU8v$73yEmBcNsyA<$(BwJ7=ObbB@+Y)Dp>DOmx>dyrgj-dl$*1CryfA z#^0}i3^|N5c~Lvt=;JI$@iwP z#DV(^Xx85Zu0*q>7Sf2trmamZv7;VRavGHv>*%wz@WbuUubA~Yr^nE5+Cts8aCuK2 zd70<_3Ns(~_tXh2cF|V&S$Rei+~dU0A=E!N3M~2E1|bk94>9H`N+9iO6!a64IQiVZ zhgND2S-OGxv}DC*<vvmg7W2W-C0_*CSB5w&9wMo z7Obv=%9l`aLUl2kq_dPExoYrE7rSn@${WG7w!%u)@TKXWAL0)8QzaeSuD=^4=sW*x zVq9=|JW79?bCR@!hskz`W)-xcsM5yP02-UMxkFHC6*c8TEtB~nl@b)5>^guD-aJ+B zR`A(jcWD*KYh<~+dm~9ndc~28%Bo+EoL0_=JOin-+Fi83 zW@a2^Sh&oE$lft#%EKM0M-eWzn?6)`!Sn}!;n8URHBG$uoa@$Pd+cCrYY&WA$HliJ zKg0KP-Aqu`KzDuX-2vQBai;*;4~H@VS3XYmY{py+*q>v`4#SEc2wq*(W7b5RZdkMF zk2cc~ywKBO5;_U7_$sS8-zlA>RV;6UrKDWvW4 zrfgILVfF=U@<)42(qeI$;4`B!+VQhKQJ+NNuJh`k^>@6Lv*D84^0Sy$@VSb1B@Da~ zOiqow%sq%Mn%&VJ2i#QrW;D0AXyiRDO60jTB}nX>gXQeOFA{FiWWJ`Cbf?TK2iDn* zVU8zV)9!Ae=g6!I7;2$3QC$NmH1OR>ENmEPe|2cT@9ILSqxhq>0Dk%!S^)gUp&iNc z!KNRl7T-M$QD6yc8+%N4iT^2FJA1?G*qyn$kosi}>et3*M=vXa!;9Yo^M`4yT<{k6 z^@VI1tTw}`Z06*KB?OEYW&KH!@1 zzb+Vt(JKAN^$^h;=PF0PQK+5pt~dLB8R^Vc1POyLTpQdE>pgBIW{lfwB&r)2d0~5a zOQe(H0Cx}E(~kA<6Up7w_}60OX~}XS;j~Is$%qjKBY`xD7vFuvAf`F6ZjNvUouS8G zvrgK-r1;<;xQG|ZG&?%e=tmy4OR`@_Jy`oWkNFnEu)DoHTzlUo@Y?o4)a3y#wB@S}swQ*~Fj z4CsrblpeQWL<+o?S?F-Hv}#w|)k4gqoK(ZT6?>055=4|Y`J7*L@&KRxaoeeo!aL~D zyPsp9oJnOFH>7_deilvdYUoZ*1!*Te^UHMH7O8$)C~rVI2LS@^D6+eSvN`)`F6O$N z$wJKCth{{citk<%v${)AuJUO6*+RHHl!D>Dmo+$)ZNHs)~OK*!W7Dyk{>3!E(l${3n z{zC(<4wIYY1tbOj2t56nTQJWsS5&$uy+%fx{(R9;BTw5;UhN)wDp=on`L((3kAfs;>2m+ifiWd`Tgx(}P z$WBVL484pDjK5^9JASNgzD7?pv6huA4iu^vEoT%WB=X=DK7DQ|iOvoIFhLae9djgV z*ROuRvIXUFi2DH*IXMm3V@_v|u2f(R{+AFf)_Bsq4aDijn!9%e*R9uECYcVR_n~ zm2#XJFV?@3{NO=^vi#G3Bka$kPX)MhE9ZplI7V;~?tqy1PCc&mlt(Vd6$ zMwV8hx@PUs67isT=k=GKke!4rs|5Kwh}GNgR}uI>x1tVWbTFHp)|+y4p9vqVzXS10 zY~QEU$tGTC(fMBX%PpU2ETZPMe1TT^+?n_Vq~`0vnBe{*Y8BmCIIsihsS1}kdNcW_=IL{}u+YAH#%%q{ zQZu-t_Yz?Q&mb?4uF_S2HaGv1sVX3?(Uq~w|Ni{Z@Q*c7s76+XjLy{Xz{T%N>yHgG zztQAZi+BOzSK{#u7WrJ}-Rw(f+OL;x8n;qa61rqpqN6rDqh#V*>n z`UpQX<`w;}wnLND4aAO_NGR@x9sxKGg$|cohA7Jp0jz@C$o;b1h|k@8`Qo~+MOhCY zIyI&G%fhily_`s-NrI@J`jC@Dy1Pw0)V%G6sd#9w=LVZjU*Up6*2s}?`5i+cLMfP~ z{CXf_yKDt-@$?7srY*=7tL*e%MIsd^($HCapXN0?75l?AgYfiF(U)F0 zZ;fx3ifm9o4RZqq;H5}(G1pYZ^_&%Z1PB}Li@lTxXm8RUz`@(;1}yK*p>^qL;*OSF zbH+w4zK#txx`N0h90rn&1&NvHMz8TAbt|?$Z7)j>#HeajDgoO&Cf+~PyT0()2M|IP zi<5h_|NZ)QCC<3Pq0a(WxsnTb_xWo{7pt33|8*{nvW$-1c*6rhLoRUBmXbo@fh3*Hn8ZZDr2E z-zkR)`!lA)c?6$o4ZQEIJ6Pq-CL7tCTv-4~1ws_4^ zxv;it)B3c-2U?<1yd>HF9QdggY=Dkn&l;GBD2SIU<&E{&~S`x491;GwE12bkAWMu)#BLf1tE~ta2{F zHORCH4tl0dmB->cs?crRVaE{TBT%UUuH&Qk)|0925CUF5<8aJn@s8{v81L+jw@~#q z%=NtkA(?wl_=aEx{6VgDC#c-2VPr?Luxj$9oex=!sf_vz4?IVF9Dk^)dF>*>7+fse zsf?=eN<)#|yHI4J#lJyHz-Lnztjb)hW{m<8RZoJ~DWTMbeQ*tF@+1m)X>Us!eir~) zc#Eh9zJH=y3AID;oVy;QxKp4y3|93`AaA(1l3!kI{6W>v<{;$ba__y$J7;W;~t7ByWPYh+W!>tFbDI zNSWi4kHqQ;wi~avhhLW&+2eKJczLJhvfaGsmi0kBtm#4b6nnYG+JuT0+UA>{PNg_a z$xey2LH0<2yUK-=@K3#(f`> z6f7-pspMDa$#=>2t<K6W9U%As8?1jG#iy>t{p4tg&T0($cdk zXkdd)!2_~JL#=2?wJj27uA-|DR!Ef%s_7b#Eieh=b<1WmLwNdE{lM3ssFxiHqSK&& z?8*o&|uauAK}`t~kP1rF60oIIWf1up+^3TJcd6kTga2t8xmDl`54-c0I$L8;@xP~wxM%sbhEzOzp zWm9Y2AgzCI!P8gDcRgxP7%1*;&{CMW^ilYd(!J$SQHPF0`^?>`yZr}S3O3bu9L)J} zN_qBxrky9x=XJsG8-Z9f8@rKG8h8z)Q?CM*{I0KEbBL0tXLnt}otcB9H7oU3P5sQ2 zEmEt_=_3PaABUr&^xnSt-X^18@!5laEU#IOU8Zi~D2LfAqjC6V}Iv#o-tmjZNgu^Jl&@~hNlOzdGcVb8xF`$k6A zt9(BKo}-2Ibo6D~RT9 z!gbA>Y+2lHFo57n&fFVR^67>|Os)qNhI!=nAVwc)uk1wXzRo)_Z8yFsx7#;lyWp~p zEt4O=RS{Km=ifXAD;zx>;1I(q_>Ov+{Gp~`_rl6`p_Y$ceXJM6{e9Ch!h)vU8RM`@ zkx_uv(XkNfPpGKtJjw&T#?m$`@t>Td$M<#VN`Cv^lq2M&_rnrQZIh9&u(mttx9MS< zeQ&a+dW&Aa}WjjiDhzUYdVyN!E?zOwbru^4yAn_{DmW0 zKqO|yPd0vR^y2+YIa(`y6TTxO%$}@0wlXr3`7=((FJw66`w$MPHkJK$RdjoBP0)H5 zx%peZ=i5!zX8W+poxz3vEq}Myd^%qIx#lV2yv`2Mq0ywc2Z`#`kDoUEKaoyAXMdi{2VoI$JX@Ff&{5F1Rm`qyn&?a4Nr zUmNt}ukDc!LV>L1hsytV1!DE6AdNMaWbE@BtGYPAn~$Mxa9OyzwFO}`_Q<$+Z$qxH zcSi)#t7BRTgb{{>+y%G!xmN1u~-tis5gIO?9)dg__T@Z^U&{FK~oaPp<> zSoK)jhC{$2-VEwJR4US2Iw-TI&pAD2g{yyWp(q&q+hx}*ck@`FzM4ni=UwdpL7ZaW z^Jk&=Y#Xb^=kLl0#+jq+cmE6Q;|kdmHo1JI;;M5H)IL>qHWH?s)eMqE>f`Ypep`YN zHPf56Dv8F<7U;3wls{%Nfl$Nf$D1pOKAhDA<$%BVP0o|Te3%9yKIS4J$#7j~D|Y|- z;@wC5td&TE>06T8d3COl3zldQ5FLk@?4t+GyWBP z%77Qv$lfrv_G?T)$(|W205Vxu!YT?ju!j~)(ovFXo41@Au;=!7E^hn+-=7w`uigKV z_Qs%E+%;=9+8N;$TGDx69IgIV5ixBeXKtO#QThPJi7qRGR542}WAai5J6G8>6LZD*eh#!gUwVup%7cFhNQ zQRFGEWp59uB?w+-T|Bfbcb>w;LkTO}4d3!60k$2Yh?2>95q4PvWz&9oMUl1kS;N34 z)6{$9$y|H($TW;Mlyb~1nDKI;@q%Bgpxx)B>25uG`oiBA(EC7Qj;NTjRBO@s)BG1} zlLvVUM9RBb3q`)$#ws5$I+2+n9i5m;xd3#|M%8&AVb8^y_kqP8 z5JB!dTkr^=?<8qJ=eZ{{DdWokLL~DD*YQzS)&$re+hL>~8P|Z!r@`~b3Elz zyI+-Yq(QMQ;ta%UvjVgbbJgK4i{g{U$ zCeFQ{4&w6r`rxg~AWuX5iz$8OiF!f~K#2f-oD#y*f7JRwK(KMzRvPkE1~WX!&AXq0 zD#cgY7;Bt-n0JF&!tDZJ8tJjXA)TPgbywlE1o`=jqAOPH z<>zJB?zlye9qmf1EL6)Xc-!%OYpW89Q-xd@* z=^IiQEXo4k<~9qL7{X%xKD|s&kh4xKt%`Lx0l1+>^1E6l#UX@Mun9#-E%vYS%U zdmpK+@~9(0;Hi@JzR29$dDQNrq4Pr40_jilJ*?#SAByTrEs(D)K7~GFeR?`xR*jfW z7<6!Afut!QuOR9M`h%Uc;A(6i1%_U!58VkWPIprbwP`^z^569B){ZNo}SMOAWM(u&z|G$;&9DRZavH_5wi1 zkS1I(n69k9c&Xm8_T~4auFx>D_uI!@Z2|Xr*~?3{f#zGKX^s{nw`jFq7(kNWoKUit zWciDVWZ)*OCGHRmas&3U^;sv$nJI8d`Y0#oIN9;4cg}Q~xa_{%j2|+f69cK!$m%_E z`^(yeBkCYAequUlD<+Uudc(nh^*=DRxUugtv<9J%)J5#g`f$Xgk}<(}HOx@|QdQ~? zoxZ<=KYvhhUFXBWkh~9x-8cPvMBgpQz1`+`&yc2(H*JHOeck9&Ms=AllRvXqUS_pql1^?GP*RI7Hb+IpQkIKgCb1suf zH6ly(?L(CaoI2)hAnPd5m3%#jZx$ODH#9Xwgy`c5m*+8Joz2mMulB~$hQ#$MZ3x^u z<$VPG+rcOArv(z#c*ft*GECB2Xs+tl+aD9280FkPL=BNSp(%8nW$I4cr_cSiYKeJR zPw>B{97bHA*xutvJJvZF^J6ZO1?Puyw&_zqW-#;OCzkUQG;`4$hTL_~XvgIkGegV_f`oqg6RScMZ2J% zbq1;NZ(a3c?Q=PbPk&6L9`bXAcWK01iBGY z0sJYyWH_f#@fc+I0V8<(<{Yx2V!fOdX<5y(eO&*2eMb$OBF*KOa~sFCU?X}Q(Pc#y z*V_?<@kM{=Q+EZ?@jBg9alP@-rfSym`!XTrR%p8TH3e>VgiZO5_cgqg1_=_^q#kA) zd3V5@snI3(hetsjPtOzI)rfA^uHx+XlKwoREq6XeBHaqa#eYu21J5gp z8ZI>BZi7LuZ8}eVt2{ygR=&{yYL*ue#c%RXl03$1%DDlZ(php9c(Z>EOSE5Vaz5S) zQUoJMp90}zL9hbYb~rgRWI`vB42C82*rzKa^83vVIQnew`lHy;12yatZqjjZ8(XOK z_wTq#M=aU4otX%zsnx^V;%Ml&k_dbBy{+Z=#6BSC;((&$;MWQ!PG!O(Nx)$O5Msjw zuH%uMhjngbW_juzfA8`Ky%sws9~G$&O;)nB;N z?aZwOS-v(J;}?b~LsU~IKxf{7Tx%F_SPr;fu@1h{o+Y)v3cz<2p#%nk(DH}-_VWE8 zsvsirTf3H^jvQGGE}{E-($)>2VYpPWf>g{pJCW~25F^N*4b(I#3rUG!fcZE>(uhqx z*AD1W%~C%Ld{RVFia4t7E?hMB!oPiS?{zXMg2q0~K7J(~-Jd3omkpy3w1B)IfaXM$ z)|kKIf@60lfn~MH01yC`N2~-vgcDpEYLwepjRztMfLt4H0JwpH7gC?ZlQ<#yvRv&# zPtnzh-UrAt*I(>e@SCDWq&b0-+OQ4e&iS(cd(cpVKu3D)z)?NiUhyTprbw?1KGMfH zzoeS$-vKknw`wU}AFKW`Xh=QoR^5H3DBU{zIqTP2uK+60ZS=in%Z)WQ;d`ViFjGoN zZaA2`OoB8zh@pX0M`bZi{Ma+163jd+8&rXXdC6`|n3kZL2Eb~aR%{&$_WkF77p~X7 zL5hEX@mhG`UIi4X8KW^IJ+8M;VMg-nBU81YdR#CR)IM%*7TXpJ%9azb-UURIv!yC*6yc|pQ7g1 z3q15Xg5A-0jv>8plN0K|8#$1T9+m|fbA_DL&sQ=a72_9tpt90*^nm_NV8CqIIe{F{ zOR&_-SzwoL-g*w@9Q;ZD#yO~TTkjIs7UQllBDVs94}@4yXGL=7BN1a@)YC#yfZTjj zs+b*uk>WF)1`tso{7{VROmWJa_QZj=;z|ZtaG(9n{6(Bot#>u+jTPI6tf3_UL7zUj z*)*IU3|N(z*gO@a>?gv&$lhB;30eYU)?6CekL(>q4)hz2ZoTChmI=nWctIv2UoAm% z{$%r}9Y8R@-4dk?gdNZ=NFO`9P;#IgV)dzIJ#q{#qDsF!tOp7)eSd*D~Y(4~*O{ zYXVT@Ij3x}5jwV)fskZP%Etu!?t$2s)IW2?#bC*JXQzpAY`EF)VD5dNh5(Yj24+|Z z%0INhm;-3DovG-AbaXwyzkpVO6s{$^(j$%1!YQ(31Nc|b@y#}zEdByvD*{@@hSRPe zRzzhW$9}JF257Iu$X{Tp-O{J6Il}D*v5-qfIaciWbci&!JK6&;%@ZHB$~)SLlLb6P zWj}d;>oI=g7T{*UiuD*aqYj5ltL`TRuyhs#7gE2yR)pleE#m_q2 zgV+z18hOPy%Sy&1x&@JOrSPU*-3LLZcu1X^&%w8t7xtdDIwLxuHJQEp{+X(DMu#Ph z5a_5$$rIIWTU(fBJmioHY)FIXJB$-|z5T?D6Y6sX?(g!4Gp(n?7!&$j*NG9M0^Gz@ zmcPtKq)EZ<#g(I~bY%DUnEi5Fv|Z5lC#ToCWM_T*x({6y8bSi2^|E7!tkV=i0Z$dn za)HKg4#3~B^gjl|=<}45Bl#5caYasdEUDW4yxk`Ls^o8~dpYBy-sGRY$ImQo* zV*C6rqG?{WtZL8y=E!^xe3*`5nv%(uREzs{4%Eh;X--1RKhjTj(C zV8sVsaT_N+?Fh4X(!>@IK_Mzg6HlrN%uc3?r#1$O1Hx&VzMwWoHDCtt-%=vLP`SC zEpF_EQ3C$}2UR}ZsRo=Z0B`OemSP=e;feuTGphp`(z}Z=O2pY7-0#>uwB4CMSkpZq zrwPoOFV-uKwhU&XUhXx94MfE`vi(a$;2S7fUH$}R+7Bu;|Ly0TgR`~Tc45jN-Snjz zV4J;n1EZ;X1TAm*w&$pXD;BXKm75 zVYG$E45$QE;d~Bilr1EQWoCB$`q{%>yWa%YLKoS1rno{j8i;>#mHts3yC6jEHZC|R zhjNf;sh@8By?!KynC{vHo!i}gy!&R{D~q6`bPvJu)QJvC!4yS`ZEQ}}h(6c_LZ`Qd zg|tQb0jJTUDLjX9>mK4fEGK~AEUs^gMQiKx*@s zN^5{_qya7AR4N*XVkZC|w=I9HspZvCbj7RVnB}g!0!7R zof%AS3drB^9KdZr(?CQHgypDGoh$x-DR5ndphD^vAWn3qsMaz|lP*2GmbOj307i1x zH14z3lG}(lz{+@U^EP;(EF@#>$?1{>_*Pd&A4b}x zaHSA)J$(~6BFW)5pi#KrztrsC-MFM}#jd*~$h-3Par}q!$MNQRM!|8o`vHca+5C6! zJQr`twgC35zb{Y>zeJbjn%{bqYtDwZ+7v{TY!kwvOV7(bb-j6-hQ4Iz*atqg_Ec&6 z4+Hm-HQAQuf!F3TXU?-a0O2)`ABT@_a1`kEU6WX3Pi_Jt*4Fvv;BwPH)2&pt0x z{R+l;PM!cgAn*PrF!*jZypRovpzUD~H}HiYad8jP-y0e1Ph})_(R)g-s9Ft(Ooj46 zApNSL5L(Dr8ABbotdd&Q_0aL@cqQrXn0mqysAl)VuFem(+dC4vr2`@Ko4+4wNj=I7 znrD}SyMZFTT_YO&8jmd~RU2 z{aKzhQ&xhw;#Put!ENK4wkVu==C-VM05`+R zrV3b-3o`N2P;n!D){JlzHMOkUdsb5cmB+tis1_vd5Y_VmJa1dnK1GTkuJ>FB*uO{R z9LMC?VM`4GIB)4~5EyS|cufU0tuF!=stf}BQnm^fEeQP>&NV_*je>))5D-h$67)rv zN_E$%G;z&KV#&LGy>NLcp8^&ufE$ z#Gy`E;A{IMLrR2HI1zNsyPw)jH_bwhlnM%h;sq8(6Jw|9pI$2qEENV@q(-+*gZ#p3 zEyyo8l~!SZ6kCme?)k;cF6rR`HIkRYxBp3)w^-9H6iL9U{#gI2igTPvxPet zs@yB4)jh!vrM4>Hj~wvpgbmLBErm`PGxu)-C+Ym3#M`-8Fl2KVU_;gi-|1|_yGkPI zj6TrAbCpEe-tk}fzkvh5tpIFz1(u>0Sy(x41fyF9E{yd7J^mV)ny*2}zRh#)Au zVk#ecSP-r1p~)!Ph^q{GD@}=j?EMf$F8QZhFdt-2{x2O>S+(m3L`6CuUZ*UTQP1@_ z*ICqk@pRAuOT>N6p>|JvI#{|<`+K{mf&fDRcgmGZD>6X5ZO8_XG%1eNAM#W}QJZc1 z;NDfZ#kx1z0%JCXg9o~8gogCIwBMCbFp47(g@HHRWZMSfl-EkO)v-H4C{WPR6D^Ge zS}@;AL%dKlI~UkLkUF-fl8BUljf<~%e8@yJaG0(C+_PY_3356z@F!kke|LDP2^aUl z@C%X_+sB8kHz>Xkh8xM2J+(rKj^$GZn)u*C*(*{y z76axH1`zIlF+vHRufx@+7Gw&*wBfMKEGuN{S6Wiv1EeK4frIBRONkv?qYY#Yynm?; zD-Pkd?rneLeRhhp_%(lJP3liU&l|9^-e-pwc=|-E%xYN-jb{zty>i)&aT^25#y=2RGx2(SX%<03W@6 zNlRCu+}2lak@I!<#cY>%=`U%J)e)~ z<8go9Q|6S1oG!m8smDH@DbGI*7LRh9>@yI>?3NNh6El0EIU*K(J5L#bRjms?seBJA zSgPq1gE?Kc@-6ED0~dE;h%EaJaMk(=vUwp#Sq4TYw*;N(=@x%(SJXw4gpY}}-jsjh zhCy0hkK#5n+y_4aWI$@H@u`Z83QFx+X1w@f&M3!<=SR87g6qAQRc^yHY z{^9%@;A+KGBd(UIJ2Wl3lZQZ9#wcZOWo+`i3n$c+#5&ueE{9mZLKfFYf~cy-bg{&i z%`x!{Xk zJ;;MvcOB2TFTfpAcKDUxlLFzZs+FX03tY2*>_~%_F;aOIVG#PDhKsL98pm< zRCbo4C6=ws?uiM2`X~3K%?@j)W_c@kj$GZp8H6;Z>Wc>-EgKH`%HbF7XFWc?kuZ?( z3!x2CWKyP{|24_)8RcMi_hs+#`?$2qtfOp~G)885HXS2(03yfC;KcDU~-E8T6G`DDfk*&_a zxB_!5VuPS|b=!x^VA7m8m<-oGtDtB0{$=b9l~3 z^`~#falyFO%4vn?%xFeD#-ZDtoZVpa1FcMnU4HYPK&B|oaeZo8;BJ?Zkf72D z-4#~YjM5_})m`7r@6GhjHcTv$Lp9cUY)0nG1+SSz@nRneHCm}0ryMuF&z}YX=+)2N z`tOo@8VF9`nX&TxW3;4Snvl0?hJY>cQMkG9mg3F7(ffuQ9?{@I(YhPt%SwkBp`HKN zE*4K%rlZq~P%c;F7%K%G8JcSbdD$1B0IO?-u)ooM?F<(0bQV|^;)GkFi-p+Y73&JC z6_pOCF2F{|5igdmStZB>-72O=EAf5!TCnN55_BDC2aO>|t5goR>^>V+*~y`0>i|JD zZlq*3FQ-tad$>GB%(ub#sfsa+Sxf}~(mromR_XN$IX9WftK8pFYS98IMBz$zcwOgf z*GI)?rbyDIyoJ)h}QZ&?@|2ViN@dS0CXwAw197Zw0HOIFL zSx1W3Xf4BQH*fBKnO(2J$Xcd?`~u6swZ6jmjMbz5>&r!@>mHC_jwxM+DV3tkcn*a!S+b`~B(VpKeQF%*I1BvE{$m)D*#;TuF)*uJ!}s6=gzg z;!ZKVVUZpW;O}%}u&C*~0;a`G-l36(OEt|p@4Z*B<4+pby|9z>q~&$0xqf(a zf?`!z6US&n9k%zQriE0>ZvR9ecnv_wItC>x2BzIL+mnZ(NB?4q`hd~f6ZCBBqgr-c zT{_9}rte`U99zn%bGhfrg`uB+k+VpcEg2bdw=s%hl}Lf+N5p_f49-rJ`D~$d&r3Xq z2UJ33z->m_`=ME%XdJn$YU#GXUBT)U+w!D#ii{Y^{P=W9V)Ta^TX|C$wkt@#su1a| zESQ4l_`-|!298U4ggtcZu;b3b+|xY;h%d@cidSOnC*81R`o$wZj*8S_EMUkkUIG)0 z^~JMLHu3glf4@_lw!R6Tzi5w3)ikR(7h)jNVfsNTvD@JsgDp+{SRyRzX*rhNf%MdK z?U88=n{geV6QQlnOr)z`{K$9~;AA0chwcJq2I-w?UNkPAIF9IzZFM7MiZ?g<(RsKkW@lXJ86!vGu3P0UJ<=2+pp#47-Exm+jGR6K!S@7<95+m=2PXysh z^by8z{g>i1-$$tY9D!_aJvjEoRI4qBefyBWEN7&P6!oZORIS91r^a-;t&Ggl)E(_w@HRcQWV75XngSFF8ck}1B_07lXv zWq>Ri4*jkH^t-=2_rhqI=;M}Tl<6Pc`vRw$IPo{AtR(_6E{Wr9twi(f!=QISd~H8` z$9+phC9Mr=BUGB~UFhT-aR99hEj#}Cb#>LNIs0XwAfgg?FwhCh%zssOpn0Khc7MtsN-m$hDHj$&A_Mg1&>+?8)*Ufmi!F z(UY#ORBk=6QRz0CTfNcs78gC{Q6J*$j}RSFRYS4jwhs8xp7Y3bM3hO^t?f!Trk$1= z3xv;TrGI-0(t>%CEvPh-ZS%?LUJi|}|57n>$6(YSz%dMuT2t0_*@&MO;~H+jbx%2( z&ARqai;h(fOl{H%>0JZaOwlQQdV{G)4k;Er=Zl&$dd?k`T0%PPB`6+_;gv1N#HqN%{DJEX7 z=PLseu5U#Pg%qsMNknpdg=lC-i559Ayq!!Epv<+CKqDHWxMwl^jhDoyy_uSV;=_UN z#EKC|HmmHY9ypI8ojj;nI&8&GXki%(a#ZeAT3Ec$tEZOJ*M`_ZvI9RVS;5!gnBs<{ z@?L}eAp(-&hEb>5&CiWASV)8VDW4kQ@FJjfr<@n<(iHPvULRsuGfDAgxV{c+7LV0qZ!fc9k2*FqM_k6n+wl+7!dEe{FZ)qzeIS&mcdY4S zXMMY5{UhJ|-3(1*`Q?z z(5_{R2SOuYs3VoMYNe@1$%a?)0ud(zUujxg#iPxz@0C zaQxD*z7(0MFkf)mRESuxs9&XFP#M3XW&sRS+=aEn{VPm?fT~P z1vnDe-y+uUo+bbWn?D5vQ0x#%P_nGb6h@S#(!8! zQjlRwn@NDtT6`)XN{%;2WWCy!7Mc}@1z;%y=4wA~dD2)g3JDl))n*F{+_0fpM$M!I zUA8ziv?}0;7aUbWNpcW~*}{`AgJ3p(SRr>`F$~|qOv$l8y2a~JsrMS*u1yMrBpLpj zFPHAu01W`51QTK@0P*b^p1aEmy?2~LX7ITy6ms|t!guBT^2V=foW%Ow%Uz&q6Tb_+ zY3V^#3YoZmWiWP91-GK*5t!KHU>1n^u?C_RFj zo&V6d77|e<;~JRb4$HYNe*=zrvn{h1x51-p5fL;$Moa$g_RL>6nD{*>qr*mSZ4EjHbLhu&Y{UOkhzg^g)xa1Z94ca{9@kiU z4$bj@-Neh)A717HPpUS1?{4OG=f95PS0!`KZToor*DZe}F$@bF-DQ$EZ?vHgOo{XjN8)WC&>V zqUyYz#S1T36C+gcu6sLg17$rZ^RyTHvZ)bMA(~;$5sK?(!kU3@S^`!?M-SSiu^%ko z1GLptFer+RNPUEg%IV;92+zYM3?3RPptScoWkpm=E_V(+Hk~^5Au_6pqIf%FVMw$o%h16yd28w*( z7GL|`og4ZtBm0cpGggINle4m|RLX(Im6v_HoCk&w)$o!5a{HWN0jz}>q~rffg961; zAz}JNjb3sW0_`;+Ei}y+!jX52Ds|ECij6&J2b0~e&qpVZ*xedbA>TvQ)pgv9{)&F8 zvNUpMK~+^BZR&%gu2?yJ0xy#c0;qw=EkE{zu5Yvryz|dYEnW4K(YzhZROC~)JMFRT zfS=b{L0?%M-Fy7Ic;a6*!BGt2WyWs~1T(eou@Ws@o5 zns(5?^H#wn%3Qh>x>B*X{}!7;O4s0H#Z>jp#;mFFosWE2FGCA-%oSOs)~{GkX*fJZ zhtWlf*(vSrkV5`|KHg#dB9F8zWRSuXha1^D$_JclGfS1hq^%@P>e4>?lKRr%70mGb<4N`PYb zyK2qQC@(;ZK6j{nzJYJ0%{c;2=KIk9n-VSqA%df}k?$1`6J$l|MO)yOf_*goCGYY| z0d{xe!>y8pY;f%VXMnXDGA~D@z%b`~^v?CNiI?>@Qnypc9Z_An)&kH()2HmrCJgs{ z!twSgr_g&Hvm?BYq?>H5{k06H{W^k<9lHY7_C4~TS)EE;4j)|2oocwH<{9j8xwQuQ}~iWADW$1yTNY*y5fByjvNLe}X^nYR~s-T^4g zb+jg4o==25DBiJn;%gxL!<7jWss;``2TEZ zV00N^a!JxAs52WyP zCcsEB2FdHC@P==}v{WN6kYEXdCT>MDLdDfEnpKN7=nKyKwxecHADQfh9;UfDKI)70 zU<7%qN$Aa^e|P=|03JOyWV$_a0FIW$U>-8l5}MSepsFFIFP$*n<|_2_}a20&q9LSMw`>J%AO@ z8kA;42Y}5gJQkZj*VaDwTd2{_Pv7^**3RjDiDiU0Rr?Kn{(3T&LB_5(^#_l?1f&h> zkD3>nWr`nw8%F1k$5!%MlhRugT@5=`DXvOEeNwMy%*wz6{BT^MvIA%O!T3S2%(&YP z2X~{ra3~X_>nvQk(f6T&CvI7aQpUE(`Ug>XCHP->NK|NqeQ59K+IZU`)K`3g3H6F;Jey^am z`$yFbN0tN;4R9t9!ZeRs zAq(@N*?RRZK}NZ%=6l1bPhdUh?|7Y|smjKIpQ-v(VNk)EeE2GJc@|$6ZXz)Rb~L^6X=d@UIg$v|o(JnoRqnG*{GbEcu|yA7JT z(vue*c64R^x{fdV{i!d#iR72_7a=D@b6m(G*j-n=dCPtWWko06c1PMOfevJXXI}xC z7T)HqAM^Q@T_w-z`MYFYjqCDz=r>^UX&ep8^&$@4#=JqjzH%cqiD z(QlG{1aRtCv3-$ZQ#+zjNs57T5ZN=8`U0rC1fxGk(rbKZJ(md4U^O_+Srtzjo9B!g z2_8E6zW=e{zMn8j-uF+$$EQxFO+c`z-uIt~3v?;x-7QOV1fHnSVuj$ZVGwJ^z@4u)j!@#g_fa}zM> zu4Xr1u~r5jr{JM&ZTUr4530ob8=2S`;r&k9NP~(V+qaXn5t5UD8cy5={Suz1=UBR!HKmo|PKEbaF=QUhck+6!^(ynq^x1zeR7;o-OAsjVAfEKZRqEQ1;0 zoj76o-*G}i;8|5d#r-T`csGQ`oP22I!W7iP^z^m=*@^S7b;nr9@7e`K-H#t$ZZfS& z4Cvp5@WPoQ(PuPrtqZtsQeKZj^!fV+jbADknt(NEpyx;bqCk-0*Nhl`I=f$Z+CPH# z<3qQXU zKBse(*Otu$!$2XkNyjXNIT&SB1E08BIpWJh#VxZ4?2~|=lC&IPtU0S&f_D-n+JHST zU5>61U=x*wWWEopROeF%xXNi$US&y#w(2*n$+Yhe+MSuARn<1`c<6<_`xKcJFNwU* zn-EuiIm}efh{sSs^aVM2+~_y-=6F1uT(yerPr*olsNw_ab2sRe*l}=LM*I?Py@dekfrzlGojFA(&}VjRB$;>6<+QVr(V-WfO4 zH5K4}X;)z4`aZgNb|~BOt~@jpua=tBbUzgbd66lxbPy1kU%@>bZC^8x*@Cag;v|kQ z+4%lyK3&yS=B19RW4f207k46Ag$e$e&Co<{mPm#E6A{QUZBxjF^bA}`;H8A6 z7GnSc^~i?{)ewcbGT=|-djE?PZPD+^*pUi{O>ntH)CahLH$pWTp`ARC+Pxh4MMp#^P`qmX;q4Ix6XAoT zN*_Heu$~&i!A<~@F5%259kkqA2WrZ%N)$Fs&FXl8@<=+}9?-nNdlry4HE*j{#i}^G zZ91T6fv3VM9tZcc6Gl=n44zy#pc|v{wBZ)63v9Vig>S`^bnOU0Bkm%>9qYpIqX#qO zxh@(fcL~gl84w}7$6>b2)ADk_-o&%`odZr9qqAH(2_q+`Y%SyjJz#i>r zgW$!nl|dxC03wcjNa?!oe6JCi1-0O@%Gm?rB)63x0!Y=*ohc1B>I=!lwp;vN%rxd) zh!BukQ0w4C%$16SsJ>uDSpDTG zOG*!*d=Ofz5M~quhG{!TYte9Gwf2jXQun=YZ3vQg6wg-Yg|usav~Q~GK{_ClZP*d8y_Ym;(g^~7^e55`eY{Hoe)I3PA z{ps_Ymv51dcmxS5k%mVFSC7%0fQ9gtKfU1@LhQUH6%d_h7{#`CC-8>g4R@2{+%WPG z?C-E2lteX` zy+Uu7xYc8{?jWU%Iktoq3-ZtDaLkusH>~Xs_q!zW1K43&D#>uNe}t_ECb0G3&ZCWo zyMugBx4FpmwZ`bn^1OVnwM|24hfH)>nNNcX^lZ%l2?9mTXm+COY%~Df+?9h+FCb@x zN2vo<09PfC7MEZW&XZuAv7z2Lj`BPEO#B8u+b2t+@Gj?v(G&Cul+VYo!cMl$7qOWS zmPq^UMCUc6pFY8}> zUp!x6rVNe<^!!WDz6{aGVXRsifHFQ+-J<*&aQnfl|8&WS4+RsoEXiT=vi%knTlkEM zbRVrd{G6F#B*U6M_?GSBY@7d_>9E9waC668$W5)WTg$@6%qPJssS`_i@?)d%zAoDu zMHJE&7ln`gewFSno_3B_rNRUS8aV_CIykv@!)E9}tqfx4WqrNW|P$Xsm-%2@e0iP={Lo<=F|D z8ChW8){aL;SD^u4-Ln8iu;Rb*Dao)^0QcECNr5}I5*CAs=tuA&%`d+Um<@4N+JCay zs^T6+&J%~jBe(S{i;zpP18&piMNi4^xv#m5Upy;k+1*R)<%~i__vAfZ*X7!*fBEz9 zd&c@G4`lUDU4$UPx$-Xr3Bi>9?2U{!al1~IA`>0Vu; zxG7phE5gsWx#o~0V?uZScSsE!dvuvD0Mzt4p0r1K$j5}{pMgwzt>V^-L9FsmrtQcp ztj+4)2gk^di!}h*VffJwRzdY=LWDr%g=WY-0*DDpLTo^NQo)F$4;{RaaD|qFVz~F@ zMlc0KN~T;2V*wM=CX#?=*`Ywb1#`f0IQCb8N+<(PKDKA6IY^$g-K`i)U&4qK=oGW? z^lByYPAw7hMb>tzz5$xVSmM^`L+R<_&)SAv7BaOj1XDZ-`F1WXeqP^ouXBpyZs|5a zLk3X+ZWrtlolr9{gl5=aI|2#!A^;cWHAEHUt7tTQp1NJkT(#pG{pRv>?Crm-x{#rX z$@_1~*W-4xS0$;SOSQ!p<@;`}-Gib+n^A0B23;zWC^f!*?MG3F5v&>I!9Y-zJU<~iV~KHt1BXWG2rd-qdx zvA8PufEYg(7z5nohW%eUWTWE zXbsK^E)ITdH$SjZ6He^j*OLJPVi+LxlA&;r4ikZsA&UR5qc zA+1gfw7SwAoF@vJ;g}|NS33Jxk0xG*Asb~-s7+ztn>AeFS20O3bXG$90x`>AJcXtz z7^oZnZMH>q;{d7~|Ew9PN1omh@vALa$E6q7^0Fs9* zNp%Ml2pE8&nUNi6kV2%-9v3W5{Ulg^JusDUvKai4fv5e1UX<J-u3NTv=Nkocqj#P0lXr&vt47Eia`je zR#wxy>S6xjT9;{%yG?IRjvt-r?dM!+3&c?|@Mg2XhlL}^!m|jYdoqmo(XJk;76frg z(HopqUuugQ`sZvnXWJ909C4jzdk#iE^iCbAuysoNBPsViBnMrdz71Hh!?zr*nS?^b z5IxtMk*ywboX-6!ZDDcR$mse+2J61r6k;6UAsQX90XjLaZVa9#sPb?z#Eb=4-#V-h z3su@T!cZMb#6cdT{NpdmsE05A8V8$!#zDVV;RtR_2V^b4B9+b`^IN@X2WwwQK?C?4 zH9RrInr6-wfH{K02wB>~<3TN1jb-Dc!7L$2G_AAz5aw9Z3f~XxTd}AbkG!#o6%F5` z7mlic1|TbvyL7Ru0UJ`Y!W8l=?SJl(c&XD3exPkE^)`3nsZLz};&F>zv+|RHa@wp* zFFWFGom|3~K6t#0Tgwjp$)#hVX54IxtVTnCiJOLPny`b&)CHbU4Uc@YL47IJAjn9s zSQbW>?lP3nUvShW0kJpSq~L&G0$Rb-}L`veaUQFP=c! z0w!Mgm4sLDkU~-whqmzvbC$KwSHpERI8p{#A~d!KtSxY*Q+Th3Z$MQt((tnu99J9Q zp|m&-?v^u0Ylo#zb(~ECK1Ggc6&Ef(mhuqTT^=5GvQ}o#pD zfP$kf%O3-~>{Q)j664~J4=2|0-FLM%EtmsHeu(t>(zhm@Bs3-9>+ysTObhUNkE}3t z&5=Lye(+|p_QCWcK^qf4X%;);F-pPtl%nK-dcOR|LGUvi=F*XUr$@huN{X` zueJy^f>Wv%oznMtUC(RNqS9g9LKH{J_xzIc$o3pV%O`<$0wvvnzNUBjW0SGfdvskL z*7Sru(9u+(I-`>Xl#$iZo2j<)3FDv^Bo6`-AioOcqMYJ{`+dQ}#jHoTQsx{RYjgv# zNdJZ}L1HDZpqf;aYlhUVwTCsKI_ zYRd(8;&XVW)m9Ty1Tz~o@m_Ly#wy+m$|Y3(#?h*Z>fl zT!({)otcM17LATkUC`z`BYeU375Oxhnk$_Q)5%j!rl*i;S26lYSfJZg@K;8H_D+8n zC)8CNo_xdrstjh&2Cj?3YDC|eF;R2I4u zY_YsL3%9)LA_!NWdxSp9x-8Jv``d4iGoK@%Bg=~bIT@9q0^}_^2{8k3a;4Lmlhsvr zaRg}RNl&0*Rf(L`RzN!}jC*WK(oZGUl{PV1k;*TZm^6!dp);wyMj-C?x^H21v?8ZN}w!wnjpc#a>q>CRsQd~ed# zpK*AIBc_{! zUw@MM3fTFhdNZ6bzxg-0m#6)7VNo5JIl!K1Co-IbgIFZWy4ZjN!5YiBhwHwo=6o&2O0k_HFU%(KeD!pD@tpnPn zF8ClyOiU`#Gk#PU%Md~dO1p^X4$IEcDTd1%8hSLbL zc`Se%vpQpdM(*AOo`yso9)uMJ_(UFT;@|!q0!M^(GwpGU5xjFKK-{b#I0HnUd@Rqu zF=LPyMF778(MVJ$l6gpWfuK2V?<;Xs9v;2-`HJ=K;PnSP7mSmp1CDgofBL6boihr{ z$ofg2u4u6rggBr{?&<8#Hq=WS;VlKD)P#x(l8>^Xtpo^g?N*+_rv#h6V3xJ7B@rk> zq7u?V_Kss<;R~ihn={V4on5qMXuvOrcaa&KHwZ}<*NuxdaQFhHR4U*@CanUi2ul`J z!y5+hL^5QxpIJl6uMP@(ZJdc#eSkdixH?7dIzH`(f~po^3N%`mUC0Dm;sK?GkdDm~ zl}Len1PY|7Cz#z`^C62=aL=1YmUwvs%Ig~rg9=iCAe~C71zFkUBdnJiNahJZjwNivsT56;m(81vA3-6&p^l7vy9 zoXS2IJggzl`9G+)w`iIT-RR=dzOZ|^p1soOJ`wlyqf{7$0`}|s$imMHS9V8opYm}} ze5=>3CcvJI^7IOkHTQ+#$Hy-(LY>GWNMeq^60(AkhsCxQicJA^rdnpdc8I?h6+ZS_ zF9ZY!KQydQZjRVrlKz)Bta**(da0u}Rn!kaW(+0xlsUi!c`m;TT#0waZ@kjH1KK$u z0qj}_q0fpe9vn4n2lD2VIEEJ;UZ@A-kkI#|zp%?5?+GdT8Jf%RsPAMSAzYfCh|q3S zYCrM|Doqk<%KhJf7MUe!~^b zc6?_-#FE=`X>liX-_}_kPgv3q6)J?Z^`i12Ly2HX^CC*7m>3KkMV7+LJ>050{>A5eBAbLo9eQS z6yTm1T7Lb)QLHQi5ax}D{YBnxqT8cheP(wrcO*%1A&dBRM49kz+iqIvk&}G?a+~dx zTbyC3fgcyZ;a`#pH{zjIEc=R&6Xkan_<3`{rNwpWn+VY)mg~IYQFM(MBm(k$LX(Bo zF1F3rL4_Kg45o`n(5p(qx3`0*i|;POSGp7czLr)E7$_YAS7O(kD!cqZb3|1YJ1k4M z;U4ZDggGNaci!Ry0=@yl8|7=jPECOS2GBsP?etmCQXs3!T7%lKV6V-&a$&y&x>c&! zr*A%%6pZ&EsL;@L+bMOyU<<5c!^mj!{wanR1|adCq&YGdJd8};UB$EW%TyS>kix70 zW?9{qlnr~r`#h0`$SjKWcEM-r4IV9fVQ+4D8iX&c1N`^bNCU*n4K)I*m$Pye#EQ)m zI4^Rid6%{C=YYJ408+t|p?(kRC7%$H%dHG0yoilN`g-$d#bYogmBg4H5W z3|wG0d^7**^sW_O`KeNW|3Q@7JjXddGjf;#c1KEsRJ&&V%{+Ix{J>C$AGZQBIcjFh z>kTy#o2Y|dQ09GSTI;-E%zW#{(bPq)i3E@{@63)^TfRH64*K1pT(2hUR8SyT=O7}- zfs?{L=W=}+eyG7Hpg*W^?H(u&)DX!hX?d!>``R`qi^%JK6`c#eMSLV%r@wpB6Y)VzP0l7j*hvD%yVn=uDb50#I(|L z=T;slWXY{#cZBT2P#VfY>+R#!mx_^&Jvn>6ufMv^ZCUh}r-B2XWww9E2WJHBCOW8Z z3QV%uT&4^srA8%d72pnx>jkX!i-1j-nu;=rTn&@^a8U>SRpK6zxojLrTd&7%dBB8fJ5zdoyBzR>H4Kyt5OahlC zl|@)nNrJZM(J_D-GkW*IfTP~x@F33=u#0DR!YIRHMUw*}9Lu3T>tJPCfK!&cDc%%8 z+B~RW7DYwV=#MjD9#bS$PVqRnkua+W277g!b_I*u@gK%X6j^mT;P!@mzRnI1+#Z3W z{`B>R8)$&R#8}inbpY;GbhYLkFafIpZEJ8`p|9iF6>D5?wI=!dKgDbI@6G7%$o-fW z%>L@__%>4bYzEGeGt^Tn?usBzKzoA~8j#pUgtchZ8m-EQI}!*o<1byP{n|%hp{W!% zT`rZT(#cl_v9_MP#LC89=y{S)nvR#f5wjDxyEnu8F25KiD=#x4Mz0-9jk z6I89_j#rgh(Qm*FZL$u&v2fXx$%>L?>%ajY5qHHvI%6_LX0myFHt9!a{l}JMtj9ff zj&3;V8th~3Yll4wqW}D`GkZF^__<%ahtolxpVRDC8NT-|4#;ib_v#D4K#;yB%?FB1 z5X`E-Mi;|Sso+`$PnBJae9`wqG+!cVOw4viGnRd_S>D_AVrl^J$@IXBKp%-*Uz)iV z;L8ve2$;;o&QoWl1m2#cuJO-rP7IAhT&)sZH6%sy&ZY%TKUx|r#3IE4oC`K%bw)h7 z`Z7SV@uD<8yxJV#zolKCW~BFI{rCEM#KFya?%~dMe3k#9q>Q+9!vBXv+S)yT-tByy zLv)FSL#GcCbxs1^bgnI=qS$c-6puq!!ZQv9V|dQ3voDkA24IGK{oB zQJl3{w(YD%ww5isXy@{5L{MH1=4s!Sv+cI(-gWU4wBvqhS^2>5c=(Gdd@JUJrT>~7 zu#{(h%aN)qn=%G9!@n%jF}U5%dRBk}x?=U`^B^zPkgDI+^lxb{n)wkgSWL5KmGc1^W2#YWRCD56va2pW#xqsvMAk%*`g!`C|z5;cQ)<-yVB_TmD z90H9o!IOS(#P1CM+X$dl07YT+T%Lh$?rQVCp!k41X$Yv&wIVM{;SA<5NtgI>LwTo_ zdvaDmAMtc4vU~EyKt3ieeUC;bOHyqscipdoWh-FxLZgX3i zfPVJn&i#GLFZ2VS!th+_vG3Dp4*()hI*M4xYwsY5-W*yt-~e;*%tN8$A>N4U1$YF5 z4Df&XxVxObo%3#fU&!wHTkq-**&64XQAnCyz2>ARWyF;U{yDFrFIc$FECrc7%*d_? z2+*MjF8CGAc2aUX_{&i%0lUF~?nMb*K0_>Y1DC9+a_{mP6l%WA>e8~4;<$_o> z19%bIaBFE`%p{3$(*fn$FYDDDA2f^?%~t)eLk;dp9jESCkV`{trtFe={vVpHdi`3P zt)OH0eEWnpyZDuY308+S94Ku6fnUe-BANI3!T7siJaV-%G!mq)>v9lqa)I3iFb04T zpdG)mb>S1_3exd_5bP1aTs-1DY$GUJ+0<+u(n*@9jRJWR{0-0rVqot=kRoF`RBxhn zl-(?`f5NRE$LdzdwN8HPYIGJzo&SlYidMToV=b#3R)Pk8$g_|;>&76Z;Fg$#0=75f z`T4ADyZ05FnYder{umwH&Pmgga zO2|o?=EnO-C8F#se+l#uz;+G+>No&J&kdj1?6z`oRi=0#dSsS@1)^EvE(B%4Vs?64 zOyJDQ*{5mL*R!_nLoSxCijsp9uxwxqzw^iq%i*sW!N->~oPzCM25|Cj^M!ygi> z>YT7kLaC{9#Tm%k)HBF~;W*@I5W~5wy(xn5$`1~)CkUGWI^1~%I4PxP)_Txp7<^$Y zhX?#Y*2s@D#yrFheAG

      qx!;C)O$fG=sdr_y7#VJgCm`*kl~P-__go6Am0Zljs-7 zPDNd4`~!NsYV(FxP*1$j>?@DbwEV$1lgRG*d^SsHt48J)I_h?J3vX92*vdt|z&Rb% zh5gZs&}YD{qjr|;dbVwQG5}cA8AWaxD%lkMOh{s&)oHcTGMzUQcQny0H^N$#`4Un5 zm1AVZ^1-RlpxfrH&JU`dR!1f=oyD+#34{fp?-ss1@=>f9I*8jZKr2EN1(fXoa_IH5 z0}i=daTGfMT0a?9A}%%%y4X!>OjkdkQNRKq5#4ebvaNlK`mJaE-F=oa{abc3<2xr6 ze`FCq$Cb1FxVWhryZ4S%-aC7g>NpuZ&@j659DxX*J;tp2kdX2fZf{0JzmDVQc96i& zKr`V=K$3>IbuVmDY|u3U86-YLQ<^6YJzMz|WHCk;ej_YggkfVX$FUbJNIWzE_2o4B zz|~nFSlf?+)8g3~G@yZlWi14()EmC*7nym{%9C5-hm!0p|D3dj|^ z2)1gJ&1Qm%&g%r{Ou5Oj*B|Tz!d64)_lDKKGdo2T!T%t$JOG&moouJb)8iPITlIQY zZr}in-pgETP#e}Jw{bG4{FylwNKng@0R#%sSTvOVkBLkY8PfibiR@Rf^zcj*Nn67K z>nhweZ>JQkP`L-1YhAZTV|H#Nufx`$Evhy-L*UPI(o2wPbPUwmg=kt|@T3@!dM1_* z-$#-sbYiuR;WVNuSDXme7RYkZ;Rl0iS~TnMV|6$MRqMI^K~e z@PotafM3nM5%9ya(tIqdS+j0JW-@Q!2i}t^F<@ato86bqSuJGIISofd*36=8yzqhy ze*+IcG;AR$2!S%MM^3f`s9?7PK-0|HX!lJ`Nr@nrF zbHbCJc42=fr>>jFx9s^oAQ|yzL>@N3D*y0s7T2amR%9T)zI-WASJ3W>yoO<%Q6{jR zOwZ>SPc=k1v??)PJNM(A7^E!%n+L2I?FqS0H+!Ia(9~DzPZxhejL989u<-ofg$*t@ z3XUveSfosZI%wjG1s~T8Y}RD(EtD#NTrGH5@82F(0=EQsMtZ)PGkphzqKNJ$36T19 ziiO|o-33dIE_MZ(cbu$ygtg+@y=pzmaUlOiX=@bLIljw=y@GVV@`W{DuV-u8->YX@ z)$M)3Z4y$vGXjq&t4?5(Tu0Z^OD2D-=s!iYoD{e9(~{5xh4jTcVNfaM z^wrJ~riw>pux6-y&q5q=Z9)KiK9M^|jr>@)M`zY9tBm*%`-I;s3b;EmqSzVUFJ2Vd^Mp-w!sfip6v+KoUgfpy#)sGE2JlP5J{mSM;D|K>vD z0EcN_W}tzoO~qUVS=fD~0kaXB_+j_=7Fc#7*9GXUP*j5Rz?N2yFS6SaT*NrEfA5A* zIAXw*Z`HAF!~id-$1%t22OP}UV`a9nr#nH>f9U#nj(-e1PkkNs2VYlfz8-fB4R~Ou z)~x2L5jc5oT;UdfeUq1*!QSdGA5Pe+H4E9}BgM&l=S&=nRQuAFUqj;KFWvh7|Gox=>WP5BU@&P3${;Kx;Q;O|KC_VQq~(iYn)felwfbu&e9rdS16Nxe4Gsu}Xcj z-lpffQisPMlX=?VAyW`e_=qvu{!o!E3^=h!# zcFDu*I~4ZRG=zo8TQ<_L^Gyh_`QWrgTa<84yTJD_n@NOO?udd5v8FR(oNG{rz*YX*P`l zYu)gBE(Mt-zPnO75GtW1fdY z66NPC`~E!LpZ#Zl@Q!3O43mUl#*NL%&j38)Z{o$JQ=(c#Kx|l@v2+!%U#5&?L}ti$ zZrH>NWZQMJn|Kj#T|OD4&QV~U9Z<8{aywFq(nB|U6|z)UX~-e7_Y@Ge??5x~!^ozn za&{5H>$U}!IYsm_jIOcFVI%mY{Z2t~Y+Z$hyMb(MMLmE0z29HybB~zRfP7m2SlsI8 zm)=WsD%tTJ^EKBulc!b*^kCkV0=nw@~HoqH~+fXssLiCX({mq zE8upVr^e%{#LJfPRemxIF*i@FAGV(~(t^{^E)?Y)VncJtiqQ zbFkUrC~A)%?-FbR2(p1e#zy`F@aGVcOEcP0P+r!KpB0zMa6dF1lsCq--X-{`wi4t| z)FMj-y*Ff%YCqfZEAyPVh4#8{+!}B!$@=|0-DCyX85x*Haw$*67js=p0bd~LLWM!G z%u3kUL)~z)ufb&IiKAB3soJBr*4yGO>sMH1TR9}U@YBwdJ1)kVhkE%SbQ?G{i`ljR4Kw~t2J360S%!ZUAVIj04Tl{hF#-c7$Gb~XK9+p?Gnx0b*^1)EXoJ_rcFvRfV#=dt7ApUm z*`0EcXT6{e^FHs-2)Ef8Em5#^h-2~4Wu@)bD-s0{@K~PjBpyl}Gvp+OUxqnSz3}Qr zgFC8n5_9~Cl%Q_>h6A{|;oD)f*29q|!>ekRj{z>46~zHs0pQVsk9iVYhX4vB!8Egz z1XNfu0H68-@?h#I3omE_K9$!wiPm*||L{^vnVq$1hG{c2I(tEzlV#XRs%X;Z|8qq# zr18=xEj{Ad8=JnJZOB<*+Ut26jp2(B^5o;9W!MD<^0vRDR6N^pw;L+Flf?Fr0c7vq z=ax15hczS*V65<2LA5eF<%NyL=`Q(|ErgvcaS_*9Li%;_w1!C#$Pk%pfJuZx$3S*o z#OS2RFvzpI&|<*W7v?K=sHlbJhz(BK8efjjj-ho0?Q$BB3(Xzh zY?J@l!164WV9Tftjn^oIVA|(>!T5@XZ*$F7YAl|m3xoCbKrvW`SYUt-CkV|9p$OW9 zQ{Q09fVrG23R0oeHxpx)AyFvxCj$;RZr$iSb0Z%{aKW&C;S!or!{Wg2RMsg-slZyK zN3Ae$kR({voN_xk9SGgCYBg*L*C4X}+mLk*7R%JPa%$MFNidNvR|jthXSe!vP-E5a z95p*AfSukk9Y>bxm7Pz5d6I2y-l&Bj_uD9iUEG=bUc+W)o#1nO4}IA1GgdIi)k0!7 z?WzaddgQSh+w2JKApJ$hKLo^+kb8zcFhYZxOT@eITX|see>N3zqGE58} zVis-VC-AxuU}hVjaP&5hd{|cid>PTWgPh#AMXigw{IdM<`Tcc2^Z1sHUv~>ylX8Xc zN@qA+%dU`q(%c!sc^~z9Y%}Da*g&h1tqpJ9mn)hbo3;48OOoYyU z@sAidr>(QvufF@1b|q9iqYLMs732wV&3z9mK+ z>5Z@}X$HDV;f8r?Favr+3rPY7r>)~no7@GPlooVfpuU9d7k>f1Q%Wm%-ADc@zVqG! z%_auMEdYSgZ0(r^?{6a7^3Dq?DkOq@;xp;MA8l?%fVJa*t%Um%aFn~Zd%G$@fF#M5 z??V`@bZ1y+>c1d;zNf_w^R~Dk;0uz8<9GGg@q)y|eXegJ=c;L5bM?Ccg>(ogmFA!kR`oSvU*?M&z2Q{`J{)&)PQ z|GBdrGQ=Qr;)0tuchXJKS`e3a#D}TZSLAi(@tSfcH|GVv+ZgQnOR=!+#@LHgZX50! z<*h+iuob$n(P8bT`X#~zd@4D7a~c|kZ-2(GM*--0(2=@c z!gk`%clX0B%0i9^e<~$F;x$J@$U0Q#94}-*U;&T)a(f;q-T{pn^R(duZ|mXJZ&MI# zIto94g&N5}usa|4vSA-gx8kt})m%?>!m->>Gdo%WLjl!RCKk*Q{HRl%zmJe1`F8L`@pyxJKEr(=kY6?al%96!Vj=cNo<;EX zAMY;co#Pzk$NBn&5N3Wx5x>0N&K@no@yL6fD~Zo%zsU7`$qxH|tw>7&yRbv>T23J^ z>Acj}ckeCNCAk8u0ut9MJ7sf~Fz#}(j(`PNlM^ZN{P~rRe>)KWO zPTQT$7tg4!4pwh9ST|w%Jl7PvTa0?E%Dr^7cVnfl-&GglhnvT+dT}{h2Flp^sgtd% z!>pCP-&Cc7onruDxq@b%{=uzVi+bRV%=KG6e@nY*Ex7yD<)*V-vVJCcQ`6?oP09a{ zrfUIbdjJ2YRJw?Y>L|Bzi$oD(My1@NNFtXy=2C<j|6>eEt#l*wAxW%0O z4(Em{wQG;pbAPYe-0;aN7Pam^9`JppuRt1ML$c~sUf;G@E;M7)^sk@VGkGcl$KSfq@$M!N1vYh zr)5IdqAgzT*P^^$)|}nFqxk5$w3_O&=4HaP5yNcgWbxCdapF+UMY@g=79Y zKY1J7cDu;AJT7PKDcQVbyC-7cdg`6N$3Y#<;|q!ff<11}V+OsVeilN6pUe0ku|5$P zkyP56G?9`Vio8}4Ci!@&(yb+L$iMa`F@VfcR_kd|9Ojij{14h+1I;8Fc#bTRC}=WO z%KWVZYzeHv$PwN~kRb__K_^*I@&j;-*6h0*2m*>Jyd~)16foa|Vz3@ZGAk9p&gVb` z@$hJi(+zQ2Gz$;?>^5;tAa(OJe?jUNDH#=@1Ht9-sW@yM=g^4L3MGgCvDgvSvG(;c ziY9_G6&K?i!>#|cZR0-@fv~7QamoVe)zJ=;<@-_P8IyL!pF(SLyoBW1S}LxHeJ>96 zn!A-K8dX#}MdNW1qoRmx?!|wUzwII#-+9ZL36+6k)_M0nD#=UkB8zzIAw&_Wz#48r zoDs3Jh9=|q<4hJ$VQAYQnHzdU-|LB@nt%i-d+8o;eakGrULCn(Aq403__owFSu!km z^Li^5dPoG}W{MO8KC$<#hLsy05W0Pev4 zM&stD|3`TGsVMMvoe z6La+0FXTxz-9zqUBmC*tCaK6Oc&KUyP^xwNCV%+zROb$zNe}+J8>%IrliEGb)m{YA zxZgtUszmfxa^(s{TJ{Yt}0*qe6M;Yv|JBsoyofL>Ncp1;SY$ zs=@_yoQ{OPC^_b6HPm7U0te@x5exM-76ip4Wpz~oeQLqwMHvEHM`*Rp3F3|(Ho%9h zmrVQ)mEJ0T#-rBvaZ?fnxP2p2KX%Uki-KK-*hfR>2%hFmD zOSWlhaGZ2RkeeDKpZDR0dzEWyLkBadBB!%%ojZ1t+gWGc;fXaoEYE#(m$pR1u?Ryk zSgj1a)1uU$)72008(rRYII1q=aXkAhfEuFI1(UE9&=xeozzlk^? zGVQ5cL@9N>h>nV`T0?0{I^I~vA+W6${oJw;Y%8RjQA&ysg*IfNMmD|zurTp>r2Y(mLSBoO6xMqw^!qAT^ADu*u&A1($R#CxY+|!Nw z$#J6A7i`A5KwW8~IAl$P$>G9@??p16W29b0#;VD3X*qPTVP{-eCF^_QAnAElOFn_8A%hLnYl>o8bZw}=C+ zvXH9>0*S3(k=ML(0Y#!sWC6fFC`35-_A(HbKSlx(G%JKrX9jZR4+ugvnZO5t1>L#b zOA)0ng0mv@S09D>aO1ye1D4pfG0`7%I*ay!TLymasuse&zYZW4dQ}-`sK7L5Ob+@G zCGP4bgn?TAXc zlc=*f2`PC{+VjT|Mk*~iDO@sgNz}9ZUfbif*zl|EExF1{cC(fWXJ^;i;-P6YZws@| zc(WniN_@Qj((?OzPb9X_D%~I|&njc#+x^qM9X)!do_kH_x{WUOnNDm7Id z{hFndhJ9D^z^qI2T^-%(PPpwbDgVM{qbELKS~X94OzWJgxubTFT9fJ?u=CHqKciF) z0>Gn23;?Nh1L1-OvuRHsUupT}2d(Q5Xt$~JJ?xa9kzI~oxv4ahL*fP@ccVuzUjE;d zfw!@0S?L9Pf4)AepPl!KqF#3O&82+jv=3#^Z%p?^N2x6;z}Jd9mZg@_YsF5_lESyv;L#8&&~1z7Sut%4i>Ox`=n_NV$xle!pgr0y#XxyyU+ zfIyB1GueBqh3wORqCVy6*I%9XXB-QmW`r!Vr|K0VAT|B}Ld=@ZTEQUIsrQ0gjlugf zI2n4x5M&P_i8B%UFF81i(86z1vW~q#O|nL3#4`mA(uh>+kX*obF7WtZG9jN_()qqSda((Z6n=+a@0#2mLC3P(bZmGEUu`5#;p1xW*GSZ|J}H_} zyjr6J5R8X@tGzmG8IK=F?iZ68$~DmzU#+cot?KQaAT!qVH!$|#iZQs=KSv&+3e-4p z6Izdi`Ovt?T?-O)Xl&&5^S87o$toL1KEPuK@8Vo$owut+>ty9;hgW0QY^yq)hiv_B z4FvR?sHB+gAczQiy}5CEQ4c-2AA?+bXP#&YCnDfiQrjAc65W!&S5D(B`6Od54*QOD7eqh)U!F7EMK?MYFm75mSh31*iS<5@^$ z%DYcwrv)qIWjkP1AACVaBvp3$yqWQF{-(oF=QjNRD{XC@-41}-`lNBNS_a%qTDTf= z&ZIa0qD?29*7|PIxuG2d_)6G6KwwX1iH!s0Y}Rqw!7jte$LY@i(LU?>Sr}oIRG{fR zbxL!m0Vsw4J*1L`RMMSs!Q~g{S2_hmdpqRtNMbSjXd2T0T+;YR8P4UfmR$9`w__(L zwhLG*K17iRF7_pdyO;H>pDy-sw(OdYwfgp~>d?^M!^1hAwU+pR6qp6;w#|L7T|GGJ zQf=U1n%8xv?yI$|kDui8QUb+KNy|+QR`tIryu8YHc#!RK^+Xo0)q6gQv6DY|l=FST ziulQn6g&!-qb^liaWc1|(s)NlDIcJ+ysPSMc&xDAvQ`WL+T4n~_~Xsk4G^4GUdYic z2Rl|hcp(40{ldjZ=wDSYQqJs}fnBZl#Yz#y@5FOtAg?6HJaKAvY_DelqGb6-nE>Lh zZV41QHpmbnXw?Sk{2YMyLHpsYclL%IO|=(03v)r?Sbz%4wJl~+%x4P!B8u}-0F5e^ z8$Sh2d0K~91d!q`9pv|VEQzL!`{5pYxH`k#8%ZLBi!IAyTV@I`M_hCXBz7Q2C8rit zV1ci;XBy(i;}jCek{`gfssqwP@=AbVi<-*^|MCT3AGJ90?gDDJpnh8VYW++*IfPs^ zi6e4A$|NCt5bsrVP>@lH+H&8^Ly&fdqWfAcdUwb>flulMiThC6E;i&vurWd>5hLTi z0PW~z6W+!u1?~4lL{RVdpr;mA`kWuYjJ8R%C|cZ0C1jE9D>{1;*^#88Cq3fgwx zRqYcURf|k#P4dp*-h2>L0RFOpbX3WT4c?|HpcmRwx9h2vfsbX?VAsvPwuhTj>Im!3 zzOM>vyi;?oCZ_`NX43|b+53BVUtn%2fsCIDPAPoqIS-zN^sBWFSsQ%l-_BJ}KdhZ4 z_TUe*_236Z=Z1No{8#m|$RBUxD>Qq8N7Fm=c%<;w%%SMbCjtK}&7|89)}}rO11*UP ztHy2%KBl}AOj~RKr)Ac%cF2H6G`fskw{m8qOCV98FwCRv2pR16c?D$CL@uz50J-~r zP&H`4#06dOoo-nwbgE^S1{_1N{;Sqg%G^Fr|BtMY7Lv=v+PnWTOknHmKu9Cpo^~pjrH@$H4sO*=SFNj)XJZsBfbOd)Htnn8t{cnmEN^64TCDV_)E2u?3~ba`2UN>GzTEj#Wm60+wx$~J$q zeD$7{r_ypgmTa^65 z*!ZB%DZC{ZVh#aM34}G6V!s_m>OQjG8k%9yYdPqj!XR9qLt!CR6Q%o3^@I zDUK=G|M=k4_tUdltupDLT zj`LxjdqnJwsim=r&Sx+qsqbjYsZXzI&&Rl_^31J9#}WB1_V8_2O;42a%j7oTx{W}d zW{*NCN#FQ%P;}Xed?gb7z+_aCmrP!^O?3im#^f-w_)`_AYSO^yGV6i|ZzB(l+)BI- zvT}CM=nOthYi>AeRh^t_g}GEK$*j6Uc@)UVCu$DXZ-IqlCawt4`Yu!oAjx-CrUWagrkRgM3jCHQ-PHvI22pDafL!Ap=aW*=`H46uRms z+#)7|v&)iM=8o2cRX2|%De`}Qy`oUlPz0T9MR<1ojz z$+7{l03C=5peSVt8t0{LK>6A1N)zV!+ml)8K=XXTq0soL1V>jS2P0j84Bn9eagJ-J zqkyyWYTABo`vwZOOI`BkHTcBcUBL6I{y#&eIM@*s>Jqy_<7|jQ)-*^Vx2esm0GojO zeNiap=Yfrow47g=|H+vguxoQ+aXU}wB09IGj2Y$0Bt+_f{!j4XrLQ(G%tCDk=PM41 zS_{r`zclM4!>=uGVmeR`L&&=MIRGFOi=k!}$WNZhi_1s>GG6b}HoC^=bFRWZV@y#eI-!eU<}^ZPT9H0q9W5|K#lpA3r{$ zHhl~bzT^N#mgxyv3g@>6{h=hV$$$o8ke{YAc-j$^>g~EmUwG*L#Kz+BRI22CaUsJ- zFSzYJDdJ5~I!q8}>NiDnHBC(14u5;*Zgt1W;oXHM~nfh z6)CJ0G$`3Ibw6P9cz~>mG5;@G>OVuC|EhMf37{VV*~sB}Gyp#~IMQ3mAUreGRvh$5 z9uec%K#dWuytRAj^DVc}mM%rSB^h?h%)Ho21A@7G!$jOr-;t$8f6ks|V)#Fq*i{)n2M(Z>$p6$p=h&Fa7gyoDk{c8Uo# z43viaSAEt6t)(xTnI%1;nI7!!Q5!yEuDTh+@ebZiIoy#BGignNVc@|U-F{PMMpWb` zycxD*WmCg|$3fzLWrMkJ7Nd5g{>$cL{REwp1LJ?9 za||Bu#3x)$J_!yqV|aEN%5yJLgrz~%he0B0kGC%&Mpl(&?8S#?@^>@6hgdDIDpGd$ z00MRa%hO@i5V5e;f15Zh{aq=%CbE}OdRHNnj)z`TC2Sw)H2WJ#1Y%w{${ZgU2ex!0 z507#{l;GSu;M$9TfQwiu^8i?U*LdXrv~56z4x$K%s!xHLYz@2-Kn^U42`=cKu#OQh zJOhrL+{%#vaV8Ct%-Ey)kC6ZLlkW%1e2Z~a=Kv|~Fwh^ek>F5YNFPk72ldAw1}OtT z(@|jj(NiCbts@7^*$Zv29vwf!0-3*W!>xh8a;tDJX&T(|zu+zIMN_hYiT{HSIrUbxIE+h9Ja1oBikZqvBnh&ncs ztTBzVuyL)sr+G*YJAU)s}SnE!G<>6gg*$YYc!ZaF~4 zdGEYZl}Qa3yZMj#;ZX^8w9KCM#K=x<4?)UYBJjpU^PbT?+wEs!7|IF?&Q%L0i9VJq zmIVj$S83<|$UHf#w9)(N%J8X%!*!oWGfo{(licS`RQqb6{#3yeUP3stT!8*L%pj}5 z2bC4hF6h>P*tkRlgMi3JIeHoATLLU-dG>Xm2=YMfm(C!39~Dfo-<#XmN#ou zBI+ zgMsnlwnUVYlJ)ssnnk(+j=0UhuR&KOphm0@V1jn+xXAE^rD>)q?HVYkk{mT9>ebmXOzO!M+;15`VwOdH7GH z)z|{3@WU4pVAzAl%7bm;m`UlEl(qohiQYrqhKC5<-<;pV@6t#JsG7{4Y3TYCoJt@ina1NfSJrJU5d57mib9r>E0T(h>d zX!!@tRjE5O=L=kIc7j_*r^_9;-}%6-lIgYI4sj2qoH?cYX510YDuWBK_qu5@O%@9z znu$(-);*Zaj4!~XSaX`4Dg!%KnG7Mig|+qXo|Y4a!w()iDm~M#TzYO>3$h*Y&{|ej z783FlNiS!Yl=Qct&(^cByf49;J)kSpUG+uXu(j%Z%4JTlkhC4PY6)buNU*?;aX_*j zkW2KvaROpfkbrF%MC{YfQDN8EJzOHT&LX{DC}-x@u?C|+W5=5-T^9-1gjLp=dZ)#O zyR4&Ih0W=~r4NDazmQXLs1mRh-ULaYa zYM_gqkcrV?fn2mTBNUW^tYtxO)k#s2Y6DatAN1J#ffJutnidXTs$vHjz_YGrL2`Lb zR7HGDubtZ+ppL>tZLVV(Oe+mgLEM%@BlVWNOl8JPz`nwjtugF2T@)iH@~(De#*Kz) z;2|0ZB$Fz~wjmkB?Y{LWIorrx1&O0zv1pvu#ch80{jcH2)VtT@`@BX7ET=H-!Z?)3`_ z{GK{mzFN2Xq9+5Y)-Bo57k6RLLac5lBBD7c`_QLJ)2t~iX|={=l@v^zE#>1c|| zSO`8se1n@HtG9x9X?0-r%tKbmh~~q2<&mGhyur%wMUF`d;02h;V>gJ>Q6D zYn(gDIPcDBd28lWY!i|?ou(=Si_{L{HrOb2d^1bEyH(5h^X(qZcGV(Q zH{8T&CZIHWER8b3=CGV{&Y1L3r+ek;aaDs~i@l|v5L%f-6mS!~j>Wccna63nM&Z~U z^J5!pZU#t=yQgIq81Xs`mB+dUuhD)#{2ROf z-duy*w$zp2$xw>bKDHEm`ls@~$kN&Tw6@S zjK;~T^wa}e^LXrspKE{5z4#n1^KI=&L9O>x$K7Jgl8UQcMRtwMWmht%F52h!-- zYx8vUU%Qu@R&^?J&-8(xGe3pD@*_v#HEZW!>^ecx0I4&DzRdLO%cS?2p% zt#|p)R)h&&hl`aDgOQ;GG09=7DG7dKP4Weas1THq`)|2|(&dkansjYK^XYN6f4+;V z3B2$Qj(aoxpvy2RBKS4F=9w1d1b;uEQ5=(LopweJ6MC6rCYCsQg*f{MTo(Zhv9{opW*UaG|w5wF^ zY`Wds&~s7EkovVr+fY+yG#9$d%5(9;FvNcS6khM@yfBORtav z)MtZ**@pTn+vOQY>WJ7Y6!vtzH?wo8M>uyNXGlB8Rp}Ln$J7SlHQ?euO$NIv^vK?F zp#28lDy98!R|T?ytul5y%V9S4iAZpL7jqoJS?7b_9;8;XLrNp`nQhL8n0^^F2s?xU zoNlkcdWcV{{`B`E2Zk#Ze#r*dOqNo z@LAsS`?52&z}J61GE&=+4Fyhx27{ro*qvZy_IQ}EYImcOW(QJ>!SZknu>k}!M97}) zgI+rd-Wk2(wneA#06oTs81~QlNxpm45q1p&K!db+6s=k{6Q4zcWq8aBhBjX8jss;n{D4DhO;cK#zM7N5*-meY~{# zHOCo$DV@I5n=0Ms8}@&~m>lj{2-anX4Q|_At^c2DE*2X=4BL4r33HgS4dbPn!bVSh zgA_#6%cQW3$|bgm^8tE}0gSR92I^wn3wA1Rh2xSt{U;p9a{K72$u<#CH?BXLy3sbE~=x9!fsmk+$5^gZ|bO1_B(~PL-%7-(gwddrrex zp8840C}R@$ypGNImwg1J;N%_jj}>cpCGfb01WZ#tq5xs!;M3vlW86_r3+N2N>Kktq zm%xoDq*cgt22*|jiY;{mC@fw?I0Fjr4!~d$3#XW`Y5h#vYiQ7>ye+>xu`ZXv-f{kF zqnK=GM&I)Ljmgt_V3q-w&8s1N`Cpi-#;##B&MGH9$fOT!K2ZSCJ&_6nKNd@7>nz@Z zI+wZy4#_xAKMsmujh@t~n`GvW8I^BX@!FB{)hIFX(J#5fp8*E2{bptP%+4Oq(xuhl2MCu&eF+on5erqH9};JYzfzrCI^eZC&U;FtXX- zu5GmoB5#&3uY#Z$0{s8@q{~YWyd4jn1W{9(% zzyc9cPL0?rm?v(OiY?;CEW#$}aaZ8Hkt_yU{T?JFvW@ZcEieR*E`2>ycKv`c8w5B% zMq+?>O>M+NZN5bhdOQOlqQQyL)<4^vK_yG8DhMkEYqT5HMyw}ei;LNZ#$zqTzSw6c z+0{G5@#nyA#(sT(Pm0dUB<~Xhk|b<|wr?htIFtM{;yz5vrUi-1ew8#*t%pY3-5*Tc zotNSe*k0@>%$+)inn|V5MrxFNC$N7e7klx~&&M`Gl8}wbcRIGrgTOKM5x-`sr^09= zMq@N1ydz0yd1y3?vN>7eXyy-7&GRb$mXxT>C53;q3qFHy-a{r-&U zfI{6D=`!D-K`lYjMeLxzPuI&>e-=!)?zi%fLH^59E#&4mBH#F&w!vGL~VBI1D8}lqVf^{tT>F+sNnqvCqdI*%&2ZRhec8||SE~y-U3sjoih%3sq@)fee!QuCFju5N)1h($AY zL#NV^Rmle0aMg(B-CjiF){8d-{40QzF5W=ZecQ)+Z0d8#$_4e!-ylvp1oMi=hx_I`5SIsuVVZRuMOSPqL zoeBOx9N|uYvIeEE0t&59!Z|*0upBmfK>iqu*lr2F1Ldt(IujCKKSZt~%dcn9;>}6S z7LImu1Mh>Sa~TITWR;tH2NSE?$)K*K9Du2hf_)_LKu+yuO;&sbq?P|^=`WCDF7$_h z!oU6yU@n^i=qZQS88I4x@y&3Eyr|vjMtK_u?B}n>))^a#tQtoU{~(4|Ipawa4_C1O zrB&o#H@rzoEWr$kO_mqHjL+frKS(ScIW6O;KGyPcv9=9llLBR#INAmDL|t;bBv#K$ zPPaJga`aA9n?b2Yos=P`2QCxjxBUW$6WO*;Oc-1c{_NN94G&=Aj5&VIv>fpK1T}Io zobwG?wjkp~HFzBQ0xa}rD|ku?5Oszmx`7w+X%*l&51JNr3m55S*90p2d1eCH@x(JN znw@!b*?TSCG));r+dM)wULiOdTH?6qY?kaYDH|R#m7+sK+!^_M0-^3#mCR9PdP=+9 z4A?gs72=fiug#u0X2qN++8O|%mj}W^vjUZ-ksD%lOY(t%6D-z$fq42l#AUTaNvZ%; zZv34D=-|Z-cR~n;3YMquf=N4dLmDPgS@Gb7Er`{>=Dm)ME9?g^4a0)l_5k;{?j>Bd zfl%x6&%+NEfXZHR3w>1bsY9NtH2w{LkY$}DrI`s+-^Gav33cppPKYvB&AMAGiN6AocRF>@WbTv^#jD9gkX3&sbfKEAD5DD(%r6Zt5f8U0UqJ+%{AyB=$j@kW=Q=|e;G;1rf#Sx4Z5F4x~}&GdFyRJ+2_io`+-Efm+`QBy$gX8@5TFcWi=wf zOeG_aXPg#J#K%0{!>j`AZao4oMvwlSDeDc6J0;7Io9^ZT_bLa%k2pu8?Ifq9pxTP)DGy_Ct`P{I9Kg3{=u}z(6R=@K*+V&pE zSEoPL@Kf55S=F@frmg{fadE%~%JTgE`gn&vAg#VYA(~ah?F4#z7~EF6;FxL-!tS(x z%oXf0I{=m%rj@4YaMNeHf~{4k3ucumQd3q2B@cDDZt5nUM&*af5mB~Ai5Kkg@ATCJ zYG_jiG-wu8SITp(i9F; zfZ&@5zYQb?m){&LmMcr%Nloe&;6Luk&EmOi)|4bTK?t4`p}^=8Rr8)-91=5>Zw zXiumWI$pBre;LR%L$oW6*3KdcETXY95y*6mO@OI`` zl!eDzpsLqAzbbr_=GBu1#RU%DL|SPM+cVeOc9#s7zluq9tdFy~?uOB2U4w}A3rk{r z=m;yzj+xZVv#$*v+^fGhvZT*kXVsp4Si&j}lTi zs%3ttRV&V@(rienOmXZCBd>e(XCH5f!xs_(@#fdqEXONyAo`-n*s#$xPAl-ZWy4!F zFH+V&XLUCx4i!8S>}g_foJesxtL&RyfEF9tCcFkzNZW;zp7@yrhyw_dOkc%Lb*0HH zx0RWW=@vs`PPuBZ8GQ+>5jkO5y&z)Q=k{CbT5a^{y%6@L`nJmrdMC^M_FV^gL542; zMvtjlIX<$E_88{SfS7j-@(b);yL!Kr&5U`$|BxS#_n5ky7amv5Tqu;|pPa7h<9oE& zPn&Dr`vCPV;V83NO>^(^F1NJlEr0WhtopX-Pt4>uA~mw+n&9nD%>uQhM|&#@$G&-8 zP>(Lpk2B;n|MMg~Pad0Jt-%(h;+STN1+h*6_4u7}$s>KEzHhnd#4Q>}>@Vp}O`~GV z*S4c~1TR?h60&3ULa?cyytvZe3p)O~_-b6a@4zQ?jp~}^!QY5yzZ@Dc z(7&;ej_w}fntP)LXxzmNA15m%DUp1{%IYt{TzlwnQ%{Bc7Io{TAyh#refS;iAe2Ae ztpsU#Y0_LOlJ3kId8Re!?duS@RK;HwRO`rltBUf!EO&H-Zq1V|?~~trYVzH94QlI- z>DJIo{;DoDSbBNud?xG!R(AQ=nm3-fj^l51S!zv1EN;=Ph>87rTbppB`{>xdC_Q>> zylgm|0V+=-YCOJpOmVj%TBNq0bjai*h0pyFx){02<{Wj6ciD zLlZmN-s;VrDx{5A2l_8q;4(+ozA{jxWZ`}C#`Tr+!oMb$Rg$T)88aK3=zTJxahbMQ z?S|${aH7dB*wFZBrS+lT1Wy<$$7E>y(V4g{A@RMesT9ezmBNXMKN_gtR{Ks`8_7RF z`cbe;C_D33Jrhy{fBa%{23%x0o@V_(6iivFN^U#zP;x;cYe!&w6_`vuwGTGq+a21u8rm6CGa@4)g5C~N%8>nV=S3pdxSX)A z80=7@dM#i|Av6|2r%V}h?OvK2r#?UHr9ZOG?JeWXd%l-bP0+yo=E9kO=(fz*k>#@s zYb5SL9E_X%a`^F*@@MZQ{qCy5VA0E*TYBdq@6^c5{+6%%Fk?K=deyA5B}n%;-s+*& zQP>*_^7m=&rFsN&Jw2W0l-tZxajNgLcILq_|B(2%xgW69rO}&LD5mnmoGN8IFvb0R zdHM7UUI=PcHEyDWCGsO&DrLpFqKFddyv6WUjqEPuYzVQBXExTtyC#y!;9qN-27=*^ z1c+1pi`Ip#Ze&hKY3~|DWa5q@BBtqNmOO;xt-)3vh|mW}t}OouC!&s~nH?7Qy?lz_ z=A(avql_$uXmEe z8(fcZ7G9Gx`JPSSOGUo3>zMY(IvQ*a%4mAn+#1?VK_o=ua_Gwa2`iR_erQX)$HV5vYnr4v3jJpE+w!X$mj2o(& zczb9$`P0-hhat1_$Rg&&l||SDlM$8WJ2HDGFM^&Mupe{H>JS~LJF@2_i(E!%pDZI7 zAKXkn@Cm}NTv2K|7Rdied#l|UrYG|&Upcb$b{Ft^#6w1|XvDk9G+jd%8~OonlSfaS zQr)F46nZn-CwUdEF*iHWtX(wWKaPXy%WN^h#PRZFM|!Yz6eqMjzmAclDbb;D97Oha zD>!ZPUxLUqx=AlZ!p)Q-J!2KJ7gp0$oir0S645$yzvkEFDi!Ef^HsX?f?4MFC&&WQ zU5jrO=##O>t)C&f!rF0Mh39M6^(WuOgwDMU{UDtD6O*<0oZs;+yO23@0V~+dj5=-& zsUWSc8FLk!ta_di>PDP$W!ue#$BC-e0T^Q;%ujC8^WXh0=qh?>X|I5Esyd(GP>OL= zZ#?hzQ7-bnSC7^b;_|)=1+8!PlNqxL!ji2u-!j*N z)MYYFd+5qGm4ltjubRD8+mvl?XYjH^e5(8)8m#$yU*fdCYs;_O+;Uf6kfgOWI<{A) z^)&MmVvj63ZIa`Oo^&DCum32p?U7!9LE>eK*U^Ojbl&CKI99aIURnNe4c5))QaWT- zD+ecjQ~uKkUZ|j*1!x4pp=K@mmW{5>Ofh{{^YG684R!iW9$Wk%2Oq5N@4p3F?OtZ+ zZ?DWeGwnUlb*|j+V$(u81i;2)ID26+s2nMV>=hgV1%vHb{3eFiAQgaGrLr6mG>-4f{Q6$bFao>BByg&{PN9ViWKZR-g@5*6*e@FF%LfMNClQd)Wc--;5pEZ<)BF z(R1{b?)vGS?OtD#h&w3hx{?drcS1-2XoU zrA$>(3cW4>=X>TM>yOIZ+IRza1p1>bj-MEWVIJO=9=UiImGgO)BQz2wsE``lm=jv} zf3h&UM)NRmwOE7W@%P!7zZ*`AaEJ?+D;7MmQ{G&+uA!>~iOtY8n;!3hk4HT5zFyCI zasJBw5f1n4k>08c%dhZfr{+I-;K9p5Gs}kQ_=1Og{>8xfi+S$vh=rT_ zS+f+Gn4HharLq0qM~nPce=_o9CMDjWKS1X<%-_U?S@$@~@=F34%1)os$+4$hcc5~^ zvb2Qio{dGp*3(JJr8u7t<$i&c4pX-f53f)QgSq|sCnp`t{f0aneFBqKv``)=5cMWH z#biB}{aBJMYIV0OWIAb4e=!|{Da9P0#(lO0-uH#q7%fhOSZ%n`i8K?7%0W7PuO&M+ z86dxL_6tgaMON^$ZuGfy$Xj_oNM7lPs@;au zMkd?@RCoaNM_#MU=fj=^aM;_;t+~@1)JakJ!p@LuPX!b_102!8q5aW-#)w zF`gIU)&pkdt60P24ug9+63`ZgS!5yFL*JdA&>b~EmXv9aRWX??-RNfW^KEDkv-QGm zxsgu-*|zjC7cdUR@FmX^hq-soJg!_qA5VN9V?>)aK{cOmwY7SDnpprP0iK zuJt9n-9zy_vmVf|oukk3u1*^>)HmbcG{F|bi9V76`ky+S{W6|q^0Pw%BC!q)c2+&p zOZsE$F1caJCG3d0XO1Lpo&K-+FM5H+Qk5C#N17aJI-t0Rw1gP{M(p!CeUC;$L>45A zzvjX}G6EP6P0q@AnO~RUCkT)T2KhyHK|PPDKERxurn~T)ytnv~3&OctLfMjVy*_?V zRE}qpZ1*JPO z*1WT1#KuE=zLcGT$ee{l5bJc=;QembclAiH$*=?>(^7KaZq)S!DYN>Y0TmM>e6 zS>2=uO!z3(o*c!k3yX4U0=nm3M;3LM4+ifv+g88TD7hn#o~tQix1j5!i~-?kB}#)$ zu8_3=H|*lEL!k%Ntu;8uonzkl)HE~X6n?yc&yS61q6F&YKfH`Wri_1 zrZ zn}|FSZ>DslyK+r2K&wX;=D~?Ci#T68BoCoT*Ln(-p^JU9etr(Pe;DU6IsT$c);%M* zTZ69@HfA`Drii5cy02JoRqzA!1P>}aES?K4_VpUw9BEhCE3C4P$>~LQ@ zF1TGf4U!tV!I36f{A4&!;T6>(d->VHaT7js;j5}p*qvs0)iAp148(Kv!c8@Mq>@y zZ&K9Sm&Tf!-Z0r9gq@MET0;K_-bpLmBvg`4XOEaOlrE+XTHWjBrjfqjIAOb!Jo5xG zN{SAJddx$5_fEV*88 zU?snX1IIdx6kJ`xQhuN4Oof5-7p()f)fpHh=7?byUzA(IVv$+A4rg)+$kTGbg=Ky4 zDq$_aR;wxDtJQ0+c!&C#b)+2saufK7Cz6O5TPK>1DLIjf!u4eNp6?Lz03$M;OxlLR z!bP4XY`+g)+n1M=P&oLY_?NibP#QS+e)zQaegU#ss)QXgO@APsD7w~`&t3!DDL``f z=NI>4H91bkiTmL5vBz`6OR->a^(}y8@M{N~XTuqvRy_&+TQHnU4dpj`y}E=X$;jat z{`#$6PNrZnR=9CHDmSvDN@#L~W4}$*E3xg=nHPM;aL4ALZF*mm7V=K6nQQy)Y03K+ zHku)*O!O_C|8jbp4;|u(+mvnU#%dbB2e%$V{3<~mYrPSxnUjB!rC`#~_J!1PbHtzC znb6($ArBftaQ!?B&2EN{u!6Ult)k1B3XukAWPBM?kWG9ZQ}zBMI!kiFF}XBrCln_o zFbz^lUc6_mv4$$@K0-~UM74*iac?gE8m-PiI9?82s%nb~T`?BeI)-3Jg9f%Np^fkl zn=Gy^2SctN7~8639oq+5r=kNNPh zhK|I%QtqQWj`H*&g8$5S$3K_#KhItWOqxYRm>)JVF$+@K>5z{?Pnq1BMRdzTm2kc< zl{J-jKyTA{CP9371S-GlXIDCeE!<+?K4Bs+gfF3go9u?o7+GvL%YLCaV7B(>_*}!E z!k=1jY-NDVk*3NuFR88>-Q?}t=eEjyGq=VaKbh)Hll@^ zhX&CeOtkhj-cE!7ni}Nu%_VvoC!Oc_N-;AnCbi=EnI2v8a8B|~pH*2Bth#i#;A*e; zp*Cgf2n?&7vQ*GJvb5KuwlADq5X?2yKY9}nu#rXrmMZ2O{J=P3&urnRiY&hZtH0U0GuR2(3tu3S zcjsLMp7m{^h71>gAuMlPzmOB1tmyQ?!1G^gzV5fWlY`&_OE%tm4KK6f3A~^($N1sg zGPrDTCL6ek(5xj5f1rjS)AajKBbo5Z@;Z-we;cWd9YJ4FCSQ?JtRfBNeON$K!i(v3c7Uma0 zz-7%6#@EqveV2rhXU&EX1Nlwu4P8v&q@YhEM1&ECn{L+AH#cLH; zw*_M+!#BG7B*EWN;IyFt-R6E_*7)TRjD=&%X#Q5u12?OZltYI+RzwQOEBQkNC* z0pP$P9ISRdItll@2qMz>bCG_eYw5$A+c*;}KP`ms}){gWEi$eT0DqPUB@}5oD zv^{k3)b($kw+;4wpEA$C+;Oh4>C&{h+mrAdZw40!_j>y4k#eUl@+@KYIs?MI^p?^0 z3cCY|3(R^I)3T4})i=xgk8S{XV?rj+tcUK0aaV1t>RQ^A#oOjn4=(FbCIDZ|`ssg~ z+-p2FSrLtEDEL^_3m#1{g^!8Ag@`2lUr!@j$!k99fRQ^f)}oakGRWZ_;S^0Hwb-p| zf^81O&>{{mE=M0pq=rM@V_0YuIVWU)7Yy=e@Z?yFy#^Z`M&*1iXQRw@O}o zr|H71D)&?R5RTbcjH&go0wYLcQKaa&pBz6sO!U|0=&mE|(3xBEIpJVwG@DNPruYC{ z#@S)k)3~qOP%DwQK2@55>f9XjSGh;Z{ldGjLeeTgMflm_7GS#mKbF2do(cW`|8$WP z%I6%)adJ7Qat}okbLnzQp%Inj(#4n}Wb9&C>Xefl`(A3;YsM3A?$$g;n~hH)e@R`&|M;l~Rc1Ct z{KsjN=yoq!wS1y1(?F!hKWw*43>zORAFvM$H~YdTjm-mX{<-jj!uLsz5M-I7GSXqO zsSA%sfyK;k%MU+Fi&p6C)v3`;#Xd?4sXc04}qW1mABZPNOUpvW|QG7e6wzdv*@NYpNG^LKJD>k%)D zlufp%AzZT&@gq&$h@EFs4g^ce3*%W9>py-uT~BeTLcgBLIs&=0H3c+#@mH~HP3rzF zg|GNOqE>dMT+EvYaXi=RXg8~6F|r1wzaO8jVKs#GQz|*7NyK^gGPa zlwMJY<8fpu&P;Hik!NFoJurHJ*M;T0s4s3~;C6b)KZcxG_b8h_8&ty?54M?VjcI*uZgJ#ogs349{s>87eBgf8w$RI)>6}B6ZA7q(&*= z{4IOLGpiQ(l)Zi~Ut_bE?Q-VUex&J-b~fxSe>=!8yO#QRB?{RYvsF@G63nv~)H!U^ zgJcQHf)#Ctpr>Tdise#Q!d~~+xa0f)bRD}Ut^EQ3=e;1TI40q-#G|nU*5%|e^1qFO zw^$ZGwKTgf&b~X4q%Oc@sU#s6E0Up2sCdIHWz-l8z&{f+^O6^#*7B<+T^!XwT3fl=UD z6Yk}@Y@w6J5I^wXO3DCUpZ#*hq9T7w!;NiavPVH1_teVKT}he*bj5O9t1F4Y`%GCt zIgT&j4ay*^Ycm!r^bC>VBxWet&pN}4zP}`@iJWAFuEO6TTkzN_!}QDk&o*;@eN{9i zR;HS#1&k?>JF^#Kz52ra7IylM?wRQ>QOjB^xw}k3n`68hx$|2BiPCGFFH3!3H6(Fw z%Mm}=s1Ev|NaZ!RJrp59sp+jv;CME(uhOZitv-3hg^MY|DyKNL=Z8^wOgP;LK7n)3 z)@XC$XvGAL&O}~sLqsX2syZX0&wLlP(#3^a*yZC>t=7%F+xKDo9j_Vv#Ke_*+|Tz{ zZ^zLW*Wm0zX~u-x2j&%#NH@epcW(`C*ef+ zpLNIpnEku9JR==t3%h9gw#Eig{HN*psls9=sYrL{)ScB$nhMc}O7eQcdsTUUa|)+W zITfnvyk885&5t;`a?^bU?SI?CO@~~F!deB$rT3TJt4B`B0z4W@{tDMvXfZooFusT!RqA~ zK6(L;na+CH2IulC27~^3p2O79ix!5=Kzv`#nzgslK2O0`{jtDsP&j=P0rI8dLCmXU zSK{E`V3j?I1=}y-?JZ3+)*BeOV=gof-qJK;1-?>IzcUI?tyJsp)3DtCE z8)@A9K=wPZ&A#<*4j5SL+Z%gqC{y^j`f!DNvq4l5*4w-!1AspI8p3w4QH;|{Wt&Xd zZz9~lNafpts>ywFQ))L`9TK$jEOWiJ00~F4RrERMo1IMHu1o8Gl(RKmn^;4Zwk!0^ zN)$eJH%nd+u?&9a5KvxAZK1Zn|eVF{HCY zoyn2rG;L`*J}ZhL^uzni2I?1XwRM2{4D*p7{iN#Z!)4Z<&To>hI96fCovVP{ zR=a*R?G-CDT7t?rrW{t_G)>WQ(^2O*g#6-QBax2sralh%)>8s@{tR|i$1AZcJK538 zm@TW04_Xpi>hOi6-aS2wA64}|g^L#^uE`*>>|-_#-S=(A1Js#? z=YwAw^!@^;O(zVn0KgfB?aJIs#$$6?h~ZGYxE4?c+!HJxWzomDa8OH_&=k+({sorU zTg7CF1QTTQOY@GTun?REqK;RU=Mox1tJhYaaHE|f3M@4^gB>^Fw34O2CeH$plF5li zd>G~BO?Q3B!)O!vv~P#(84wd<Aq_ z4bPnM)6rI+)(at~oPZejtx8L-Z&d3JjO~WK;r^7#J3nmcyn-XnKTDlg1y;crND%4a|QaZJxzhi}Uka6pYv{-zzC!oWAlY#zOgMkX{Q9voUcDyVa+5XK;XHk#LVOqnu z#JAH+jba~<))2zha8K{*pu;`@j>M^67sgm}%HUMe-U^&*1Q<=AoJxr|{d%j2>{4bE zDo%+dsLLKM28U`K#-=LwM2d2yw<AY!}ob`?9tJIO%MH7%1eatQ4{LJ8m{FisES;xIOvj)6&`2NR&JfUsqvRcA+ z8WT<{fJMF=;~fv*w~S78;`yfSlZvO`-nW^U?nfV3jJv+B0DhfvUzyYJBi*w*?PvBV zg@vE6tonvfbrMC>_;n`d!p!pG4{s8;UBk>PCZ^h z`z05^7-!m3q7Q9f|Jk^2)>cvvlny%&j78T`?1!oYu~tJn&8Oo8tJBXt>QHfiyvYx( zu(D`#$q)cKcTn&(;S;z(s1mEx2syKLp$=%Do-fETP}jzSdC65PUFWz@K$eu1To5(^ z4*Q1w>cqzj5V6KqeO6aqSeLEln)|K1$ecQRx2BHowV&Fe2L+gS+7Gbzkj;QQnnz{| zZ@4y>z-kP}%Yp&O*@N`c6CYHPGAg6YN#ib49AkFifW7EWP93ExYZJ0(4GJhN(m3Xo zt8YtA9p3L%)^=qSKFVpzUxcV}L1hYT=lubDE64bw$Ku?lpk-JB(s6*C|Hr0}9j6-KdE z&OP$-T7omCmL{n_^_?;OJ@yaH;187Xslw5{n&lSbwk`ZP$mLM+{g~Y{yE)oxo5lSf zJ$w(gp58%}$%Tm2J!4if4q&U+cqU7&X%s-g0cvlYY!5% zta}vKdQ{dzbbqxT>5q_rr0GYJmQd*_tP>LoVX<^i2S&XBFg!7$DMMf})Vfd<$rS3d z1d1N#n{%iV$C&}Y5o$LKJL2TQ2Urg?r4oqu!19f4p)A}6Q0Ps3vTIXG#0V9+h{sKQ zi~?@x!%VuaGYu&9CQ{z9MPVcJ5?C7vAWq+(e)7B0i1SjGI>isiKB*YTohGrO6TvnN zTR?yTd~Uk(k;N2!7A)AC+?wkv0R@Z7kFqY4y|SBMzlpHS5w@buGlX`tbonF##5m?` zVuX38jM-^BPdCdDE_gm}K=YQhJ%t9l0SQn(-s^zMlLMeU^nhOlTjM)kSOGlRnIhSF zviVUaIq?ySDQI;=qjZohE}K%%O1HYTur68#eb&A<7N;X2H1cq;ctdQtOAlEo`ED+N^|Nr=}%aV1plIYUVk#c|BuqU3~x~Y0R?7SkBPW*c$ zd?y*e;v~_I?BoIR?0bFcQ_I9zGj9en}0Dk|}J#I>wvz;2-XLP-weHyaymEFW>ROKia6LSQKO7%9-IeBS;*|u``8H>eh zkGM{+76*8QcI1op7}Bwil%m~}zBaNv7ydRH!i7#EuC}KbA?bFV)oOxr->ZFU0gs$r}^o-)#So5w`66gnEon!h7LN~S;F*g8_ z#ls7H8)|T0i>&#-wlq-yggPi7H?bGOHn>H4<1m@^2AO%U4zJGwLREDE_zo*JKu6sG zA{qvWtSHE9PeBU_;5*>8OD0ehw2;80{&KstE$1CL{z^Sa<}^SCAZ%B z{kt8tO-=r!A%Oqo!}ylG$hKDxNUYfuAeIAoWo78qq&mDKA*qfs#%nDFI#lfV?Rk#z z_)FF2#vY9(tr3h2;V92v2}OwTYL4KYmBx%|gW{B*_ultdCchdey$N8&g`8_qMvmDN z&>9SzGY?2Du9T5$%YMh(!EK^@;M=^^Vw36!Ia5e_NT!ae zj%kJQ_s8qn)CiV5~AHwCe<1UB-r+}-ean;A??YjrNuuspY@AHCgH2tJ@L{<-o zr?tkSq{W_0#Zlgzoq~Hd)>1LX&c;2)Cq&4*mT2V$27Nz*tw=ea(xs?Jl+J0rkn=iv zs2un{!>-4w@DPqG!7Sx(&R-5ET8lyt3j?cZPI`~$7wV#;3^-{jkrJ@z##Ph1_8TI@ z%N|0OJ>ll1KKqPVeN8xj`yoaV!x;)))g)r|iw=+8`BUL7xfMDZ|NJVlG80*=Z`|k}_K9J8&{2%L_LdX05dbH#>xY&Ld z$BdzFNTDQdIn~5?;#873r)O!{Fys)zjJKL``f%~|rZC}4IdSqK*L}pAJ~B{{IX67S zUV#~nUhlE)_ASq$Mmy{)xn}**TS=-AVc)saxnEepjE-Sz2$1>O$p`!W&%Nmgd_keq z0GVY);4}Q4KoWbTRRy3eLhTGeKV1@2=O=CCI|1fO_8l~Gw!l_Cwd0%t;rhZ4kh}7Z z&YMRPLPzAYj3q#LKzqjb0Ra+tmKBgsV0eL%z@!sx5s#7+ykSnxdoHH~`bCnZi$ z0Rb>T@i#?epopIHV2B4lVQXxHy?i_NBHV9J5wa; z&%{!0JuGK$ugbN#BxxCZPr}DIZDIss%_e7Eb-mB!xu71npdhPID5^#e&dsGtZ59(+ z(5mPMZ)ZsMZ6oADrUtCpwcUxFiT=gTa287+?rCitblg_tCye1A%o08N90xmXxv(Vi zYZJBT;(1krjvI5XqYI3Dii|V)wats3@Dfre)nGwp+f!U|UQ1!i*eud9Z=t=d?BCld z9R2o$Y}EObqlOXOiS}4kOT~PA0!p7{S3l=i9$lc_?l)mCZY7TdrG+$-?0k-U`^Wy{ z3r8PagnwfU6(49KMvQuk7mk5K^XW4c%@CbtOuYeu|D_~-pK|_+ba++tF1&D%6|^c| z47ywk-x%)D&#A}>NQk?XqMR?lKM+~lvaFAEh@v0b1N?;)+@`Av)CjBMM@W5xIyZ}a ziW;AHrRa|ujhc-At_)jhRvb97rMSLJDdUW>w}${rBZ?U5oDVwJTT!3qX)nRF*s!aF zU+3QAgszj-q$%&A>9e&K5#2xPsmCmZt6{t7V#X3NaGlnJnRoTRJ)t6zMm=PlucZ%L z`dB`RFQ|76X+)wJXqW0xp*Z{@H#Y4$Ljj&jEW)*7uF%~)x!AfwldopWcdawIUn-2R zri};me4bmFuqDndh?LyY%`XN$3l%LCnWK`jxksdj7DTx&C(%)$yJ(mx7q0q=4tTXt zeqz3UOJ)@^ZWL_UxLmiAI&`Edwu~-;(o_326`Dp1bu$o6_7XOHcI?cLQT+Lb87p>M zS5Y3%9UFft!|ciAcUu2$M!TM%6a~xVT`4c{uurIrhEVBn(~(U*Uz=g(84Ez!c5iL_ zX0?ScZUbv zrmZ&`fGV^gxCN}&z$M|7kX>b<-$j4t4zEKc$1XOT~ zUy{UbYQ3|>G28*S^+#W((2%8kaSE#I7AR~P(0%}x-vAdW0PCH=v#GA-BlIlpqUm%hYH ztjy&)w}b9?98UQc4>-p2KR+m($ncdZ)G-E+eIHrFP+>M|M+PxCh!+st>rC&MwXw0S za4mz}`6EIRac{x?JxlnObiIHwxM6=M<-i{%>!HWI!(L&&kS7FRixg*}3_Vf0>#*ek z;-F_-0rsE%1DrgO3&+T2nxPitl$ywkn5?Yzd!1+V>r8h>fRB8x>h;NJ8qi#gk4)|n zk6HF||M0Qw!p7o0dc=vx)t+k7z{0L#r!Ka&z{`sdytVKvTkpu*`F{`ab}#Fk2(K`% z$sx!4+hPrdU8)zv2YGX?B1RvCEqLET)XpBCzs^wyyEwhu#+yM6p~9aR!Wln_UHtdK zEkM@ofTbmD*n|JXiE zoD3GKuwU(N+u7#C07epqi&>xTaeLA=eHJL?`tEdkBMJ>#eUlL1wD>T>a;siUttn&Icu0cI((&*054zsCt3F{0GMN{RMGGdhe^xAMRfKOZL0>pVK4VlUphSAE;;u8cuV6F=LI$tSkW6 zUG?M<$c#z^Pv>_1u4&2i-zBsi0?~bjV8D~yM&gr!4v{LSyb1LOm+H1Gp| zBwlFW?tQ3(AJ`n>sIOH9ZcsL$!~y?3-s=yT4?A#U0{bk=|Ij`xTihVqo)_iBH0vb2 zeHj!rW}hFE^DeF$N(x{nE9jA+Z5_E$fV424crc=c<<2SnenbiBe{#BiJDN62Q2KT^ zXN%fAV@3-vz%RL|MlPKz!}f59`$x2FVzCVJ*@sL10BqfNFP)5T%bdGK^W36<%n_+7 z#`Nh)|45~`8<*^dPq(VG>a{bcJ3W$t9lz8DtagruJ(Mm51yU2EVWfCLLO5*LKyl)QrcF^3evM7*df*%l=lZ4^bYkGNBu9-)3OYGi2}TU_ zyw|*HYcznIfM5@3$zM}VK1JaU;m-%VY$tHK>;I=dbE`n0jX3);RP??79*f)Vdj!Zm zj@tTq}FK%C+(VIg3~@hX?7 z*IFo5>1Tg@pU?+vg%Zj_N$P~-EN03Wzpj*G?WX9(p-q4;1rIWQ1H8nnnVQg}mG>Du zvOAYaTD$v&?a`u^8#yvSacyaGc&3!y@E8DEBfBi&e-9GTV8_WQzSsf;Aa=9y2}&rK zy3lq${^tx~ga3zPx)W8@csjE;?7v1uRCTR|s@g%0 z`eO+;6=c)JBX4N?$hYyRy|Zc;@<+0CJ2!l00jy_$517^-C{RS z@79}y%k({idG*H`uW2P@8f2f%a$e9Dj-Hpq=4l(d7&V`4cXpVhg=p-`2=JRlP=A8+ z=L25#X7I?x#9m&3Re}@mUM*v->WEzBs{V2_qSX)-ar1@$kTd7yg`fv3n~&5^*1_&X z@1Cm`z$f2ZMvm0YG}gSntq<&Xa>0w6>Qq0`x%fcMD`^HdzZOu6MFvcneFY-~|?Pmp>C6?-DzsPjB0@8q5FLQVI6-Mnl5#E7~~ z?bW@teFT4lh5X;{8!=sKt7lst7>q^xxq9_O^{^KkOMEvTxi)NZZ3y^RMSqMK+VvNt zCha)2It11L>;(YJsti^1Z4@g3UTWjIMNOKw_~+0|-E%My)DhfoHYix%QfbJtb^ta4 zKuVtjbChf&t11wC?-KPV?|u6Q1&62nf!v9MtV*wR%zOdpi5C3SJknq9ek2<(aK`^< zIqNmf3x2oOR7b0^pV@+Z;rWRb@~ENs|@hZ=wKK{o|L5nZi2% z(=O6efdkrs;9J&8vDh(CCbFB-OHt|&oVnT1JuV0&qrb1b{Y5c@H=8Jactc3R_)=mCyL}(Ia+xi?KXUG(|X7$ zg_jNB>YOiOU_Q#*^q^UaE*=f@>0M;1DBTI?KBLAAL-9e5Fz)pu{IdI-_#*X2j1%;u&!Hs5OvUWZ4}Qof__@_9y>5Dr zR*rb1$4h2#*gLNGW~C^RfrhUJOC=RR+~KF4fo+&z^E|?u34vXADi@!lQV(CJqjC>> zd17|5?B27c4H<#P+L{^j7oI87^}fH|zLMXiKnqppH~NmKpmr_nHXFH_Zg0q(K8w6u z&OF!e?=10X0BXU9(uROi| zvr=>p){o2rcvUJEHBSfk)%eQE7lsqH3`)p=UlIybNv7;q>v=N>dw$=G$AJTJwVA?( zLG~_D!-#hFfW7xf-?agJ5(}(n@IS7)mGfRNF;~t%^!u%v=94^qy81xn$aiXt=hN7Bo z`uBV`cG8jD{+)SwRqLrH=ZsG34l@lpu=;O!n~&P%Dt~ae8a#Z{-`#=?rN0Vg^oQ^E z4K0XFlyR=%464rY-k8CEV9pHx#v&uz^@yG!mwsS;&7{q=FMs%?_P%&KjnL~}ENvdE zQX$tZfAa1JbRKBsRt%M?T>kNtSPI5=ae;SQoC!NZkClEpQOoJK>27CbJW+EqBcHW7 zJiAj>wj00ZqY5BjywAnc-t-S~wcN`4RB?B{eVMxMHg&GsnfQD9gK-ac5HEz^-!3`A zR=|Ex2b;ARiu8QV50iA(<={ihnc{e)(O96HY|y3TnP2(XRN&P?0y6fuXoa}{y{Sr> zdbZZYe}s(uas9$W7bJUxUL4$|=&>Q4aSR>q;UG!%acd>qEtP&5f=9Q)A?MwI9BE?z zDF|+VmK^Q^s2B+8uwsHc;Oo;*k|;=y07pHA4FRIR(28e%{|UP_1eiKNJ_BkHPWNA#P~10ezg zh~+S3haVU;lBO2$UHAiQ#=8K8fnds+jAq2<6p)9?=$+M-)}4i4=Sq0mkewcI`9%G3q+# z^;7$31xA*+@o-ho#S zvRm8DJkGW8Xn@#;9@7-ouUvD_M_~@Tr-8oLZ}Vw7-aQ7Z%9wiVkoqv2n@@pn&YUtY z-6(iT3;Z@?Gsfq2JDp_g2eZB+qN>Z2$9&tjq~rDvrmMg&ojPBYrxYnStpR?5fI1O5 z`JN7TTGtf%`m4{SfPd>O{&7iW=UJ>Jk{SVT&X!ZaQ#t=fhuV$xpLv<*v%RvlT0}d_ zW6J|g-`nIoD|ij)kfeHg{w|!(PW74L^{`)yCmU_H&7yMR2Bn%F5FSpG!}&I8dv|%-m@1{$IbQ8hGSC!Ur3>J@sMd#?Zv+}Vd^3h z{GFqa=E$ZN(_x>}we(Zprx9AhYP1j1wp#;&)Cp6 zy^81km;_~1<^nOeM*3#(FOq8`PqkD6Z5+X}M(q1M1?1DG4Op9cBsk_G9a#(kho1f4 z7X>hgD0ITrQ%>kn0}Pi0Y&yN`00qtgUi+{Ls>Guiq-_9u=JHxi#zu=3 zb0=?JBI=2Ptl|#0Etlm*i1H)5u4t-@Ft3uK%_R}IQ8yxDerG@n;Nf(+_8^l3r6#-x zmQ;Z45-P^mZsoC`PD(9&Y;5F=V?ib71s%A46Ez7_Xt6c_h?Ih*ub25lg=A+ANY>dY{{wGKe0DR5L zNVYk`Oo8U0D3lOu-k?9JW;jkvHg7DxPy-~DJ+mmRaY>q2M3?k#k`(&Ye);K6>^4f< z1o>AO|Bf7nJ(Cm_;u2-OGZDLB^Mq<3urIcu#C~D9~_16U6Tgok~qnzIq&5Z zGu2oK{@=Rs{JIz&Ub4Nc2}<9psgrsem>PZsfN5^MJvjY^RwlD#y~X{bK+&p`Dh9U= z+C3X3J7Mvb8FTo^w$?UZt#=v)JHVu$zNBZ|8)A|JobbH3gi*LX-*2YX`m#k&WcZEt z*)Y%Dia^r`v)?n~J5Q|N=A}Ser%&*Kwe)~!`BQT~kb58DjAqPUNxL3l-~E~*6+L<| zl7G<*zTl0>VQcq9hTxhkWVR(XKB7(s)foQF!&-)Q{;rto}Z)J_9G0PFvV6jAPr;PgAg~X^VW__`VbYE8~qW*F!K*lEzsw(&{yA1 z_}%GjIdLk+uNvj4&qPqel8~8vH(t7SY}P?Ni2m3)Y8XIME8>`L1-lw5v^{~{ek2_) zZSd@e4ldX-=?ZeFh*>Qg(|zI9{qZk|AOw)zi3gcxfwFzRjerFKhBg>@k9$MIg017$ z7@qb_dr+_^u#UoEt@CKy@U@8`d2US)3@eHP01xoE@nNkUd>D8^7n13fC&B4*D?d9lrS8n#PXeciIZFj@Bq^U1;3pabp0ywiRf-%AR@ykf*j% zaM<7U@o0iX;VcjyWj}I}l4wJ|Ex1u%Z^>TH%R`o@| zYYXAeV|fGGCP7g1oyh@Ic?ben~|$~Ri*7}FeuwlOScv5}{fq;>J-zkyF~ z(f310`RBOmGVC;Bcdl zi1bPs@2b^F{qQ(ppa0Lo8!5fvA#G_tZhU8KIU2xtWxZ|*D_BB#4;Jy4m$;bkh}uVA zi+pZnPQqFOOkx^EU*Sur=qv3-M%9)ZaaLdpRq8LY?_Vgdmr`MO#Z)dcl#(j02f>0p z_#pJbAK16J-8eXlFsDs?JeUyYz+O=5E4+n)TO{3~Kg4{86ijW!`_Uav;tWE?^wsS) z^#Z@iR_mjPOTu&?UOg>k^@hFlwcp#Ke%De&yc^DX!@mkX8bltP@C-$)ce%3)zZF%s`l#g+{V`S; z19MXdDl8uaXaag&!Npz)+Xar(wPVZK%YJlP% zGUgf1{&^P1;iH_h)dzz8(Jw(H2(&6qrRJXnL=?fIslMn?P@3ZF=e+S4+1>s^n$*qU zejx=6$k!*H)nl>7i`Rr-(T54@hc$49;jd|&wczCpj6;U(w=3rrwbG$L08U;Nt6@6%OzRcrw2Ik({%`0l+Qx-idb!Pe+U$#0& zn~pF|vX}N_%|>fW@D54&Z=KFp2ItrdF6-VmLVEw%5fadF%_%$e*{^LQllPy$)P0C^ z)O;Y*1>)_To5;+Czl_EZOyQ+&_kJjrwNdIV0*z+jFq821_q>0rgDa>=eAvcrXOs_k zu&eJN2*suT#AFdrjX4wnojTO&BaDb_DdN0-@c7Am)6^>GB>5JlUEmh z@iV%=0&4#JJD`&X4sB|8CPWhs7*glFqQkntSwe6Pl%2eqWrSM0`@+W*0m+ZNs{b-D z8#mzVrg;it7!s(i4xr;`FfEdDRzR}HY0E5mCWn-ma}xzb0%xTmzKvdk!a$lU0qHbF z_-KT3CF?%Di2@4to6`4BRcZ=?;yu0H)o3*KH!61TP95!aprs5 z{evvaP_be7;?LpcmmHw8#OyE4)Aa{OW^~-|p@`hSYZ)0cuvBG+qD~Iawh9vqwF%KV z_MIW2BYH@B8MA$>hv6a&0Nl04?L#K zWjW=egY^D@&uwt^&;eTtWWf<35`wnxb8=R)2N~_*UhA-NW6pGjN#*KT=Gaydx2Q7# z{-A$2vGssF|7!Vp__{;wd5a#z3c7fb+c#`k0OUB}l9Ys@hZR$ZLBJx|@~7SH0}D1G zVXL;am+Gu}f8`{`llrU94{FUJ9_TO6~Qk%0M?x+$GWfl4X^=4=ddEC z$6a^`LEHUL;d1c!{8vx8)$4a%;BSm2sMJOO>?}4^{=E= zN39+x`@Z*be|;wZ@%s~IpVWLCOJZ~U7Pb+tc`c}u{M7CPmp3*K#(SonXE1u*^|dDz zD$zY*#Sh5dxCib`hlk2iI~uf`fb`Q9e-!o0{T$*ixx$r0!030W`yik8dtUT%!iDc= zzLb1B_TuV3Plq&Tut}W=Liq2Sc1-Vi3447S1abUeeK}c4b}p}aQt6QS{dQjHh6ERi zy!LN$Rr)4KWz@#Y%vvb7?SF=2^6(lESkr^=({+A;S{s|l&$6&!Lv@|cT`&o3jKGJRf$SesRZ!|fv4|T8?_1ZMf9oUj6~|mNp5EdQjQ#t&7iUJ*(CCzh z@maAA%YApMFl8Nu@T6%_2cR=9y56hv6(9x&o|g`fP+z|#>UK6Sh2^Tqh+ zC?|)`VEQmN=Xz&hQO*xCgwOs~hy)@>U>5lr2~^{jw6Gil26GbH&hj><4KdQ4{#Zjj zcPu$vQzteX<#rFTiIe9`Y04>jjRxE@2rXLD-T?9LEj5Mr|3cYY~2G;-K(J5c|Iq!7pMG)lWSDMKRpf-9`d zknn@mbs#cCfY=;Jr17tJ7HRm4UUTzKx`OU` ze0Gg@)XU{tk(=czHq#Amz4jolyIi0Tkun7ngblQVlAb8D$9g|wMxP`^s3=no-W`LX?}9*E4TfV-9HW(@B#n`z8<<@JhrJO_31Ob{#f*b17#U-M7e_? zr^}`RC}P(G**QSvM}P=gPdQ6+Medcgn-w~i_Nuy+e3&xIrv-3^1SIc~yimpj z4UpKs9bR0~=a9OSS)t&AyUWUkfyGl}I2yLxUxb%1K z#FN<{&r$n9cf5OV7$HyP;!lfKf5Nac+-XH>V(vP4H zHvX>Z$keWDf9^ST)WW8yCT%-y=I=3X_jdJhPQmqpeXI$lHHb+tkhlD5;9l$}1|{Dp zuv7{YQ6nf_p74{Y1`5vM;oQ@c^D{xI;Yax3#`;yB>5%GU>bZ#^E+w+3m%MM=ZNEg+ zs_QOtd=5T3NK3simedhU=gP9?foE)M)i-fk@u-9uQx`iLP$a{g25h5}?n<*R$c5-w zss+f&xhI|4%)+8{Et{O_{C!gLbz{8q$|;X*c!*KhB1%#yuJ|j@SrqC1+~;1Tc4v!6 z60+?vJA1*SfoCLXO~+R-l`W|L=jwB`L7*7QwP8>x@7fC>a6H$a;wM}q^ z+PcoCrogEOzHhG{_jw_JBFb6kn+sA)m;WX~-++zFw;AMco@->iW4ktk&_78>r6Ifb zZ-@io#RD0mG}H^R1VFUtRP4En5Vk6o3R6)ZC{!-t8tj}?^3kYDh{rB_Q6-4BAu*Qsl)Up{1LA;UN zKr4O^k&s+g33Yh17sqMI?BjdvPtMX4MiZto_Yd%ZFWPyuGKe#}GkYl+f7i>srA@F< zF_{;6H3>CyBs@sfY?ifH^im+M<^KEj7vE9T^$DwvEoU}<|63j?R*KtkwH``7ZSxDJ zyU9L5+8urv;I7XK=k64EZBb>M1^!I(-cdW5%_;H$&G<$ziuqP%Ocec6JR!Dm83yFym15t?rvR*?X_nbU!fv#$j*2skQ0UR7;njOHGsCMV z#G#XC?=O!7)@|o&ZvQBg?;S>Jt*NARGavVX$I`XNUjNfxlCHyja z@c%2+5_#FhdH>cG(m*RNxkKtoIR#uxrpwP%^WS8K)I2bf0*m3lGge1CnllhtCF0TX zc>pKB1Rp_Sf@A2V9aDF_HPLmk;8~~I%UbvnYl@5iFS(b0+*vpU#<@cD>AEH^{2Jht zSnr9f>vXq4q68g#L&d?0pasx-*4A0f+rbOPAx}6*+$wYK`Be;8{&h8JFJ5eU_zmH1 z)}_j@)hm*^`bys>UB^?kLT9A$(4kIfNPv44qPmpfx z0$^lPyrETYsNyT2q`c)7Tn8k;AmZlyYkm~qoL3zG*S6fbj|@Ex+!+5g@eCnIw8@ki z0O9+3%j$bq;s|N{`dY*nFW&~hbercxdJoM53li8mgiX(ZMqel}LhaQ6DIxylYyf=8 zTf5lq_ zmzgl`PYKT`W}HJS0Hv-W%ooHuQL9rX?`fBj(&^%!ucTSiG!9jmych3+x=*++4pLsu zn?4HiuePa)eIu|Ye$qo-{{qcmN5W?I74avVc0IC~Ff&JKbqZ^fBI>%P#m0r}6cqpo z)uSf%jLVQOFb^Vc8+T4&d{gRIszl4#j2rf-$Sa_$L9NY|j{q2JmU9SRXw`K52?+UW z5ej6%g;o-IC1qRoAi~XtwC5d3K5)w8LNO7Xde77I0>9brj@BLE;P%{^X|%D-U&FVJ zK(;-QB9xoIN$7#!RPF+=UY)Os#W>xt;qm!URvr1}(Y8*S4o>m zW1&yTr{cGG8tvru&7uQ)Mz$DSd)!tJmzD=M(WdWojPicZfSNc8d$GBfj^vE& z1j$Q)j8Bup&;(FLQP>eV@K*6o8%+Pfz*l1H34+7~f$!w%yL|~K@#&OUAGponN*Sq9>GYh7~fQrRcXLJPX?}7nB{D|RYxaj zf~T`fbftxN7G=uL;oPE^S9L<-&O|>_7g@}w7)d>C1<+Znx0UBPlKJV?_(%Gj+e^?g zh_^obe2anZz)fj&rBq?%6T}(ixYAnGSB5p4xY>iJWeC?k%|Zalc>CZy=b;EQ5O-7p zO|#yT`ktI?4MvkN--g2@KTdxiNfW)FF9OpF#l{KML2l1<`#{KXB}zhKj;vbQt9DlE z6y1_+C9D;er?X{4J=6D>$=_W6gKzzJx|VL(QJF<@d^ve}8!xu;cFcXo5%bD<0t2M$ z^xGil-+aZ-W;EE|q97B)VTw&rjuu$C^Iry-ZDqFX0A9hguM;_XS2GXL;j~BHz}>`V zhw0^I&_Gt5cfyyYyXiVm*5w|kVnHipadIF&Pu9`8bM zenTT8NL@_;f$o~#V%!_xmIO(NBiQmMJ8xuI#yq^8vLJNNhZ_t#hsjQ!Ml^CBgZ}cT zZZxodJKh>@2ICS);?&Z$ewlup`oy5q4^F%9J-;Bj;V^%vV3!#q%z+lKubC;|pre=5 zu{6u~@Pvw;JrSa*f0Vu+VKg|eytBMe?epVn%*K9Ml5aIB9be8Q!g!R0*9Ad|(dHz4 zP(@#7%i3>WZq-*%TpR9B^j?c|Wex(h)N`1%r-0f}<5w|Ods^SEal}(_p%FMn`e9gm zc5DARIpzbH#=3e6qE0)LisU*Tww1s73lgJ1qOs)=!9^0&;)iN{dA@(VeD!_(2^wyV*m;xM2ed75>0}!l7FN*>byfGV>o!nPO%3c6zH#rb`ZbXfgXks|t z797U<9Jk7|m?fOy)iKum5z~K~jc=DvL@A%wrnzI0M(muB`St4vZv%Ec5M_1tDbf`F zb9VcZC&K7Y(LjvflwS|a6b9Bn+$aJ6ZOn_858dCq{&!Vg|4q5baAjvHVA99HWuU&e zRb!DDg&D!9Nib6SQBQ8OcIA3JTeZ3~~WO{D1ENzz<#(?qJ|f$e53{(VUF+7Ov1=e=MrGu*%FHgdDJm z`VQek?7?c5kWzn#{%yxP@wGskZ4Um%<)I+2N!zP;B>%6abB|}b|NsAWb-aplT^A(@ zpR1BXPLafhPRRLKa#pdC^KoV(9j>lYl=GPqF69tn*icCr=0a#@o8ug}VcC+?@43Fe zZr%E)ZoA#8ZSU9X`Fz~(56n6ytVwnJV-`7iAFs5&6VtQG@TP!(OgE}YO0ITfNn845{taz=r3RWGNiBLl8(fax zN>}5n>AM}s^5mtpeaq9!+Su*&2_m@l>(zRJ!jA(viA$Kslf5|eRh;!d+zhVHa$S^N z&d_vqSXNDnzQwL6cEJW(RyCZ@Q_`;fK7o3Aje9uwBcXxd1OnY<$I4vIif+s@ZjE0^ zbfjCogjbmRMrY~iy|_V0kMqCnCd>Ex=1QDQTF0%syyS|J9HJ+MLwwP{vr88gJ*FHt{#(EcP~D0O5gnRL%1?mHuafRqGxUv>-R8&bv+#=xK7=QVhi^(JdAobf48ij zz6*2tqDMT2`KGQS)mv+=<(kxXwT}2|N`L&L@bAwjcicXt86$SUmKAf{7H)pF9c+FL z2<#&B4RCad3gjrv8J8%V6H(rCWk>vw-!*0eG7ZwT)*zz!y zp6d^?JyCW{#*;muVf1c*Z-^B3mh5W9VKY2u-6F%wp3_$np6Lr65Q1>EW9?R>0yV{^ zfuj!Nkh-iC^@cWByVVio9w64xc0>j)U5>U=P;yP-q9?8aR?~yGGAg`lx?C~?w~V=e zl%=gIinB4PH%U3?JL3B`&J1?C_vr?mq|u^&^YJvB-F#M_w)(Dq^LKI1kG}@y?doDi zoXwjqB(Y^Q?NejEI9oJb5@kQ~T!`yrTR~p5^Eg@cl#K1bZNWtSYS+vw!kE~#yMm!f zabM#VBFNjp^(25o=e}*d7#iPD3wquet~grwkJjQOA}aT4kC@sLd7%P?GQyUPPUOq0 zDxOiDe)OF}Rz%6=db9Sn#ejEF53M7sCE#d)v=Hn+_mRFo+sV>+97rxci||p%4f(O= z#KR`z|M_dPG<8`UXM~w$h*0$U>nDe{Cy+Bp70-LV=^Wo!BcwDc1U0aK+6N4jpQHxugM_ zCiyLW`iT~5Xj{^D5oTmUg%)Bvyvo}3t@Yy+>(yOYBcMsYN}pw-5~P04`6dAuNS<#W ztiO-f4rZo8%LG?hapt*obkb~&t~5SNITrs+C`!NKrrz%mn)u+$UaHH#%$LqZ=(62| zjM$N#oBt7SUpCM|(BiZ{o&nZcw&1c6{f>rjPedAW|NP0AOQ_T0+`JDG^=C;iA*n{S z<_XPj6Jh!%)DwAwBP-) z=T`RcGgDL&deD@U%NeG(@>niA=&XR7dYsCekM52)fXbt$yO%)6t_Q$vT+wz`%_Nv4 z-?_0Wr$AVC_Okq!V7y{s^*Sz0j&N=0)1pdvhI`uG9Q)Se9=gH>N%O*w!&HVKYZz`; zx#fRXjzS@x`TN9hjaRV?%RdZqtWGip8|dyI#EOlCe?5x(Xr<2_+{&I=56N6E>G@w`CCm^ZQ zHl?77H%$GKt1NeD>SBrfFjrARi?T^;w&a7V3257jz}^1$PKy3N#MtZJZss8v|9pN(9KuGg+T1m837 z7@)|OA1#cqL<7Ih>S|>^^H5}j{LwQx4%2<1^gujiTqq)$>qx|LOyji;m?aSb3KQGy zyLLOjFSv%*05GU4P)BKu@Kw@d{zGIc$!6^hv=a$?YaB(}XJQQKwrpwwnZVx?V~OFuHCB1_Aj=5{~LQunN^v zZBUq=T>l$+7_qHwWNzsTg?_y|=@$WsiU=H{9shoZ6vQc;ls+hOmP%+pQJ_?zgzX$h zR61ey)O5cc?~(G|k3`DwBF+LNx7HOU<`JPL>C%*!|3B5uvuRAp;P{1WeGq%9;@CKp ztE~F}JXi&Tqg7{h-+{5WH+nXexyHcE*2J!@eu3>Z-@DonzB+XHPj0i(H3EjH=-QQ4 zjb+6u5R9k?c1_0?C#gnu6=HaO9^}T^xD)p+V`V54)tQT^YQ~ZX|nje z(2EdPd9)~b;o2VsNek)D=vVG(3cP{uiwcj!e*7}WvH3urYB+lGrdoII(C2@xtLEFR zu!)U8FNnOfp_KdFT+W4=yLzvMkH;%7&idI~8?knZ)MjrOMxOLIW84dfU8q37Lv2?SJofO~jqwrcenNLEet27!!;UzYfyFK4g~S{M|D{l+Y2?BGP7yDGQ! zKT-BO8^gVrVCOnU|HqsnYJDh}SRa^%=g)ik&eC1#7(s_f81CsFG1bk9DT1yNjW z$(4kmFO}PJvaK6V$}@z*=Ndm-G|iJiq9pfk1U_(y4IV(04ASi}AIwd1J)F0b&J9i= zy(k-h2ZP{K0h0U|vXS~f5MQS|?x;6@2Y6}FcEbF8$P#6phawNQEE&2V-M}eMpGS8O z_R`b>)TTlzWt;W%bFPncI+(5~8cjdrQsh7SOgsf{rm3+wLFi{zE!}>5o3kLnmT4b} zJUy$A(H8WHP|h|;GWVTX^+b2W;FyBmy?3!zRn##ZuX|YjQ)9+Scptn0%;I z^Q}z5!R}bctwz&J;QxjYuiP21#+X?e4Z@4n1qz-dZczFK9&3 zC(gXN>np{5P~ChI;3DbAh3C&0#^#!Sd+(f^WftI8q@Q=kFZ^@n!BSs`M^)5xQedR1 z)gLO~xxdt1LJt|}_*N_Tr_|Z)Chjfr)30$YEo@N!TIhjES^(~Q0QsT3f5EwGC<$(V z)^E4xdO=EmqKE?4R|6Qdl#8-hCE?1{5--q`K__E|Z(7xcwb?s-@vy{N&=;NuZu9aS zKB6kezQg@#S93S`YYf5U?)2Bi2T(gg6L8=-mpbkyui4}?ES^k6*&fv$tB_wggGx_4`yRDn-lNBNm8@c=@Nu!;_WmggT$%lWXaSlYvteSDjzYEM1 zdQ_q^W-%h$k3J_5q~o^t9GMn0c$^B@CEc|uElyYCVNa`kiwGvN7dRLCwsJ7J_wYlB zALfNrgX5iPvkpf_Sf^^W86ULW5&>3Y$hhuP2ZYjTurFJKO@Y{S8dKKEGV={NbNj)t z$xo)i(Z&#|^@OehsQ|}JA71nyJZ!HfC|yT%+>P3ka@HvK zH1T<K!U2zN#OH_`ibEVwI28c&gq z;4NM6q*lqb4U%O3$Q&!1oE^UjD>pW{>0qR-d&nJj|d@OlWaaC?IWzu*l z41jUHy8qdK9M4wgTnlh2?!S4p*CgHT^qW_9J!pcWp&TWxQw&jW_O`&eO@((O_r`7? zFY_)=5#m(YKb122DTz|H3wuethqOxwHJOXb`Od07H{H#u>}3pE?Fhe{!!-rBdUoyv ztZw0g;*BOmAFBCr_I2_C3$7<&!f6Ysa})oXY@Ss#39s2W_qz1?ixLRALefuzQf>gj z*)|yyO`tdDfASGDI|R#L72L5~zR^>iMy~>6Ch?g)HNG+Th4{|p{rf@wz9%Et9tMas zP<7~{Dbt(3n}n;-^kESOM;Gd;DR@nb`gtR}H96X^gCub04J`|T-RZ&TIb)1I%i;m< z?Cj?GkoY1fqe`oStSlNBp##e{Dhx2&-zx<0(3 zs285f10jHR6%c03&()iUJ1}OVhwBc(DMG&8PdeU|oJr09kC(ecAk~wuJ;#Ur5mL1& zvGZH4(M8jsZn`juqr%X)dWpfR4Mjfrvyl~qjg4wt7Me5;Dwr;n2v?fZE?$pvR~)#W zWrV$F9!+)%_8c$LF8IwJf4-MCHFn+@nCyl+bJ+%dH8k1K&r&LxS!11x!QS$+_773$xXt`C z%FfE)2}5i7%QTYQn?(=HSf-`cT%OMU2e}{_8|;)#K2t5%U97vAY!bj(+X?5gu{t?8 z!3jTRtB9OX>>AM1kjHQ2G(KEgb%wpgiS3X5IYBS(5?eIoKQ_YQ2e53Ob0ng-HVKPWOS^XCubtMhzCTp9E%nTwrL4A0l;7V%M zA~#eMIGyOiu_}c@;rtGSZP8aa_GG%_C%wbzy=2>kTTncZi*oZhG2D5YkmEJ&%|rI8 z6v6|+6(j(5uqj&bg?H}CLu&|mTMCw}u&yd3uziQX?j8FjAf+RmMk&XE7d(9RoT6pT z?j+Xa)|da|pUE<&21_b9>Ul_cXEn0qDFW!Hh9joGM)Sfz4v0#F9BoXhfaWB4L-ghq z!J-a~N@9zJ_lGn!(!Buc^vpw8Hr!*oKtmMhn-K6G-&P2`L|C`5-b)i1n?le*Hq7hs zZwEZ8?L+?&*Io%j`~`O73qq%LY-l@blAyufV z+}7Tl6)}eEJ<*B|m)d%x6Ta*zlN7!O7-&=~t~Nnpe3H_3Qfkn-jtNR6)!ouvE7EQO zu6vQvTHwcV1ujUw^H_7;%!w)S3kjdOu|I>+w9r86*J)~Z$oao<4kICFVDXzHnmI-r z?9B;l%SvSu#ADuTt9u58@&a;3V8T~W*?E@P0#5}Ak9o=mqcU#1M}CIxHh9CE>iO5& z9_+*-9H8`xTf5J~HwiKCXUbNGQ&kQkI5byHFv^!}q+i%P{%t1e*1AHZoHhi86c6xQ+|(7%i~9&uE|6=gJL%3JnRjmeOy$cW=pZcsl4p8=mR)obx+>m z3E-5L{AwK4>*tYT`m;-u;E-DNA-!oIE&f~(TO~-~Nj|)CCCF8LHuXwpw2HeUElViu zOiOE|LchIF344zTPq^r7pT-Pef(boDZ-8#7u7;okD-`_q zLp~mc8U8TKk5QH-ILO%o@9BYn6vMzuC}e(+KP69fLxQe_5Q@bEa7*eh3;imKVB9uY zG_o_L&;>+32stKvi$=Wr8cWkY2n;u%UFv7!otNVG@YPu=g=-i2nLc}RLZ?OkjqdyE zjVaBjCpz!tBWG1wainX?7ay#tC$lhhp>Pq1|0u;=QSZtqL<;PaYj$ub3P|>brZm&? zKduSVICuF3(*XT6;3 z(&a`=BD9J=O4T|L^|4#qY@2*|gTzr^uC#eq-WxM3L#!K7RlDYxDN{)f=j`${;-E{5H@; zHrp<*CJIsre;yd~)wNXJ*gBN9M{H(J3s^}3*_l8-04p1;a$wiM|Kj>%Qkfc__jG;Y zv%emr94^$MFypn>U0y69YDPSlR~@;Ez#qspo8;=qzdzR8FrzbNf3$c@Z=!m%ho=%u z)*80RKZl;LPycU0dG&xMdqaCFN|ik>J5ds1JGy?OmYyb@KrV~dfGDPruJnVM9>dkv zRy;fq{q*zJiR-(XVxrDXVNZeGV(A=~-Mtz=+3xq9FYC0Bvw3105TSul^6Cu8z>!|AD_)Y8@KberQr+alZ@QO%@kEMS`ryKd1ThbTWe0)A0V3 zn*@Q_m90>19f;4qc2fIY#}Dc{+Sh^yG4%SpcV-6KVfqrnwdkmw2@a zo@GB5$BgwjR3{$$T1u7>nZ@?Q8xV4QjVPObX0-+GprlG>K^!%itwU+zB2cego?lVd z>Ggl{C|q$k_8==}2x;nWiD1|Hs@C>H5pl{EWt}AMSl8KRt8eLGPa3rlSj34oMTcZ8 zYugI>-(_#OfozaM?`0%(x6MIpE>ccF4X>A6e#!2iMF#Ugb|rq85?utx;87Q z!h|1M1e#?E_zL@g2rLXOPWZR)m0+nx(yb5-z`piLeSU=yUpzgVd)6MTQba1O)WE<7 zd+mPqFG=hU(w@x7p$-@<8x8g~s*DQBGwT0oz95VH6@C^Hg8wL26$Abi6t<(U>CuBkW9IxJ4_=gHE|V~ivl z6Oaad`o)XUhyMOv%{gSbEqOLu)dbb-QZEA@zO?oLPuTOO-8+JvTiAybmhUXU13kDCUS@Bo2edVwQOT=<5y->af~#YOGp!^C5BWr z*&aNYh1{mP6XnmZd)O-5ERU}0$Y_=M;!l(Paz?Isbb;gA&QzC*DOaa2rS`P1I~A={ z6349T`qlS_ohhKupSC^RK?+z20cMsJJa%j%VNz-^g324n!5? zQC_%g)%qpV+Mj1wLW4o=dzWMeO{noH(k04}u2_GFzp!+!gLdXI=S*Y(gXN+n-yWxL zx$CTxMucj!f_8&sysBVeW;^;JiZY>^^)%LKcVWZfsk3Os{-;Zliv0too!FbCsh%QS z$&`cCV5@}zL3t=9FD`7jGhRdez1W&eaJ>bLDn_1%B{o8a>Saz`_}dTV@z`$( z^wh3~XwRq1?=IdlL4HA&W5_Ob*8Dwr8msMn*8q>#d^_5LRD0yYqeRQ&a) zW*@~_)XEE=OP^Ctob;%@{#rL};Rb1|hNAFB;G2d5;V^Y@8+Z_+lv0M;*QFfn+usxQ zb{P=TueQ6V2=DzKfz1ruvDl%wcsp3qbV{129;rhDeBVsvQ3& z@$Z+Xy`Zs|&tJJ_%6BIA@4jN)F#l=IFC!fAT+9F3u9*L7d3nh~6iR~eLuBU=8HW}3 zIjJ}3ugG8B-g+V{vJ{RSRe7u{p2gppg;mUbsu1BZ|L+}q{(Xo(>T&a}7|n|}X87%y z^V_7qA`grE6vvb;X9VLJDMwaazM?oyTItKOirqnNOfKT=bT-n@xqQ8L5f=`5G1hSl0m!|~_8pi~qiKp);f*PlWlH7_lmN$Nt#Zt8re1X zPsCO^3(jQi<4%HU^pr|-20UF;R805N_`9eKXOd)2Wmd1yr~YDCJ?nQ^4*9>)auE0< zDZ2ODc6wr$T$Zan@`~?SDsqm-*kDhb_s(tnW~&{O$t5QPqYq$B6s&|Q^_#UJZu@`)Ss6XPiQ$qUbQ-GcH z^!JQF|G~;k6iwYEMDG}0_omXsHmMBaLb1ZuX-HfN7%v{kEOrxLoa4I+sjg*o@UpXG z9*&^QN5{@7utO9&snge2Tdkn}z`-gP7m}fOq{$8+Skh!z`ap+~azXc^jP3*LQm0qW zZDItox6|I?4hJr#218lBO;zV{gn4Dw&&c`RMn}ne(3A&{$>N$*&Q;)4&$xv*K$!4$ zls)}mM-W>`HGg;E@1b@z;)No!cPG^cT+5z;xJRd(JadWQa_m?VJj}RzGn$XjX{v8& z!`Ix>Oock;o+6k99#Ds79Gx-OiszL89=*;n!BD8>^B!W=HoM^cPaAD1F@qyC z=yn@wT$F81Fo9aJA9MUVd6A?>7f_M9`0mBfX7~Ho_idoYca^0*H^#)0!VON)Iv-0Y zkC*~IL9=LZOFp0hT>ybg{zA}J&CwA&&`934L~f=;`cPMLn1=ci{bLFzZtfAk;6iSs zTNm_WT+_cuvHX~|E&94&<{isueThl4)N!ezQp|#LLrb!cj9PQ$)Y{A_XSwNeYdzm? z^d*hTc)FVu%9HJ=S&fdOYpOW!S4XB}?)sX)iiw$8=y3_?4LAy^a9Q5R$z;aW30Jb? zYkO^-ht7rLBWucFuQ7ZO;YY6F=*yFLYcm^QR6dZ8@PwNqNf7FcuhpCcRZ9MxE zAt@FWaHB(xR;09_++$*Rs$5z;nMN<*dV`@2XIF&d98c(p|1aQ<^&Oe%6Ha*^P=Ow{U`Mq3=y`ZIa?CTM@p54XS zx?WYk-qRU<)B)NygZ;#4KMZ$9q_yBHK)LQi8o%Ciaj745QC(g_S|oXN&N%i4b(nD= z8k*&exgqH8E=NK0h}Zf{Pvv%P%V$%g_~W~al-N3$w++BXD)%-LAYApEa=)_kYpTM^ zv#XW<`k}WJY!{wbRQXWYrs26aif=E-5A7^{eEx-NSzND@EFm#YFtyl;D1+*<_(Ye^ zaI@+yV^_(R^5WsJmyob(Nho;f1x9KZS&M>`x1~W36_?6txL~OF%rS+9dho=emU~!2 zWd!>Y%;{iy1H!iqq*Uf7MgXj^sI~XRZ38zubcR`ovMK4eb~l(93Sq=p(AbFCO4=G& zC)r~ga$bz<+7{8QYp2I`E$cv80-kgvZ8M}2rqK!*couXdz&*|7RKeHrjZWs7vUKB_ z*AkAWj{%^UPTi9)%lV7v|8zb!r}wWa8=`ix+$B4bRH)qn*d&U;ul<1yfN#TtOM zFHZk^-_md?{-|EiK~c^&bK=ROJNTJTP|xi>m(w*Z+Hrbg|Ldchks;Yd3?bGm|4nzV zZ|)tVUn|OmB6QuJA9WSNrkBXU$&d;jf{`O;OdGxBLgqQp5C*&F-Q=kf?JhS5OtsJU zyinptixiDab| zgmzUlAa0*c;S(kf&!maJklyU8s}Fofs@tYkNqKgtXKfSpq`X9l?&oV1DToVJP)#|S zJ$(*J=#QwF!6VpNv|XwZGkYd@D63~r@)RL8n!fN#D?NloY1=>XA?lC1?r=e5-EEfy zsR2`KOJ6zpy225gk(VOLcrv(3IbSF0@6 zl}ddq;DYWXmi$>a&u@>v17RKia2q_@IM0SWe59d&#&2FM@?qFvmr69hb}(gbXRaf< z;PUj7*|6LjTem0l-K970p=d4F_T0PR^0Xt2-pbaGBzcvn_}s91XIoPKdB>WJrlgl& zmyBFzL%I>|p;bZ6DV<*FsNYl6L|IvT%-)4`kOA1JB8U`#Uew|p|Mrmqvs%;Mc##5s z7|kA=D|iL+SQ7xk)iM8=V|bM)j?2gb4C$^kUA+r^Q zQzxtAWaj=ZtIXC?Et%WJHDRM|W^R9P=ktC1{^&8gYL{#8yVvvXRqm+(AH6N6Th^^x zr+32F>&JELHi_1)+wfwuCb)9`-C;C%S&#kE=i7DFJo5?gMgx89Fy|A~u2d z+8E!n*mdiS4A=gwf3;8Uv2NY!gA-oIeo8}4l|r{soW#_WWBcrV?~|@DHXE$loNqGgWJx16wXC2TQJ zXH`_>*s$um|CERIe)8#bXUXb^j9*^6@KTm;&%e8{=u!@em(D3fE(x!D*|OLT=;>U= z3Y5IT9jz~COu$RhQ5WZjR0k2O#O_228xx_bB)5w0uEyys!Dp@~eLbUGI!g1nKcouU zh$@o}RI1ZEp~SzEpa#RRuJaws{q1TLd8gasz8xbahO3&Db)|yDfO+ABh9V)gddp$X zK@GccapO^mQpAo{kZ8`DO>`DJ-pdlQv0gYF|C6-Qsf-Clk1*e8zYW5)8gmn-(~AQP zmb)|eV{8?L6B>dri#kMdqfy}S-xs-I#)5v4!)FM|&tJeJarqKn%_~+1V&vjT|5z?f zwP}94OH9~{V`GU$ZI+g#yZ^eUV_Pq{@E%Z3FWqa&Ho`)J9KQGmp=HJPDskzCp*&85 z{u^xxa)`F*&37K53$ReGA(__TJ#tOtSd^G9`Rh#zLUw<8dt5C&HO|aA$ zzse`q(xCRo6&~AL_SPsx=JVI5oNrE^2w8NiO9})VHEW&<~hCEt+vcazPZ)g6> z!Allo^Gg5&a;iDTa1p3}{5nPYQnJI=ebY#S~dGncDF4wtzlfk-s;Yr=De^itBPzz!{sA^`%ew+YmuhY zz&u6HI;598KViM_Qa_zZ+LW$vnA*eh-3*afUB z@4NKCK&*FiN;U;s%_;6-nDVy{@>hN$VU79a9xn6YolwVos0X!UoyBtK%!>mU+?0VP1gL$7P1!uNOSo$pn$&}t!|8YI)kOtZwmr=a*z?GNT--o4*>yD3l z)3B-HnL=;=HTxnJ=}wS$@)d9w@KH*YbftdgmC{RVb6+q@rakk~ zl(+0m|GLy_;oxkKT6E(Aoe{$rf4i7r)*6oTaP#;XX_-IW0bMli&#>48K65zT;g5_< z7vkfwdK15Eq|yY_B_GGoE3vvuLC2bPRkD!@WYWV8QX^~yHBJ$m+`d<+zBr| z^632iKFSjYf^wFN8d`ldwFxKRUExDb9^WiM2r+|l&xNK91I@<{Pzw-*-1L6zKor^_ z!EvXEU4U}k?aJ_5#py|NAotRyVQD6UVDg^WoYypr)VeIE7h2JRnvF!x=j`hABfg;` z^~zlb#hU!0<&m6Kz*#w`qM7v^Qr=Ph9B#p5$Bvw~R6FDwl1-T{<-=ZyKgpS&$pRWAj9TmD|DVwFq+WFzTw} zj|~2>MMMaWGe=Myt_qyJ?zRE`0;?yXK~F3OnoZzOTIq~@@TksXZq%7MMGeRy+!EkrNO!L_SFs6bjN=od>B3~D%-2X)phlCWv#bq6*sEKQypZ;d%8GI>QrTB6o(Z_3{!uht)VW`{_?_Ev>t zu`@bi!uC`+yN4NCCz4+sDk_oJ8>j58@03dl-habY5{%*J(iGF}Hs{J>%&E;=QF^C6 zSYW!5`JIa4Ui&*LQQJE^fl=b?QMSAI2n&yYpxc3;fiotx4&4o+m%A_txpXG(FG-J< z{hzGHm1y&j)oo4s-zYD_ECI(!XJS=xzeXIWwqBK+`W(O^@Tt=+c6g0wDJIYe)Mq82z>v5FJ&_9A8}~`GpAT1qH)^v zRir;|NVjuFxM2V)>9C0u4ejwUP(jaTek-E8CFD!QGan1-f$bM;`Eb2rw)|tEWGuyg zgqD0A8c!PY+g;x!Z~f3nKX1%`cRePmcFVamS$&aYayI7N3zc=VZU`87zP|M!m_#pG z)@x+ZS$Bw-ShA}qh<@A^27SYNV(X~nZvmCwT}zpk!ablXc|f$MHd6v^RFe_o^Kgc- zw9%qs+^8Hnj&v%6&gRI->5oMtM;!!(v%zMUXOpw2i32(X__1w*LKh~bpeWw9pb>Lb z{>nOEomdWWR+sps-Sw-v{gcHoYhEmGI+?fUE+=1ka7b`+?#;BnRgn)r__N~02NFaZ zSs{*WaTW-%C{JIiv}97Seeq~@pg6*^jfTygTx91Cf^$8|uSv7bonWbfQNd-I;TB{U zBO9FYn{w8CB9!$*vKO z>C}$!L2RW6Wr8cs-z6NJHRBJ$3RT6QI9VDz5fgr- zG6O$Mxr>dj@?pF@M*WnwGqA>;Qyj|b^H=Hk&-ti+=(xAEDdXprs?F2new0Om6}B~f2ApZ^E8)-9y$}YB^%F&#aH`SUIRlG zmwdWOwsxgbFs-Cp-)X3n=WMW(^uXb)s8PjM?3AMq#+cr9=2SxJA^WUClIURPj2HjVuUThcTJo<^aZ8B9shluP<|d*f25 zl9Kjt6f)AL3Ch*iMN+wjT$jRO+saJhTQvS#X-MVbFN;%pDlRjEVsA0NzEjrTadqKv z@=XMRJu+A>3SsDssyP5t-Ti@FSK7SO>x*Qs=trkjXSaz`8ejrKU0Wev+N-ZFz^OlV+;40^Z1uTNbw|HIH z{@<+-3-CM%BB7&d5PM|=tl|s)GQ3S4PE3foZB109V+ucP?aV*OISVd!KeNABok_B* z^BL0hnrRxQ2g-XVG!R2N(pQ#7B0thEn#zO5z1`@}FLa_OpKp!z!t##Z?LSDlgyb0Z zJn(e zp#zO`S5W*)wkQRq{1%FC@4CO`TwF8-PrY^5t9!!dTTne zfANm)`crH^TPV2Fe|Y;hf1^|L2!okHoY#H^uZc*#>a1KOwZU3C3=ZjTwh%+B`?zgx`j4$dtxGWjisXO48Ecyv|}=PL^) zWr7`E5CV`SvZWMFfcYzw7wlVpuKO-oep2u#vaH2mSa%}E1O*dIg{=ybdDE7zCc0ag z=^R9tjrF&_6ioVxQ*<#^z*#C zJM<`g9RuRJQ65ENPUd+f!y^e`@XXO29!Jq6e!-IO4BT$*+f*o=cD`&tMu9T+V;Y$| z^L;Vtr2owHrOk{09VKB0cMg7W__J{nQZwk~%zZG9P0m6vDyzo_SP0BQd)Pf zw#p`|)gxse7Im;3DZ)5|qZ5}~GS$P5d)l4XKPh;MkN?*kG9P+6t&~i_Sbcl{ErIlu z%igs7yCqYCj$eoii0|{{^5Y0GKpJk-da61$sv|9c3H64bMl4{6P0-|QPfBZ=1$nzM zSEn#P8Mzou82pJb;xQHSVHvsXE>Wxc?DqNWVHMZ)xURr*C^)C>?IL!RLZq%8fkT-G zwtieWIYMGKTU?blJ3eHNO}Cl|X1SLvmSLApsy33g&JH*Y2UDI@dpIkc;U$#UgIH^q z;|=gZlf$gDZQ<$VlgwW2x3d8S#6IT@W>Zq20+c~@&AY-(O(kHjx-KDcxNFA{3nb&d z^1we>1G7_tCQ%mJ*KS$;r#N;Y^!btrytUXBeUkcbbTP4EfphAeL-wNOi2>UFq;n;( zS#!R7aC08#R-siMf7XfmHA8E+`d^Pf(VLnLuNk~l=Ut!_^Y)gBY2q(6;`A^cXM_7{ z!JF*V_ZH~K_-n*lj_HNXTXR3%a?>3~SYC5*Czxr@+y)ywZ%|O!W*?w(+2CqT$Qv@l z&Oev-bXf3?-q~+oh;Gz}z7<-b+`eTYuA3#tm#IYIOFNy*3au{rFf<)Nu{v^DHE?W3 zsy-reO>iq`yAC~K`mlH=J=dCDHjiGx%0uXgobE35w?0d^&vw|2a#w!2XX*5tzWt@^ z9Q96k!s|&jp?MHd7;v}RYv^)~_e9Po()%aPR~^0kOfv8v_tr{cE8J7}R? z$1@N;O&U_FT7q2Dx2$iPOKuO0*g4UowPZy?)zKAkUy5ltlH?)pp|1ekHSJp8MCU`N zUAlWxwag~4YgJLPA@&)kXU?6|<;uwB;0L3E_Ed;tT{qNyhof&?eTLCUj<1XHO?X`r z^tOL`DZ5Jao8?O8TbDo0rY^U+*LR#$NaPWq)L#vrKv?=5Cr+$dXSq4QA=>^B%8NL& zc9Ji^c$Q|Oqx2Yzj{(}BYJaEgsI$Y_8o@BcVPmiXJ zx!hHmqkC0Zi{_v{7Fyi~t0G4%fSwwOR9VD{IO8|LsEl&^8$MxOC=4h^*l@3eMHI$z z0fj+_?B6`x59rUkYkcWuG3mW8@|y9xN$8#|F zk&uvPyC##qp1_wca|Y+0wJpmRLffL-V1keiwfoh!Q0EUjIze&%0DeJw$1qZ_9nbH# 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

      Dkv#a<^|{0XE|_-iz&@Vk~anx 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

      yCS`-vL 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

      ?eBSN9cO_h9z={ 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 z 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 z
    1. 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
      -o=kNV07X!2;q>5M%wW-^g;4vtgoK zAy!!FrvCRB-**G?eK$m7j-qEO$RqII<6Ye49&5jpC(gM0b-X=r<{bNgUC(qxA z_e>5lm3D+fw_@_vr{tmo6QXlAnNj4sTPNIx$emNp>2i}Jdw*-ozOQ>~8X`D`6C`aD zoU2|*K{Rx07>r>rcNR*Ftmvg^q;_C-hU4fz>1)oRI;2k_&sMsA8cVlEyyr=h=a`kkx}pOfNKjMe?UfyG#(Zk^Y&1>Jh@5NN#ldKR4!T(Yvdto5HW zrSyWn!3otaT7hF;)el@?_gW6Xr!w0=LW*qkl4!}zom1Cs( z_gkOrR!I_O7e_r)&5^hD?9m8C7pI1ktZ&b!53M#W@GJ(NDooKpCQ(k@RQ_@!C;i03 z3E5Y7R|6uFO>R}D3@zT$TXftv+k5%LmZYWa@?$!^l}366G4VfqKwVQ#F!H^{KmBdL zRdsjU#A7JQ1(x3(SHFJC5`91U0ad>ST`|59GaCL}Z`*qCw*#Ud)}z5JYm5D`ZeXKW z+nxO+@@PD&)gYc-8gD{kgZQs0@Ol3Y7qN&w$&sc~aCM|MQkbjJtqxtAtosPLJ zdH4($dg)V(%1K}Vml~BLi;{0Ol0Of8DaD}23#Y|KXdA%&4cDLyI|5*pKy zj(kd=bZ{t#REjxmm_sNfr=*hFrc$jVImDQaIV}xK(!!3!2=|7#X%4@)@9(b;>>iKD z{l2g3dcB^nYf>a>MW4*{C>@rEH_}Zi5ZDiZG4Yccq6HMZqG0tW=L>QW^g0?ya z{bEa)_^7@DmgGUkEP|iXe^Wgrda3$QXzmRw8&Cx?u9CvJeEGgv{xP$g-{8;ryWd+% z{z?VN_4yWEJ=A39bTy0NI{jPYxt^Ok8l&=WG7bq`9-PKZ8&i z#3yW*JYAn%{M%_zwjj7l&xE^`z)G-nxxhN4 zovz)k9d_26@QXnVGVHdXA33l7zUr%GND?u3)UwD`<0o1LDe5gT$f1jrjK5YLUwZ>v{|4(;LH%i|1?aR-u5*znGp>H_SgDI?;+`u(Zw<%? zrmqr@?(EJQ3SrP}yF*I6U-ej&nu)g{4*1-?^ED(m(C<>-8!X}STcRa6wUq4Dknx8H z9dD)`L3LV;(e5cZ<#LMEx{kY!Cx)KOZZK#B3}?tqgL}xXoGf&k5GI`cm`8Sr?3sV@ zFX*!RWMR(?xdRGs3zJcWvYXxKK%3>xm{+Uxd$o=$(&O4zvtGy!TU3h~^UTwBDIR^` z?5nAa#b7vfMGS*q45tFD`c*$nqWea?A=kE)tn<#A(kVzwqP;NWKCq_X%y^(?+mv$F zhY@i%7c2VuV>8bN!0p2Jpc@gANl}XIudreE`SwSZaj^+MBAYQ$aj&+=Ay@mwutto* zf0|tQUW8gGC~b2!ZohS%wS zKZkBbrNT|SzlY4GB!|s?H8H_@<6Wpw$p-ZSlU(SyLo9}6zCOya6g%=y$9^l{Fvn+JB)cAB|-1-dBKJ;c~p&o14 zzLTanap1z*(AhrY>-Ylg)X9hH5kI7cKQr!r$kAu3^7XixkEsRvWA^xYFKA*?yQAN` zy;%{I4BNYSUuWI+b7<8D3iwGiz!ki9+!3!cNeH26SQ@r}^ZzH*p}lJTaoRwt!quu2 z_w`)aLC}O$eVeenyuv9aEqiG4ZZZ|N{#f}DV;E-TL@By8oPWN!KALaDtu-w%;I?@8 z#j2@{KDvmr4E7&Xg_KA5{daWJM(wXXb}CBWgK-UDr{D>ZIEJ@rj|D~ijMtC*l$SeZ zPVtY=aQmdL0GIE*$iX^yxq-oW6|}3{GV&A< zaFD0+bJ?`|+8gi?d@+xkeiErzs{vh?k4~3}18Es+$XwQxb#KV!tK!25zYYVW$Ainb zGZqmI2jG!1Ed*!d>8<-Hr%Y8O1F;Ab+QF%N>5xuP=!Tl&3r(#z&s6!De#q-cgKre& ziS8iMpyZ-Q9kw=?yN((PB6RtnRZ5p=3lXBua@2*}?s2~7uP6G-)i4!i){2gth%;I( zwO2`O^ouiAA5X%V1x2bzo_O6rdU>`BTZw!4N`LjLFE$TFDD~n0D8vLB#5l}}-;JLT zsq2L9ASQVm6qri~qHPo>heYf&orVHuIlpIK~ioFcBm53j8 zOf>d3>k4$Urf2$UOpG6K;+>*7QbXlL^>$J)97#xOa7xex<|n8l%NR8Sw=l67PE}&D zw2@(0PyplO&aT$|Gm(JMZOJuKPjIa6i+8fW5N*VcNQK}042t$8l)!GV+*Xfo^>v{kx-tHy(?WDA`ld5gryS!I##10;qQH#&B} z?+>|=^W=!jEO&6kg_WlOe)9B)ZYkPAdC>P<)t1}Eig{@h8y~TF2btyx7IT&_|A;;z zs}iqG#m=yG>(cTb#a8CRmn~EqVu$U5rlydS*AGn*idDR{QaTA63@-4#iq$W=Bdk8E zsE*w6)i?Q^?(SsNMtVpo(i;2y$j9@$#fzXwPv(ry^B+G&D`czFMj1*R=IH>tx%A^B z!2t^`qupbRC*3l~w7ZQK#dmIEGshlXw7Zj62&Exi=R3RkX1cxebgWKq!JI%oZPa~Z zQSc>++ouRSDlsyBwDiQ_k%}^~wdAnZCGnPg-R=?>#S#CHhf~c?eIC-wm(%8qKR+3B zW{Y$rpfCNz9{dAU&gV@U-Q&q8)ka!u-@EGe%4LkDO>Y4`oPX`DmDqF$)C|TtYlp>a z)8~xP3$vs9?0D^yeE-|OoBa#O9~T~>Li>86PHoKI_T$LpgE6BUlX74qsR#6BbAGtzmoDqDFT|@ykjDoi@eX4}DDKJ?_`PKA zgB=4TQ(jb$lLGcA#mLTnU?Jf}#@N`D^`ppQaBhTImvO}K#D;&xFHp&-mIf;Q->z4@ zYu|{NZ?uYwF0Z(U{CjxRf;gny9NbWQT}2rh)ccwK6Z+9UgvP0xP_rRPyHDOwh@+pp zdkJlm0?u8VUuaX5SM=hm4_W)?5&DMhPvKepH9cferu{Hldw;mZBl#n5B15{E-tIku zo?ASkI{>Zkx0ky;*f9|2araS{$M(f*CVV(0nl};HvZ9K(kf1A%k&HC;=G&CN+se;N z3Zo8mrkv(ajBmeN={R0=99_9I^ER~LlN;fo*l&3QPYDv0mqzy|H<-*#o=T=twLq}= zNmh1bN|w#XTB+`rbC!g!s47=g7*6GaQt^vVzR@w~kk+G*=+yjb``pY|)u_WP(59jC ze==;j^{*!xG3$f6*#GbcB5p*ejr8Rv-~N!)i|U_lSiP|d-YH&XqzLo@`*wJyc}X46 zvsAu4$oC&@kF(OKim3hP;M~KqKetlIsm{x7HO(=+fewTIF8P z?br_U@4)HeoX_fXq`C%}>Ge9P4q34GXcWshdNb_9p?(*fnkFlNWb2zt$x4en;E#Wf zeg-ijW3!6Vt^EFF%2Uax7E6!c|7~aZFb-fdq1hd%oT=?MJjSwgxq(rt{W7v>Q$e>p z^#FX05WsnZjahkxa3$!HC)V-pi2vM4DqW-N=fisH(N8w-S&?{)QnAO_qf3H7W3Wc; zHMMU^_&j{pr0`t;C@&eK*jI0`q{Z+GSJPhGivGqOs9{C8=OpUFRdJ+j5#e^gthWT6 zIuw95`q_U4AleY6G);ESr zI_v9r6T=StsbeBl%6k-0pHi?<+{AtkassxX~?2~+G)xKlD)Gj4o6cpI54%T!v>+` zX5mj;{e@KW?D_rZrySn%=s{?GIMb6yQ-mE$@w#p2NGZlXxYR$5QG1-X62lB|3fdhW zCnZeRY4a3(YSXkMg!6h_R zsQSb!eePtGHM+tqH5pHcF4#s{G$q_ogcsi)#3Zg@cvm4s-kx9Tz_&aKR|>q#`OkV& zGnU~x1F<|d)14m{=Nu|x>+zk#L{4{a;)=i{vj|fFH2$@G-hJx(Jn;T~$?x;_M0y6i zR6WI#-&8?;U~SJzI#4q)X1JhN+D+YgmG z(k|<#6+VjZ0xetlpHHz~Oa=vu*J$(m-Ee2N_IFHKOUwOU=?hx24XkQZEa^&r`>0CK zhzm~pVO1SrX2|u>XU~XiJ>I$R8*5IaOY2ThDZ`E2d_`!)&4u9 z;>fgbH+0<&FF3kalcNM8g9cgo`rJwHXMg;|E!#T`1@?TKp@H~36Gd?A4$i+a+Bx($ zrrMX#f76|{p>Tjzcb+6m8&WFl-xj~cP0!!U;e2`AnQ3^Y{wn(AXB)SODlr_LO zz%mGPf;*FM;7A>66mnQCn>RKIYh6Fjp9mwE$IhQr2OF%XG*kosWl`u@(L=k5;(7dURE+ zhmgm)M5T?POZ{)EngDS$mD-zbYrUp7@Ih;0c`mrXmb#BwL75|(l`gM7xhWzK9@`oS zBBg6~wpq@Zo;bI8-_?5FbVctAYUA{7!j)pbT!;al=}m6}F=hpAAyjGm>-Nw5 zFJ!KVHM#Sazz7?;gSe>$jhVyYpE4A1>Cmvk+si#fLKGpb6Vm2oPM72FjIH5Xd^8e- zJGoJF%Y96b)tFFn!@m(bA>~m=!4^O2-DB0kS9OxfLeg_o15osXF^dhDRkz2i$Cn0a z11fK;jOQPzzIZ~npL&eGxSg=O5H*~NRX5|Vi~msvHOORT&Klcla*qXG3T?QIQ(&VT zZA!&#f#Fju5`Q|?1LO;r3FYnI{u1?9q$#V~-v$&%J| zOzf%modo(#IX-4k?35K@nHY-QM%e8=o{;hX?J-bA^qDds*nm5D7c=uAaI(%VV8ZwA zb}W`n7$=AmPUx=sHJMBqn`dCYfQx!-)Y6d5;a0F3G*NT+YtHFJ)4%j%gOvXGNYpt? z=XZ2FLLF5e6Q&{zw-b)H>*8yTGsFXvegvEEIQ<&&WI4gE#y!1xN(CImg4}h1oXGS5>$U6>ddqQQLCY>H@l6)7GCizH`@-OZ0h&KH=?_`IDn2CE= z4rX)5o@$M>6r81+{qh*q;{$Fwy(K{cB zM~fhGuO_$uB+3t;A>G-v@L=)%`BI)2xhE}stZ!$BA?Ncy1A6&8L_YGs8?&L{PO$>E zt>JdXV~q59VihR9gLez(Eb>_iC6zFoTwvG9Az<8{+Dy^Wf=*k=ZDBYGhKoAl|Dgm& zx{Kz=0PEl#jr45Yk%GSiIV)_f@M&&>Lok)O<2)-%O8=h@C-4XEvI0(F!N;~dcR}dW z&@|P?7aUr+oeg2!4S$>~>hLy+StUg` zqO&c71#!{v9M#|)1st-!I!;tUZ@MXpK_UIF~1;h+Y#Vr!UL?K!XUBEg}o ze=TwAU`?+&o+GSMf0~Y)bbwngx%p=BTxJQozfLb;CYqEX?Ybu+WE^OxDE;YrTxP@T z4_Q?6`WR==RqorfI$5$zc}6c@zj=Ivud3oiwXe-tw8a_@G2&&q`dIy0iqiD@lq%lJ zeRS-;u%hGhudd%FdAY}?7kk#nrgt#nSq2J8wEo-T7z{FIm8Q4fF8WAcwLB~{_?wL1 z*~Qo52CB=n&wGrW)@gWP)iL=7^d73vAKzBeuo^VI_dCV9SqWFU%hUy1iB45j#NC*l z7-{=jagBc<}lsX8rb_B ze-xI21n*WKUnDHbp*d5WlY|SbgR3Mfiyn47u&(w?6?r@PZuL-?m{Z6PtTAfR>b=db zGZ=J{Rl@hP`OLK|CH6*TUDl%g*IlpX*<2q=IJ39rCOl?zI#T`fVMIf5-uSq|NMOJx z)ppdH-hswg#QTSgw+I&)L(&fU9h;w_pW{e3%Q|4Fv<79l(i}(^j;nu82-^G z^>b`K#qZV5DbkNG(FvwA%Ori&oKvm;Bo4Xl$E}=ru*|4`>EHLa2CZ?vJJdeISCi_A zBC41BG~oA2YN>|`sm-`dX_rRrnL{ET1}Eqq?ZXd>Y+{X@apO1k!x-fE_2lSPlB!yR z`6p6ockm|efdV--DPzn_yD{qP#GB}*OS5q`*COWw8)Q3bfbAt>8(hee3ejp`_l|ZWujNJ?@ij=JQY7VU15f3YP)pL3~=o+-YD}18XcKaI2m5+%yb; z%2C#*I@l4m`tQny^|bzZobGcHDf2{buAwvaD(QltYSM>Pt{786bIj2-K;A4xcZ{9Vx%+8Z5ttP`&%81_fef2 zQ;jxZvGZU#Ns)SSCZqb1WkOU&_NeNpeOG6X?gUe_D0}!G0BJHk#(-Y#1~l;gzq(Km zE;!(Z*+OK6zPv!zSgWzAf~iwD_$h19xub{A zniVEFHGIffKDz}`boatl_uzo6_<_)y;OtEOXFaL%8qU*+WF=LFO~GIwP|HJK3N8YyOZu!QY(BrL`3+kL#?1&Yj#TEZRD#t0bq1fL%) zE|Hjf2zR0Y>l%>VXpS4WA9li&>lAa9(`CI07+twgLXUw5B-w8-BCWvR8GVFRx;++4 z?t~5lFu_!y*_&8>_JllaKV~R2&-%H#@~2?~py8}2w-U{@lOuZOZ*9FiF@GzeDqBDhPi9FKi>%PJBkyzrMb(?852Lm_Bd+jIGEeV#{gi zwtCgCP&j}PNi+e^;JMyosHzrO(6Bku+3)-MplqXeG4>)oIzaN^k)||5_w{4rfezpL z(<8oJnw?m`bI5fkam^n?@iI|C+1`PLf9;nO1rP8*i4;GFhPlMmxVoCud~#4x`zIbE zRrdbnKTz2VjW7-r4)k~P`aP0o#%OIXbI_afp3qrR^tv?_Dg~>EhvBSC37h#$d$faR z=0kWAoX5cEo=daaIT;Ui-k*ZL;CHpZ_0=K0on6JbBBMOnxP$5{hea`wD*k4;E{>@N8jL~mAhy~?9x@upI`k9jTC#3? z(~k!x6U$FA??QhcmG4R|Ar1vlPZZ^BNT?=ijp=b&Kk3Y56uDqW&h}x&D(Ug(`{U@$XfkT?0@d-h$#PNWfvyV3OrV^#MYSh;^2uoPDJ% zS(=$m)uB>O{F4K)#bG-Nb*NqE%@@|m;=>qrA&R8QJ*3I4l;$%G#7(+Aop1A1b`8*h zDeSCfdB1~~Og&m*mxA&`z2Z-y^n~th30JB7z&6#pGetQD9%EB8S-DBHM%S6}9-3ky z%CjAq2uV&!muFyn3hMm%M5noEn^$}X1tT|aR4(1bLn1;Y&sOf1#-3JM zu!)X!x#Z42&>ssG-z+FTMspp-3+{@A%PB4q5mh$Q_=IB71d8XBVCga;mFYI!@=9<^ z_~91&i`czYwEDIZ=39jBH)^{;Ok~$|=GH!OevjS4~=n|!S9dVsh)`ZDqGfGuUWU`W3|iTI>RpD|VKu`@Ku{b%r;+W-%h(x!^RKQb00T zx%j@TV5OnkI3_!&$|g^u@XL@)Auex}WZkl9o){vl*d2yXLehf5zuro6;2i2|avK&? zpSc2q!1;+FuU(QEDIZpqo+ZfsYCsB$tv5QSix;pQOlAf#E2u%6IMlVwm__d3Bmh#! zSIn)Rb&4K5#PLE-wvE1_f77%Dfb_g3&AEzTbFfvb(BQM_o7?CNBlQW9lTD+1<}lfY-Ja zoTXjf1jEYxe4Sei$61eel_q-Mm>5@g`H8{bI@QO>OuW5>fC8Z7$Bm}5w}qC$7uJWv z&yqhwge1^_d7Q?1j7`kFxxk2ja^acxYz)OC;H^{osB=NsJq=5d{*AsZCOHO0B)4BcMutLOP?`+`$m)^u5oH( zdE%_Ixhmv4`=tBAGP|tRig2y1E?4u1MMb*Fd$N#U>0+t^4ID;zZ=F1n2C0tg3D;$g zk=F9(59hBHBwm=&CCyslXX(%?hL6Vox0AZ`qW_ZGj_F~i>RD>BRW4)+$if_ z%f;XBgx2)iR&OO=YszTCG1YCh)#y()!y(s$qB%i48UK}j-yXaAL|mC$!&Ys<=28dkr#GafVAyKHiIeAcaGp zMI@d8Z4#(rPYX`8B7|L;OSAo|jGlqXzd3tjIpTf&@w|xkwdmGohQ1F|oX~e3^zhCc zAcg6T)B6@sChM2`LeC4dc8uQYEbG>dVZU}`OW67riJ0w;m2r<$6rFfB_m<{lv0pZl z?X#qHfuW1wNXcFf%(N&=eG7rEMhig1J>~aLR2M6Gs!6m;-i}7%q{MfewK2_?KLbw; zvHK`YmkVNr{lzcFjL>WJf5m2-k<8-~LUs_xz2eW>A6Oc=cDqUkyTvLWPf@8KqII_a z=i|CJMwDYAGL+9N`;B`rq}>+t&FS{wns(X8>pq(mrpSn{wvmwwj+Srr*`FUjTJLQz znXh5i;~n5WbJwRReR;LDsRGwN-WjU%M?tP9XHvk|1 zoLFLzL=+b&du_;F0aR9jKDn1g9IJ3?-iwdV%qY0Z{8QcMZGtNKYMDeUbs0QTUFQ9x z<^0?EBLH-G7f=e0$E1#R6W`m+CLyzRgWO2KCQ9!X1mV^-Vup3dgVy7fE?}tY-Gykz z0(dCLTiMXFMY{ha+uXC|;3f6*nHjKPuNNqN$>@;)Y7q{#V=+^DUY&@ z1;pE-g&pyabi3XOBNA?rv>Nc~(y}!JDM7-b*u@Z0^W9#F%w?uZxBJ%mpf&@-E*%(F z84t;JZ^2uUD(BXXH=TE6&(9AbU72S9X3Dh?Xw>@_?-egl?p2YHD`M@Bh{ea4i1{0R z>q{J~iO7&rjSyVUk9j%aY*xWqA)8q?*kF7eXah;$rqrlBw;)Y^`XR|{zI>^rTuV0U zj&pfrb|2Y%rf^_>z4cl2x(osTmP63@nz{Cq1iSBuZkmyX?{(1H!TL41Vqs135`-b@ zo%bT#$WGXRV_z)9`tsYFn(9Z4G5CV)BQ89+88wAmr7XsKTB_)M3!9Ene>ZCb=pO}L zs>wUg`;Uut0jzg`E9jmtb76`5uMC1;%9jwFFHtr7*R#g?{q_WL)=-=H8?!;kn~?8| zMzAnZDs`lG1{`F7-(p+t~$>>$#J7bT{9}WKt*mA;2qmth~b2AMS}F0c{jc%usC!}NaX#h_gatl*OfSTLL_)$$Tx2gxiM3l z($@qoLMY`B4w!ZI>ufxOBv&r!@G%d!L2Doi5gL6yflUAeV%Q?fwz{8`e?dX z(~!K&vrQuvceHl#v?*W9dCiv@AF+})|7P2+srDIYUbeMeZp}~6jMT+FQs=ru>f38% z#)7oTC)?-|-fC|7$;>x`9DuA+nX?8$Xy6RAtqy#cZ0yFO7sJbguN=aq(Bmu86gpSM& z%x(&UbuHYvJHCjAqno8@qsqq%k@iV{6+a#@iB*K63uX;&(l27})ky6x zKn6ig1^jT&Gi9BO)0WVM{pt&U9^y@AjZ-enUtT$6Ug}JH@ZzK6kcgjoCL%HNE~D{(bR3pRBX-d#*@W$2~43uKxb2 zC(xOCuW5QF`6Tg@=hf%53GkPtL*jGqipN;^m6PleTWcElsIeU=-@70Y6n|)o@BOm{ zAvi54q}2OR=h)@9-VN1ml_M%ACVz$`In}=|x}Q6CCw)}AhcQ{Z2&+PkO28PFrO1$D zb2kZrz(D5f02|ny!TZ5dUGj|2F`Pc`$K*{}2V$6MQ`XtPkNn40+CjlJP!(a6Ips(s zM+n5(6x2T{)S|}-;EUTwjVXB~CAeDUiE4GN-QsgaSo`)b3nL&nMk$U@$t9{Tgbk&g z{l_;0&itjcHj7ErI%bZ%Px8HrkO_FIkdBmwd+6bS?smVyhFEtetTA> zV_3_j7@cOxLu5wN#P9gw1?sWd_m6BSpgY=3%F8Na-`rY8+gj(yT`p1mmA=G(WXhE+ zl_PM~tYC2U3eYCq9#j=astxFUSDE8EX4zb~=Z7m!4A}=mVX$&vjc4tKU(ezeE}>hG zEvX&V+iwG1_|17^7;U7!k#cSaeDEkvL=a}d@erN;5dsf-iTzeXIoSyYaRW{NhZbyO z{{iw&!CMq@Ub|x56EUGlby;aqLdW#cNbrEaf`NCWfM#MXSMw)J=#xHT+YB1_sQp;r z1(e!Qs9&M!a&Zn%_M9=#zVG+ko6PA2M)mY54Cg0b4FWN(b0!{{W6O1VWy#c307h7G zhu`EFlo)7@qAT(k^Py`F068H*TLp@_3TT5xV2{hPZHkl(-95&B>+yoO210t~rQ+?c z#TNjP-887%iN4Guhi)`q!&VaOk@?sJ3NpC?u=kT2|FAI~B_{^VI5V(!+CkNhs z`f12vMgREy?qXjog0NhEdM%&*@}uEGlYPutq{-Hc8a-i;Z74@>kd-ughMl=ysn`bI z;<65&NDjYpMKvsGiP_sXyD`pgVqr9@0pCXgM?YlQ<}s7^DInSz+m=?@22 z3H$fO7$x}8{v@}#^wafO=Zvq6l+TuT)ZAE38%$?Bg5tO6er1VwF}DIF|Bd~H@ACuE zWVD*u%{*)0>us4-5Y1%%^p02(qfYC%4HLOa@Kx(O`27)*etTa3N|!K+x^qy#VIR{0 z6y4D^lgoB-?io*(vd>%~$-a5Eo9Fj-OHBY+L|X*znG1-o{q=q)lnU9@zIr6_IbL(bUJ^ktA!x?KzoV+~+VTZ@E+G`{QWo4EW znLob$Vw7r0%d{?U&$alBAg*4%lXefRn*qw^YcK~J@#pmr%)EuT3dxbhEl)cPwg$|E zpM0Ow@t^g+;D9gxS?~6}`{k3hms#P41%bmKg*SyiJ_i6uZlBj?e@v-&1NFmQs}naW zqpaf&y=^GYaj4gMshD*z(k>t~V?zjXpF#BT-z5SWN&y@N>PnpabX>jng{$z;NxYi; ztYh^%vk(=YasjpqrtO}xNr%j9g0I?D{^c3NOI^fHv5L{)!EAT7LLqc}q-C}$w)skb7VHl?0z|8NvCrr(G*D-@@dW=t z>Uy9#KVlMZwOY5zH!I<3e}8vqd7O!;d{_M9?{#}5VMRKgnZF)+xwo^s@&ZG%E31C= z>&qp_up)}|`LdkzPz~ThTtuA{??tpPk4rw&79A&_SUtiEHXGJ~oX;P)-U4Stz!|uY zZi|bry7t-zd}#ySk*y27?d|s}YnpjC_eiJFtByWq21U3P_Mb8B09u*ZZJZ`x2`wOY zpWY)M=E>@m3*N6fVkCZ5M_+TsJ4fd4=Z>^jYTk&H6trQlHY`M?k08>Il}Ofpv}|61 zSMPiBu}nzTBgh0Oq-_n zDUWiy0g#k_w1S*h*!R6<={ufWksPhia_%nb9IK{!18e#uKJuJdgE_pBLjGjUQp80k zVkD^mOzZ71fD4+0Su+MPm8x(vIf548&yF0F!s z-ZJJN5`kB-`a|9!#(ZqXm>1G!Eq8LrM+I6%=G#(ye>YBBG3LqdUZ_G%@-@#GPB}`j z^eTgAgQhf4Uwn0&BNimHs*(10OHg4`SmMQpp z=gzQ=*YV6WK@7Lg-mS0T2(p8{qm;uvjg>Yfi&+N72lnn#qE70{xZ#Rd7>`24g-8@1h(! zyY`nT?zjevmc1g!5>2MW(dZ?nQQgz6Bh_zB>PJSk@y$xfs=v)o#!2p!oAh27KaQ zWJ9&MbEnnw-~bo|VMhF3DMQ?j)fzt#y$G&m4-16J>ANwK#_6-*^A3UkHk`O-JSViE}i`Tz*?yN@#$(^-u$lodvRZQ zw>!YIzHwSu+R0nrI6Qs5=)nf_YNpUoxF4U^h~19^ao``U=yv-^TE_7+$lOz`>&>x< z8?Z%PGTzH7B7U0mKEGp`k!RagnjW|g{An#ekfz#zI@P+p!lZO^hkGuRcQN!v;>yk` z>yR2gX}m&wQk9HD?C>s@I}%` zEn>mm>TPF(crQqJ%`YoPSokWsjC1M>bZj}gAdfX6B+0hl7F+mgH%>leGtCR*PH9xr zknNWX2Rf7QE=&yC>_yR$iq9)y^9yTXAEjqpznCsgN(9Iz+SRa|?i{aj)^-zmKgSI( z*=BuWyyNx%N9+MK(UCn3WFNi-`_0Wr!b`K&@JvI?=H(Y?1Gj#85mH_j`)CW5JTZ@1 zM5|v*FWv{)3n5K*e>~DN){#+n3@H)slXLLi=K#VA8NBp}YcG(BeKm@ItC4akxWV8S zlVHw+)}>_-V2u2ue|Rt!TFxKO=dFYiGy$-LR@0`ng_(JX#}l@MAR++}5@hv7nZJ5i zI(txa?!qrO(Mq*pj|k7*j_zoZ!8u4Rxdi~;^{*i(#`!F^#baiKuJ__z4#nrzas#V{ z!sCrX(ub5c{}TPcjid}3-26qaJwsuR>y|CEnmM$8&&h*Go*#e6#wKN zGfHuK|DE54nIom>SDM{NQcdvaF4A+nU{!vT31F4=OLv)mt#vW|a4+YprExv^r{y!C zMW&X}5;IkYin7PI27rv!!u;r6t8$mrgO`w}S{gwvJpePv@c!{RuIcVf)|6H1OyVhx z-YU1$65fw5U|Y&>ZC+qz#sRoT55e}l!l0F%X!cOVIS)fC;^Hn}*)!96D>^?U8+mN% z(p9+892V*coQb@01IZs3(j7ZW$0|K{DX66X>P+V7+#^DLQ(CU~2o=?#?v9ZS8i zdfIg@$S^-#XW|eDx|ncD#D|A)^3g=B>viXKZud-i!{8{`xKTN#e5-+?Tp&xD+=k>! z=C9n`x^uW)YdPuk^-AU9TnPcoX@TvYNA&Shq(x8z_2X~3n(9>8ksk4lhw50yRxS=g z0I}Wkw37h}RBN^& z;o^0^7AZbjJnC1~J5z3&+Z|7c{v z5s55=6kWyStjbK|v^fPIb186zUl8|u;mOBh`yd>Wv zEcN&-@q}zC1PpYP2h<-fjis0{9~@i7_Yq-SyT;L(>0P1U$h)r5_m+WuJnrKEAufu0JGL zDjHtj0ihw|6sfRVyro@2(Sk$OlY9Cu960l@PwWp#=d8gL;fb2qMsiQm<`{4K%p2@= z@dwh>p>DrFe8J-}Z4B-Rw5djkBilV#NzGz6$@R@}squ!jp=1Z3_dJ7BsReo7E-Wov zh821pF7unD6}#$hMp@*%V>}W@Lx|scpE|{u&G8TMBV`9>p0Z9AO8DzHaAh`*O`0^C z{sggpJZ8>ddVQR$J#KC1u;$8vCWBY3{&;ECcu7rL)`tQ`v{kt44sn^=OOxkXZg1a3 zob_fz#EAFBrltShyp!e@xwL_WI^uUCKyb4q>Pdk6aj-hXGA2O07N4pzN-e8v|J?qu z{cF}`tj-S*emxKc@&aD_P~0YL&DwR(=EHP)3g+@wz3K*^N}V6TynGy_)HJ_Ooq5&W zP*(Q_n>J!up_2G`DwUQQS_P=j0V`i95c<^K*a)fLB2UVkBVix_>(2l|ADB zbf&vKw9eI_}UdaKD z(Cyy%m ze_Wtp7M%d)J$KTOGhE+-QTmSHj(5i@;&y=)f%1TbkrJ4)!!8*+TXsTovmvLE%7U)p zX!)x;T)Qfvp`&7m`v`sIUI+h}HgNVjw-NMjb0^M(`DTvt!`ese+k$~qk)j4=h%6-i zN3-FS8E#cGl->8ZF(kUBA; z!c7;Jg~sT(K=h#4v;^#)uLVbP;?8I=XyTdIZk{A0=@y{(&~_Pv{*c9c80ca{_J#Vk zz|Yzp8gu9O`J@iI{X+#Ytx*hBU09jPh(gqn1kqI7B6@u9ZXgt&~ z&3U;7ywL#rel4@4Ylv#c`G*weg(b(_s;uSB!S^kFSvd<7LDII_z@t4f@F^I=`3b-2S4!+#cB6S7aji^SfB5wcmg3z*a zGw0cT%HFmb58;@KrH=+M2>*9k-zP z-)vnF%yRbHQEu5Nf~_e!-1(DW;x03k+WsE4nAxaTMpUWiQoX zDaD3Rffk<{a632QQ5EVS1M>-I+PjE$TqGJZ<{Oytmt4;mE8$3b+=vsW;qO0Km!k7t zTbiYyK&906vXJvTUtIUen%HH%ti#C|dF;R?_Q8($*4TWNuumDOQ&(Re)#R>w|6qLR zO8&DcYx3iFfpr!Rw&f#la(Jg$x**rt7n{FqFAAnM#Cv5o{%2F|?pWk8!x(GvlXW& z&J_OLo-wK{wW4@3aPFrz?rI<3PGGAiJajHt;UJ0M;hU8kdl(Ek&3{5SJhgeA9YuJl zVy2)5Y113xcctH^FSCku{?~0Pni#qk?F@qRHD_nS3B%)tr!sot8+^g&`M>OBSW%{? z&bG*Y62C@rYrGe4;39oktfV^1pZvTeX@P|PfmNf*;y9O~>5vG8N0f&D+0wC}cJka|X;WRjE@=dycZ_?|dYIgQnV%fW-8Gu!RdBzkm(M7v0VctPB%*>=t+b?P|u zRXOpr1{VX=RpmiX?Nm`vA6-T{sP+GZZF;sQM~@mMe4=)0Pff z8nF-D8M*_nR~zyFSu$mF>%+~oh5TJBcKxWoubLWFh;b{Ah-!6vpDFtN=vs4O;{6RJ zV1Q{vbbFuA6GG;m%^F9`Cj-3T948TniK!-z_)n~}*6VQs*-uM~PH@2VpZ7V#MRyN% zfF&1c&YZ7V!jRlC+326(0LtN1qR-^?*bxwfE;w~K?WF;0Bm?C%KGxn zjPM~=;^v{l`HmFUUtNYw(Au{OQIxaiJV@zRx(q6>h?6X>lgU)QYin)q5x{nI!8&KJV98GH{+xX8H5Y0_I96gth1>g5Aio1tCkHVj95j&LP|rY~GNeTpW7X(2O70V_>#Bnpu__eb1d5e4jIAefTW0zvKHnJ7`i?ZONHjXtk_$*mEEt$yyTRs!!v)Dpum&b{X$=evcZ@|YoV8DaIjN3wpEiQzjXHD%R+&&Mj3cd*pA3CZShwjd z%R#Mp?ZTHY4nV(jZ<@{V5f9Y6YA*OVMH{VWctNec^$yKp*txxf%7cF+q|4gx^*BLi z1#HTt`)t;DvdAf{MT#bYqNM(CX->~V@ZY^h&|pthu6G*4i}%{0-GK-w$($vqqr=N! zxMBSgIBQrO@me}d3AxYy!Z1v|wu%B5l0Q10cHZn|LU=5(9V#cYPTjntNu zOLjGku+4Qeh<}8_62h`}BQ{v=vt@TikIm z@Pk^1m2)_)IgD>OXxkYA#s2B?UtF?i2X|!X9xlQDD#4+-JxL2P9X-%BUA%F=<`E}0 zVl9VmU*;$9q)Zt_9r+orFb11J1a~&ros)SSe`y;N$S(oC#cj$=u z*?jECuGez|=cS^#eU1AGf-4`%U>HmG(JI%kaT~UV1bf2-NB@U*`|j7wXOqY$&wv)= z;GKO=XZWDMJlOwhvny~f8X_NAd@n4?{lnAUT1YN}WM19VE}IsFufMx>J;+}w9InKq z%ch?7Y;qTOw#=sUI4xsHe;PP4KL8eB@B_k6SLQG`1kS|sbJg9pDuiXyTc&bm^I?1g z-kCCnsgEk0P9_jOLLMqOAc6|6vFH>fuRwD7Tm+=o2PTCe)=I*^qA&N8TP3l5IucV# zZRh_lT}UAQ zvwWzaAAAe-pfGpq>DepO z@qFmF65{=5qPI-vd~)-5^ekbpTm9{fQ5csuTt|E~AD8ku){>f$26;V`ZrYPH`xVNG z&n7zQ!fu0_336YQZQgH)1m^-gpi)RQ)KVd%c+ur9#cwqUsXwt3v+u5#qmJZ}M08yI znJUqJ2|=dUnPQb{yPrZ~s*OTuJe9-$E-_T+@`5Am_pdg(h#4c#ygWE<)#KUfb|S6) zkB&*qie$-cdye@_XyY?vtUzAN8t}A`Dbkoc0m9I8*C~w23kUJ+b<3XZ4R)YWc>m_P z59K`H(OWQrk~g>PP9-1*<`9Ya(Q$pd)QgPn=dkWg^*@;7cyYPO7AcuA+ox$$N`1d zAVdS}E@p|bNZ%mfT^73lOV^G zAE|T!$xztiTpzya906KZ*7&R*bxzZsRTyqr^+1G=I=}m&wW0W$ z2Fbw8Wr*|ZZuOP%f{USS^`9e%;*6g&o}7bG;`evFvIc*D;zf0OHI~UD=ypCTreH9o z3JMvIAs-3L@r9_6n*5YcyLffGcGqR+(qaK3ddB4p!9UXJfzA)@wm}B8>Ww&KjpXb# zmUqrD3t}~;;ic$xlQ^87vaEP77=a69kMQX`!+~5*Iy8?}-Is97{O-X07YerMl z68XjFXoAhQ*H@yFqwbz76U_F`?Lv+AR^>LrB$zqGf*9}y%6uOwVKE$|_fD`$SbXQ4 z?v4+NXHgo%oyQ5r6eC3(`TDe?)79yNM}+-0XoIRHqR{n|ZKw1FNi@rYVJ1*G)f{fp zZu0U408AEG63NWgo=@Zbtc5e-{Eo2zF$-)X!-I2yLd_x$o{sg8ie6pNI z_$^W4NjZUti&@!97xysY(0f-S!Nb)`z95Au2_bST^$hdQ977lG{WdvkUTrO*XKM|O z$L}JGF`wqce zWI|o?CxQbi@UzAEs`~}u+=Ee0@9eWXLKxiNAgXkB^7_T+^fiEL;b&l>c4YN|t;6B^ z(+t?+6!+jaPqLg=%C< z-M3H&lTpP2;nD-qs*@p?T&DUZB9w_>4f!4eYmJRyFRIWOJ5Zyz*MMIt3*K2-W>>wz z#pMsorB;-4xNhGO{LBW6mlKd5H%JypIp-SDBXqFFhBUAY?nAbH%N>6LtKJ-&kYC+kzCq4TwvDQV{Hg>o%{vqWPiPRL(o(x^N?9vW$P38yW` zzgO5ypQ#Ve7Uc`kBd2oM%oyY8J@Xu4@6}$n#u67K{LKOi-K`psu*OF#NqHJZ%qKN_ z3iC9jtzkAxa8l$|WRAndsayTX1K|A~_uReATf?MLG7R6WhC2q5G^ynOCZ9K7(FL?% zhxQx;Ua^o0Eu}p1A)#YiNXKFC{Mrb1QqNh-4al(&j(h4etx_eijE#(Ea! zn=uEZN^z(1f^e@;t%o?(846leonbA(o~>_If@=>dFJ%V-Q-iK2@~CttT1@JdC#;Nf zVT%3mIbsfShB10R2gyoXv?=BydZ0ORL!rWPpUKV8qm{vf%tsxaB2-!Yyj9)+Mv!+Y zZr#*3Xt*wOuiiYjW6ExZbNN_dzANB!l&3#vSP*wu=6daSuM=>#Z1>&u_yu9db9Y&= z-=>1ZXdQ*zayn(wiZ#CBm3=PP&>u=n-PB@$y&Up)kI2$|NG+r~Yz>Ug(j0k%rvJ7k z7j3gi!S8%l_z&~ujJz?Fn*gB%Z?<`-7jqHe0rj7TL#;zq`P`)@)mDb)PgR_$;&AlA z$z215TR97hJ1n^5Y!sb&>h4Zcsvl5>1E{Tl*)!1`ymOAtICA`Zb!F-CHRc%0e2yWxwTgVH`})AE{kvzxVGdDqhRX-ckSzm~Yp3%0&tkNu zxT6Y<8SJdFp0qs}wp!faDInwwcFuyy>1d4D7=H^&tt*P73sA5Q$61M_@&P4RE z1xl%4ot67%BG{IKyyQq8ZQnuBvHBb8fPlTG8oL$6vZk&h` z2No!@E{|{&yUgzq*nYn(&99kMA=Za?IpU;)jOFmWX959viGyUm;y|H7Tw~`w_~FRh!%Mm&oB9KK?z zGECw@)14_i5R%_b$)nZ#cFaQsYtz6>%Nxj{m3~n5`uNpS}FDpu& zA0TsHM5XcHuhA}$tM`d=zwky@vvHV#5!-n@&4GP{p4Kf>pGI&Cb$;>!R&k4p;?~o8 zX6!b#_OsBIx4ia0{dNm`=a@PVURh=PoqS{X&N=2TlrY29BiMh%Y>3TwxG2nRdgwNs+&Y{egnasAxc=X? zx4SLVCDR&zDVtrt&)HhTU)HTAWJ-VkE=ebJ^#(l4Kj#?an5SV&j)NH2pnP|!XtO3y$YV9BSJ`X)RFyAxbZRFJQne)3`mFlelhgxJ8Mdg;`iT6U zWV`vl5Lr{*9}7=IHdOCfyA9uXNU4?9aK%*u%7}PPCQtt-ER?s$^E4GVoiBf38^epj z|12GhgS@nK4fdD#5C)wg>wm79&1!D@UGAl02}5dU~)p0ht5(9Ges3Q zOe66~fXA9&e=+#YMtTVGId35Z5pPB$p&r@L*M3ucsm3_%d9HP16TyCGDPi-=u};TH z@3hv}uUP|;RofaK<;GnVgt)?|!_q-jH_06Fg9kKOx}YMUGfdt0v@R{`dLn8+5DwA% zA+y(W{wSp^5o!xg5XiKJiYbgyMxD(aUaE4vuH6*eEhq0Vr2GTZ6n{ClfT1i&iAkjK zy9yJ*8{bX|_J?Sw<7A|!By$);h0ZEGK)*f#FORrP`X>bO7|iG_0Au3|r-)G~=y|&I zu)|3NO<4#%^VQ8FZ>GAdA)qr%gGoG=@EBsuW z5Xx07ko3e?E9EcZD+fnWEOzDlRfXa1BcZ}^0Xd2)j6{6TVhCA>nt(<$&|2iP75Q!#YXMPLFtUC-bikYFIifSdNcbJe zd{xt~RTmlNKO7}&ew14w^w5-_6wjmV9Y(4AyM~-qmqbI6s3Y@(+6sKuZM=<7G%1IW ziVvs~f^7S#S$uZ78itjO%hiR`ZHk2xaUPN`eRX;Hx`_M~V>oL_mk}+;*ad+;Ie1h| zjyNqRN3|{zBmIE-RcijY6(6cR@!y_^v^V+i(Wh5U-_8zEzWccIQE$?Dt8MbkZnM1I z=5}ht_79}(9`-kGY{X(m3QJNMfwox~%^FJTI5uQBLw+4wIvcQ_y0g!nq5W-5!3i<$ z-szkdzIK@dMvQUz-H^_wX>9kzC<5D*IQ zhp^UI#y`hiTVuJlE#_+R>z#vsJ3h1n97Bz3aF_BH`=BdA(YV`EkY4?oT&El!&Fo-N zLM~&ENnc)Hxau34ig}umF|^2i-ddmn3%Ovp*Y@tCRPxQ3hikjU1rg$80)i*i``LSw zW*PqxU7kG2v>u+t?cwsakS?-o32`5lH##Ax?@aT)8b+mm{_+mBk0vnTYI6d9U`YWr zO4qRVr(K4bQbubXts%;pLU2)VRJuY=`7jUfG4EwHO1RN`I7=;u$^9$jzZ-C`G~n;X zBcu0+3DMQNt@cm-ZDp%;Uio994k6d$shB=TrZz-oN$t1IIF1}R!R*Y@l5R;C^Za~B zDydV~r4!K(Q=*0-B))Ifi&MF7uX*USkzhOijBU|+NZpHj3Jv!qUXyLf{$QVKF>tlgU`W?stW`(8XG zD{gr=t5q2*D{{rKbLz$sE=2!mX<$yvXd{@>l`<}*Z1Vsi%<4C&cZ{j9YT)hJYtE-n z=xns{vz4rMRH5My$Yy1jwRPjS#l+vg>a6k4tV>|tVS~J$Dqzo zfR9VqJwsnKDM$|dnIATv3%g@4L^^4AnUyjpEG#}KzDP!NhSi6xwS{i}d0zl(glh4+ zf6iq1*<@R@EA559f!pw{fv7656CAUG{a1Ddlol|s`w7WK*lybWb2*Y4f($aRPLPWh z`zsQfAUp2;EG4QtiLjs*$^`=e{?PBT5zg|P^Pa9)jOVzl;Y_^kIv7E+rHG-wDOd=O zvz8>B{>d-oIbDZuzsf-ke`V;EfR*=eTOtAOXl{#=6vLY+BAX5IZeIi}Qz)I%Oy$mD zRYK5X@C6YrPKF%*i7_2%z$F(pc(!}}buk>mTMzc22@QRQH;T64_JuTt?c+Q=`GR4zUj7dK`#jQF}eA?VdLu3uf)1V!p z1l@-4c~0Rpf}{lxf{V(d*yc4$MsI7anvKQUQM`w!Gwb1|3o*Kwp1(9D-BG&I-Vo8e z?YrW1x!iX?(vJqd*s@3XX7PT%n9Z2XJV@vmBw)+#Zo_yPqX zB`1wRBYN4dWO)>(O#qfa#U^gzljPv@>1U@9^Y1PIw8+&9` z{)hQU@T6S+_d?)jKh4ncszFXdw`BK2t;>3FuX(muK0-Y6&9KPM#@;2IXc4~?78_7h zBb*9oxJE;RFS<)5Revo>Qk1C7kXynF{MipDBy8AO!mNgt&$Y+rcrYE#?aE` zLuUc#9vAeSj)WrPa6p)m)pv5(b!aww6cv1f8TUK%MI@Dz=fXl8CJP1Ghvi7%XX!yN z`Hw5D067&k2|#azgsA3V`mkxKNm(NziMDw1FsO9n79js|>|+}gR4c+pdx{9fmkJa5w_E|&LuTHzcY(#SVk z7VxoFxZo&`^R=zq!^>m=VI}1a_=AsVUzf=?q~M=qN^LS_?mMW#>Fol^rkS-V!Dlv6 zG$M?N%VZWcU4a(VG}M7;8?nr&q>A`{$K8WWR@j@x)J68fq< z9NWI`NKTb~aH)@ZG?*^E6V>iE0#kNM`}Wyi)bJvvScC!%oG%#(_uOGO@(Sp>N6>(w z@bf7aImxYc#k;|;f~Os`?YKn$)5wkx{u7OE_nS{?ID|YxLf&>UG^FC(J0gax|5LN? z=T$kp^M_84dm0VYR(uoLz+N4njKo9p&->gawpUeWWPVE3>ofR1P3a&0nI5liHLmmx}%XB79#qOiFuh8#lDPYBHv*qq1kn3KmzdiEgx3OR#=$mL=Kp zpjk=R`=rGX1Wg)e@kb+ene-9v*T z0i9hU8zbFHZQ@_ir(JT8%wmf>FA}zy#GTZu9q5hozwcVkrw_jc;kYRQF(Yodbz5G$ zbnLc?UPIUH&?8cyPrXJ^jG=Cm<0Hn*$<(nWY|O7g?G2BOKd1#-Yemb$b~_n1jH@m} zb<=6A9uA)Ps$ZtX^HelB>keeI9zSal60e zRbVQ;+1GdN<+Y~v#`U*NC+$j)1hLy1gMwhA$ifrGqLvQH(@y=i#ZDz+&63=WJ3ly{ z%2i4&M<*;0*p0P-Xe7-k=ZYXeL?+mVqm$eu1{~>+WJ2c8h0bsAO~qVgGR?7uT138V z$li1QBbHrcir=CICkjV*vJuAH;I_QV3umD3N4W1)Wd*iMHP64IYc zORQ!+!#h(+b&qL6_m4NT`*)tN|3;%~Nu?28$821_0~%E zv>@WiI$l6GS9?EUA-rWjgzW=nl_t9?+FKq-Ot`yW=go@3o?gL67wGZT8f$F}W5o8` zvCkHdkA!_x=HHKI7u*p4Odne|zdr204P-HQkEvlD5ABJCCiBQ!yU(z~NgzVSXUjAD zGpbht>1#iX4)bV-wDO>Dh6~X#wt1rKmyYo!{@kmTpbVUkEU;%v_vP^0(|3Y4v!EtA zVt(e;gxS(@9(23jeOXD;)Now<%32T1mUc_Wy?~l%Elym>1*Bv$!Nok{KSB(M->C%e z&=3ROE#2k7LV67W3F{(>a{9eTN{Mb6!R~dv02iL{iObmX&|T@=9v;PERkze^i4{F2 z^i??aOk$R+_h`3ta^=_bGZZFjz>yZb|t zXI+YxsD~O&QTf^Y=#PpB)eD&7YI;2J{7v?SNeKO|g%lK9%`f_*(?b(2@$XM`syycR zt+@p>mKpeQFPkH^tJ|l3@AY0}bs1HG(n0B;;nU{b1D!M!suwqA7{`ee#)$~d< zI5rpf(XZ}lN15>lTw+1?YgQ|BA~|9DEa8IFQa^&t_v~uc6ihYm+?jyu7n=MqdxtAU zJHMMNPmYS)_}l^S{2p)8)w)do+S4D+O;Jv7Z&am2Zgu*X9-9aT?@gMAu`%>3KWn#p zbR-ilWPS4W3HI;yC)jOw8;-VlUa?_fk1*m59pKd!>u(8_>dsE3R+WH~uhMniz`(No zG$pV4dC-cpqXa_aEF*pKwwi zDmnyU7+X?Ic2N|!EGK}&d*&1aYXaqiu9M3pOC-x7Ar~8_HiG#Am^3sLbZ$sq3CM$I zh+)Nqm7MbUCH$rAki+4O_ncIrU_BY(A;9uVY&T@Wp$A&?ehPW z{IWqScfiAbS^C{BKkTkkPJ9tl#rly5kxL&m_z~XCQlI65b|TWMk&2XfA)P{cM!~eB zi>fpj=<>qx_?-st*?nn3JG=w#L2kw8EsrGXf~Hm*t=YhD$aT?`J2s2)(*=8{2#ZB~ zFn%+$QB#8?x#@#-hV7)oxm@lT9*#uy9`};XWo}Zp4LSc^fUoARZ?T&`L8g)}Z|5}! zMlXfJS@TK=*S#mXj`CebNhf!KY^0bkKYW^y#qAZdO_<{7KK#Iyb)cnlix)E#z3=bu zGmCFOyBMd86aA~Kr~!wI_o*V#|z7O`54AVhpwA}Xu9yzAtI*2GIn@@W5`5&0PuSg z8aipHgFgCBqf5U{A7}$wl7yd)NrX)YBM*{9KlQHHM_qai>ZZkqVE@pPZ2fhdxm&qg zyKJ~14aU8Ro6Bpco7_ZceoXT=cFP$SwKYx&X5Ck{iwy3T!}>M?8kQ(Ht>s|-z3nJ- zWilK0+%-jIN3%?ijtv6y2EjEwC>1X*+HFQ)cMQ{!T)x2c;q^3l|UrTFzf4Q>1ZOH>Cc?4yqH63gZ)E?= z2Tj1Rrp+cryHB0F+ApeR%f!^|>cV`|3#7&(;s9)ZNVR{tfgFgKom-*DGZwN*oGd`~ z!QHqj`)#jvJ#tNms^ga>-BX{g5oqh!y$I6U1NbkaFf*~y2PZ-!iFTQMGZ)xfMl@7U zaM1;-ueQWXWjyRQi+z87SqMOuoUaT}#@kR*x6SK3(ouL&vD~TRTqq3gSVG=RV^jIlpn;XdZzpK7USwWVTvfxA7xM z=0NM{8;b_9|NX=-^HW}xQ88Y@I^pO9KeK(B)i0A}aW7n{Nw6J(pVQY`)1JY$49xsb zRZEJ2sChVDq6wcO`;w*+sCuKLh?sF45NGZw6#cOu@9F+8%_Cv8PS533;|EMdb;#@G z{KNP$p?mea3Ln(IU)E8fbAAh5(ei}NLD9^nAYSUA@1L6=v>Is?3*DLhM~-QKqw9vF z1?>$$DZ}cD+?nbj_h9db4q%CQzC7Ze_bk%61h&+!fRoYAqzJMfApB6qG;)rw57M3a zZ`aQ|5GHDfI=RvKvSG0Q(9HE$*^IN0L>RUxh3&GkP#w$qLOsaK@zZEknm$(x9-oEg z+|uC!(1S{rV-4NNxxSvj?pt;CmSz&6()sCIhb4_a^bS6xQ8b3Mb$?i`?9^_H*#^9` isuy(4;g557lvSkxujzf$Q??7>*WrWC2gv(;68{JKrhBgd diff --git a/assets/images/realloc-645e17306212937fb3db8f48920372d1.png b/assets/images/realloc-645e17306212937fb3db8f48920372d1.png deleted file mode 100644 index 5e17b5a53a9951103fd797857748a4be32d0c9f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432172 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 z 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 on by Davirain

      - +
      + \ No newline at end of file diff --git a/blog/ada-and-pda/index.html b/blog/ada-and-pda/index.html index 17bf4993d..d5bdb3ee0 100644 --- a/blog/ada-and-pda/index.html +++ b/blog/ada-and-pda/index.html @@ -5,7 +5,7 @@ ADA(派生账号) 和 PDA 使用 | All in One Solana - + @@ -14,7 +14,7 @@ 通常由特定程序(通常是一个智能合约)关联额外的账户。该账号没有私钥,故除程序本身外,无法完成数据签名,无法完成完整的数据交易。

      • ADA (Account Derived Account)

      由 createWithSeed 方法产生。 有一个账号公钥派生出来的关联账户,数据签名权限属于主账号。也即,需要主账号的签名才能完成完整的数据交易。

      solana中,根据数据签名,决定了数据的真实所有权。即 我的数据我做主

      本文主要分析这两种账号的异同。

      地址生成逻辑介绍如下

      • PDA 地址生成规则
      1. buffer = [seed,programId,"ProgramDerivedAddress"]
      2. 对buffer 取 sha256
      3. 如果在曲线上,那么抛出error, 如果不在,那么直接返回作为 使用地址

      createProgramAddressSync

      • ADA 生成
      1. buffer=[fromPublicKey,seed,programId]
      2. buffer 取 sha256, 直接返回

      createWithSeed

      区别在于,数据的托管使用逻辑.

      • ADA 数据签名权限,在于账户本身。即 我的数据我做主,未经允许(我未签名)不能修改。
      • PDA 数据签名权限在于合约。经过程序签名,可以修改 account 的数据和提取其中的sol。

      ADA 账号使用

      数据操作,有配套的函数对应,内部包含 xxxxWithSeedParams 类型的参数,完成对应的操作。 操作数据,需要 主账户的签名,这一点决定了,账号的真实所有权。

      • SystemProgram.createAccountWithSeed 初始化账号
      • SystemProgram.assign 重新分配owner
      • SystemProgram.allocate 分配空间
      • SystemProgram.transfer 转移SOL

      PDA 账号使用

      • 客户端只用于账户地址推导,不能初始化。初始化过程在合约内部完成。
      • 因其签名权限,必须在合约内部完成。他的操作权限完全属于智能合约。

      ADA 账号使用 example

        const seed = "ada.creator";

      // 初始化ada 账户
      let ada_account = await web3.PublicKey.createWithSeed(
      signer.publicKey,
      seed,
      program
      );
      console.log("ada_account address: ", ada_account.toBase58());

      let ada_info = await connection.getAccountInfo(ada_account);

      // 根据是否存在账号,决定是否初始化
      if (ada_info) {
      console.log(ada_info);
      } else {
      console.log("ada account not found");
      const transaction = new web3.Transaction().add(
      web3.SystemProgram.createAccountWithSeed({
      newAccountPubkey: ada_account,
      fromPubkey: signer.publicKey,
      basePubkey: signer.publicKey,
      programId: program,
      seed,
      lamports: web3.LAMPORTS_PER_SOL,
      space: 20,
      })
      );

      PDA 使用 example

      客户端部分代码逻辑

      const pda_seed = "pda.creator";

      const obj = new Model();

      const [pda, bump_seed] = web3.PublicKey.findProgramAddressSync(
      [signer.publicKey.toBuffer(), new TextEncoder().encode(movie.title)],
      program
      );

      console.log("pda address : ", pda.toBase58());

      const instruction = new web3.TransactionInstruction({
      keys: [
      {
      // 付钱的账户
      pubkey: signer.publicKey,
      isSigner: true,
      isWritable: false,
      },
      {
      // PDA将存储数据
      pubkey: pda,
      isSigner: false,
      isWritable: true,
      },
      {
      // 系统程序将用于创建PDA
      pubkey: web3.SystemProgram.programId,
      isSigner: false,
      isWritable: false,
      },
      ],
      // 传输数据
      data: obj.serialize(),
      programId: program,
      });

      const transaction = new web3.Transaction().add(instruction);

      const signature = await web3.sendAndConfirmTransaction(
      connection,
      transaction,
      [signer]
      );

      console.log(signature);

      合约部分代码逻辑

      // 获取账户迭代器
      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)?;

      // 构造PDA账户
      let (pda, bump_seed) =
      Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes()], program_id);

      // 和客户端比对
      if pda != *pda_account.key {
      msg!("Invalid seeds for PDA");
      return Err(ProgramError::InvalidArgument);
      }

      // 计算所需的租金
      let rent = Rent::get()?;
      let rent_lamports = rent.minimum_balance(total_len);

      // 创建账户
      invoke_signed(
      &system_instruction::create_account(
      initializer.key,
      pda_account.key,
      rent_lamports,
      total_len
      .try_into()
      .map_err(|_| Error::ConvertUsizeToU64Failed)?,
      program_id,
      ),
      &[
      initializer.clone(),
      pda_account.clone(),
      system_program.clone(),
      ],
      &[&[initializer.key.as_ref(), title.as_bytes(), &[bump_seed]]],
      )?;

      // MovieAccountState 定义的state类型
      let mut account_data =
      try_from_slice_unchecked::<MovieAccountState>(&pda_account.data.borrow()).unwrap();

      account_data.title = title;
      account_data.rating = rating;
      account_data.description = description;
      account_data.is_initialized = true;

      // 写入pda 数据本身
      account_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;

      参考资料

      - + \ No newline at end of file diff --git a/blog/archive/index.html b/blog/archive/index.html index 759fccae5..96aef2370 100644 --- a/blog/archive/index.html +++ b/blog/archive/index.html @@ -5,13 +5,13 @@ Archive | All in One Solana - + - + \ No newline at end of file diff --git a/blog/error-after-running-anchor-build/index.html b/blog/error-after-running-anchor-build/index.html index 1d4b65c30..ebe38005a 100644 --- a/blog/error-after-running-anchor-build/index.html +++ b/blog/error-after-running-anchor-build/index.html @@ -5,13 +5,13 @@ 使用anchor build 依賴衝突 | All in One Solana - +

      使用anchor build 依賴衝突

      · 3 min read
      YanAemons

      報錯日志

      在使用solana-cli時候,鑑於一些依賴版本限制,會用到cli14.xx(主網版本),而不是16.xx(測試網版本)

      例如,在使用solana-cli版本爲1.14.17, anchor版本爲0.26.0的環境中, anchor init創建一個新項目後運行 anchor build會發生以下錯誤:

      error: package constant_time_eq v0.3.0 cannot be built because it requires rustc 1.66.0 or newer, while the currently active rustc version is 1.62.0-dev

      報錯原因

      使用的solana-cli版本在14.xxx, cli內自帶的rustc版本過老,無法編譯較新的依賴

      解決方案

      1. 升級solana-cli至最新版本

      solana-install update

      2.指定依賴包版本

      需要在Cargo.toml文件下指定以下依賴版本

      getrandom = { version = "0.2.9", features = ["custom"] }  
      solana-program = "=1.14.17"
      winnow="=0.4.1"
      toml_datetime="=0.6.1"
      blake3 = "=1.3.1"

      運行cargo clean後重新運行anchor build即可解決

      監聽程序log監聽到兩次

      在使用program.addEventListener()有可能聽到兩次相同的事件,其中一次的txSign會是“1111111111111111111111111111111111111111111111111111111111111111”, 這是因爲監聽到了模擬時的交易哈系,我們只需要在監聽到該交易哈系時拋棄即可

      program.addEventListener("eventName", (event, slot, signature) => {
      if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return

      // do ur stuff
      })

      然而,有時websocket訂閱也會多次返回實際簽名。如果是這種情況,您可以使用一些緩存解決方案。例如,創建一個具有一定長度限制的集合,在此處添加簽名並檢查該集合中是否存在新簽名:

      const handledSignatures = new Set<string>()
      const maxHandledSignaturesLen = 100

      program.addEventListener("eventName", (event, slot, signature) => {
      if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return
      if (handledSignatures.has(signature)) return

      // do ur stuff

      handledSignatures.add(signature)
      if (handledSignatures.size > maxHandledSignaturesLen) {
      handledSignatures.delete(handledSignatures.values().next().value)
      }
      })
      - + \ No newline at end of file diff --git a/blog/first-blog-post/index.html b/blog/first-blog-post/index.html index 05c3ba11e..f662ab8d6 100644 --- a/blog/first-blog-post/index.html +++ b/blog/first-blog-post/index.html @@ -5,13 +5,13 @@ Solana共学教程 | All in One Solana - +

      Solana共学教程

      · 3 min read
      Davirain

      欢迎来到Solana共学,这是一个精心设计的教程系列,供任何对Solana感兴趣的人深入学习。无论你是初学者还是有经验的开发者,这些模块都会引导你了解Solana区块链开发的基本内容。

      模块1:Solana基础

      • 区块链基本概念介绍
      • 本地程序开发环境配置
        • 原始Solana合约实现《hello, World》
        • Anchor合约框架实现《hello, World》
        • 使用Solang编译器编译solidity合约实现《hello, World》
      • BackPack钱包使用
      • 客户端开发
      • 钱包和前端
      • 自定义指令
      • 开始你自己的定制项目

      模块2:Solana高级主题

      • SPL token
      • NFTs + 使用Metaplex进行铸造
      • 在用户界面中展示NFTs
      • 创造神奇的网络货币并出售JPEG图片

      更深入的模块:深入了解Solana

      • 模块3:Rust入门,原生Solana开发,安全性,NFT质押
      • 模块4:本地环境,跨程序调用,测试,质押应用开发
      • 模块5:Anchor入门,全栈Anchor应用开发
      • 模块6:发布周,随机性,完善

      特别主题:超越基础

      • Solana程序中的环境变量
      • Solana支付,版本化事务,Rust宏
      • Solana程序安全:签名授权,所有者检查,重新初始化攻击,PDA共享等
      • 使用Solidity编写Solana合约
      • 发行Token2020,压缩NFT
      • 在Solana中使用The Graph,Oracles Pyth SDK
      • TipLink使用,如何在Quicknode和Helius申请RPC endpoint
      • 等等...

      和我们一起,在这全面的指南中探索Solana的每一个方面。从最基本的内容到安全和合约开发的复杂方面,Solana共学为每一位Solana爱好者提供了内容。

      敬请期待,如果有任何问题或需要进一步的协助,请随时与我们联系。欢迎来到Solana共学!

      - + \ No newline at end of file diff --git a/blog/index.html b/blog/index.html index c1ca6c1db..90ed71297 100644 --- a/blog/index.html +++ b/blog/index.html @@ -5,7 +5,7 @@ Blog | All in One Solana - + @@ -14,7 +14,7 @@ 通常由特定程序(通常是一个智能合约)关联额外的账户。该账号没有私钥,故除程序本身外,无法完成数据签名,无法完成完整的数据交易。

      • ADA (Account Derived Account)

      由 createWithSeed 方法产生。 有一个账号公钥派生出来的关联账户,数据签名权限属于主账号。也即,需要主账号的签名才能完成完整的数据交易。

      solana中,根据数据签名,决定了数据的真实所有权。即 我的数据我做主

      本文主要分析这两种账号的异同。

      地址生成逻辑介绍如下

      • PDA 地址生成规则
      1. buffer = [seed,programId,"ProgramDerivedAddress"]
      2. 对buffer 取 sha256
      3. 如果在曲线上,那么抛出error, 如果不在,那么直接返回作为 使用地址

      createProgramAddressSync

      • ADA 生成
      1. buffer=[fromPublicKey,seed,programId]
      2. buffer 取 sha256, 直接返回

      createWithSeed

      区别在于,数据的托管使用逻辑.

      • ADA 数据签名权限,在于账户本身。即 我的数据我做主,未经允许(我未签名)不能修改。
      • PDA 数据签名权限在于合约。经过程序签名,可以修改 account 的数据和提取其中的sol。

      ADA 账号使用

      数据操作,有配套的函数对应,内部包含 xxxxWithSeedParams 类型的参数,完成对应的操作。 操作数据,需要 主账户的签名,这一点决定了,账号的真实所有权。

      • SystemProgram.createAccountWithSeed 初始化账号
      • SystemProgram.assign 重新分配owner
      • SystemProgram.allocate 分配空间
      • SystemProgram.transfer 转移SOL

      PDA 账号使用

      • 客户端只用于账户地址推导,不能初始化。初始化过程在合约内部完成。
      • 因其签名权限,必须在合约内部完成。他的操作权限完全属于智能合约。

      ADA 账号使用 example

        const seed = "ada.creator";

      // 初始化ada 账户
      let ada_account = await web3.PublicKey.createWithSeed(
      signer.publicKey,
      seed,
      program
      );
      console.log("ada_account address: ", ada_account.toBase58());

      let ada_info = await connection.getAccountInfo(ada_account);

      // 根据是否存在账号,决定是否初始化
      if (ada_info) {
      console.log(ada_info);
      } else {
      console.log("ada account not found");
      const transaction = new web3.Transaction().add(
      web3.SystemProgram.createAccountWithSeed({
      newAccountPubkey: ada_account,
      fromPubkey: signer.publicKey,
      basePubkey: signer.publicKey,
      programId: program,
      seed,
      lamports: web3.LAMPORTS_PER_SOL,
      space: 20,
      })
      );

      PDA 使用 example

      客户端部分代码逻辑

      const pda_seed = "pda.creator";

      const obj = new Model();

      const [pda, bump_seed] = web3.PublicKey.findProgramAddressSync(
      [signer.publicKey.toBuffer(), new TextEncoder().encode(movie.title)],
      program
      );

      console.log("pda address : ", pda.toBase58());

      const instruction = new web3.TransactionInstruction({
      keys: [
      {
      // 付钱的账户
      pubkey: signer.publicKey,
      isSigner: true,
      isWritable: false,
      },
      {
      // PDA将存储数据
      pubkey: pda,
      isSigner: false,
      isWritable: true,
      },
      {
      // 系统程序将用于创建PDA
      pubkey: web3.SystemProgram.programId,
      isSigner: false,
      isWritable: false,
      },
      ],
      // 传输数据
      data: obj.serialize(),
      programId: program,
      });

      const transaction = new web3.Transaction().add(instruction);

      const signature = await web3.sendAndConfirmTransaction(
      connection,
      transaction,
      [signer]
      );

      console.log(signature);

      合约部分代码逻辑

      // 获取账户迭代器
      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)?;

      // 构造PDA账户
      let (pda, bump_seed) =
      Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes()], program_id);

      // 和客户端比对
      if pda != *pda_account.key {
      msg!("Invalid seeds for PDA");
      return Err(ProgramError::InvalidArgument);
      }

      // 计算所需的租金
      let rent = Rent::get()?;
      let rent_lamports = rent.minimum_balance(total_len);

      // 创建账户
      invoke_signed(
      &system_instruction::create_account(
      initializer.key,
      pda_account.key,
      rent_lamports,
      total_len
      .try_into()
      .map_err(|_| Error::ConvertUsizeToU64Failed)?,
      program_id,
      ),
      &[
      initializer.clone(),
      pda_account.clone(),
      system_program.clone(),
      ],
      &[&[initializer.key.as_ref(), title.as_bytes(), &[bump_seed]]],
      )?;

      // MovieAccountState 定义的state类型
      let mut account_data =
      try_from_slice_unchecked::<MovieAccountState>(&pda_account.data.borrow()).unwrap();

      account_data.title = title;
      account_data.rating = rating;
      account_data.description = description;
      account_data.is_initialized = true;

      // 写入pda 数据本身
      account_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;

      参考资料

      · 3 min read
      YanAemons

      報錯日志

      在使用solana-cli時候,鑑於一些依賴版本限制,會用到cli14.xx(主網版本),而不是16.xx(測試網版本)

      例如,在使用solana-cli版本爲1.14.17, anchor版本爲0.26.0的環境中, anchor init創建一個新項目後運行 anchor build會發生以下錯誤:

      error: package constant_time_eq v0.3.0 cannot be built because it requires rustc 1.66.0 or newer, while the currently active rustc version is 1.62.0-dev

      報錯原因

      使用的solana-cli版本在14.xxx, cli內自帶的rustc版本過老,無法編譯較新的依賴

      解決方案

      1. 升級solana-cli至最新版本

      solana-install update

      2.指定依賴包版本

      需要在Cargo.toml文件下指定以下依賴版本

      getrandom = { version = "0.2.9", features = ["custom"] }  
      solana-program = "=1.14.17"
      winnow="=0.4.1"
      toml_datetime="=0.6.1"
      blake3 = "=1.3.1"

      運行cargo clean後重新運行anchor build即可解決

      監聽程序log監聽到兩次

      在使用program.addEventListener()有可能聽到兩次相同的事件,其中一次的txSign會是“1111111111111111111111111111111111111111111111111111111111111111”, 這是因爲監聽到了模擬時的交易哈系,我們只需要在監聽到該交易哈系時拋棄即可

      program.addEventListener("eventName", (event, slot, signature) => {
      if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return

      // do ur stuff
      })

      然而,有時websocket訂閱也會多次返回實際簽名。如果是這種情況,您可以使用一些緩存解決方案。例如,創建一個具有一定長度限制的集合,在此處添加簽名並檢查該集合中是否存在新簽名:

      const handledSignatures = new Set<string>()
      const maxHandledSignaturesLen = 100

      program.addEventListener("eventName", (event, slot, signature) => {
      if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return
      if (handledSignatures.has(signature)) return

      // do ur stuff

      handledSignatures.add(signature)
      if (handledSignatures.size > maxHandledSignaturesLen) {
      handledSignatures.delete(handledSignatures.values().next().value)
      }
      })

      · 17 min read
      Davirain

      Solana上,状态压缩是一种创建离链数据的“指纹”(或哈希)并将该指纹存储在链上以进行安全验证的方法。有效地利用Solana账本的安全性来安全验证离链数据,以确保其未被篡改。

      这种“压缩”方法使得Solana的程序和dApps能够使用廉价的区块链账本空间来安全存储数据,而不是更昂贵的账户空间。

      这是通过使用一种特殊的二叉树结构,称为并发默克尔树,对每个数据片段(称为 leaf )创建哈希,将它们哈希在一起,并仅将最终哈希存储在链上来实现的。

      什么是状态压缩?

      简单来说,状态压缩使用“树”结构将链外数据以确定性的方式进行加密哈希,计算出一个最终的哈希值,并将其存储在链上。

      这些树是通过这个“确定性”过程创建的:

      • 获取任何数据
      • 创建这些数据的哈希值
      • 将此哈希值存储为树底部的 leaf
      • 每个 leaf 对都会被一起哈希,创建一个 branch
      • 每个 branch 然后一起哈希
      • 不断攀爬树木并将相邻的树枝连接在一起
      • 树顶上一旦到达,就会产生最后的 root hash

      这个 root hash 然后存储在链上,作为每个叶子节点中所有数据的可验证证据。这样任何人都可以通过加密验证树中所有离链数据,而实际上只需在链上存储少量数据。因此,由于这种"状态压缩",大大降低了存储/证明大量数据的成本。

      默克尔树和并发默克尔树

      Solana的状态压缩使用了一种特殊类型的默克尔树,允许对任何给定的树进行多次更改,同时仍然保持树的完整性和有效性。

      这棵特殊的树被称为“并发默克尔树”,有效地在链上保留了树的“更改日志”。允许在一个证明失效之前对同一棵树进行多次快速更改(即在同一个区块中)。

      默克尔树是什么?

      默克尔树,有时也被称为“哈希树”,是一种基于哈希的二叉树结构,其中每个leaf节点都被表示为其内部数据的加密哈希。而每个非叶节点,也被称为“branch节点”,则被表示为其子叶节点哈希的哈希值。

      每个分支也被哈希在一起,沿着树向上爬,直到最后只剩下一个哈希。这个最终的哈希,称为 root hash 或者"根",可以与一个"证明路径"结合使用,来验证存储在叶节点中的任何数据。

      一旦计算出最终的根哈希值(root hash),可以通过重新计算特定叶子(leaf)节点的数据和每个相邻分支的哈希标签(称为“证明路径”)来验证存储在节点中的任何数据。将这个“重新哈希”与根哈希值进行比较,可以验证底层叶子数据的准确性。如果它们匹配,数据就被验证为准确的。如果它们不匹配,叶子数据已被更改。

      只要需要,原始叶子数据可以通过对新的叶子数据进行哈希运算并重新计算根哈希值来进行更改,方法与原始根哈希值的计算方式相同。然后,这个新的根哈希值用于验证任何数据,并且有效地使之前的根哈希值和证明无效。因此,对这些传统的默克尔树的每一次更改都需要按顺序执行。

      info

      当使用默克尔树时,更改叶子数据并计算新的根哈希的过程可能是非常常见的事情!虽然这是树的设计要点之一,但它可能导致最显著的缺点之一:快速变化。

      什么是并发默克尔树?

      在高吞吐量的应用中,比如在Solana运行时中,对于链上传统Merkle树的更改请求可能会相对快速地连续接收到验证者(例如在同一个槽中)。每个叶子数据的更改仍然需要按顺序执行。这导致每个后续的更改请求都会失败,因为根哈希和证明已经被同一槽中之前的更改请求无效化了。

      进入,并发默克尔树。

      并发默克尔树存储了最近更改的安全日志、它们的根哈希以及用于推导根哈希的证明。这个日志缓冲区存储在链上的每个树对应的特定账户中,最大记录数为(也称为 maxBufferSize )。

      当同一时隙内的验证者收到多个叶子数据变更请求时,链上并发 Merkle 树可以将这个“变更日志缓冲区”作为更可接受的证明的真实来源。有效地允许在同一时隙内对同一棵树进行多达 maxBufferSize 次变更。大幅提升吞吐量。

      并发默克尔树的大小调整

      创建这种链上树时,有三个值将决定您的树的大小、创建树的成本以及对树的并发更改数量:

      1. max depth 最大深度
      2. max buffer size 最大缓冲区大小
      3. canopy depth

      max depth

      树的“最大深度”是从任何数据 leaf 到树的 root 所需的最大跳数。

      由于默克尔树是二叉树,每个叶子节点只与另一个叶子节点相连;存在于一个 leaf pair 中。

      因此,树的 maxDepth 被用来确定可以通过简单的计算存储在树中的最大节点数(也称为数据或 leafs

      nodes_count = 2 ^ maxDepth

      由于树的深度必须在创建树时设置,您必须决定您希望树存储多少个数据。然后使用上述简单的计算,您可以确定存储数据的最低 maxDepth

      示例1:铸造100个NFTs

      如果你想创建一个用于存储100个压缩NFT的树,我们至少需要"100个叶子"或"100个节点"。

      // maxDepth=6 -> 64 nodes
      2^6 = 64

      // maxDepth=7 -> 128 nodes
      2^7 = 128

      因此,我们需要一个最大深度为 7 的树,以存储 100 个数据。

      例子2:铸造15000个NFTs

      如果你想创建一个用于存储15000个压缩NFT的树,我们将需要至少"15000个叶子"或"15000个节点"。

      // maxDepth=13 -> 8192 nodes
      2^13 = 8192

      // maxDepth=14 -> 16384 nodes
      2^14 = 16384

      因此,我们需要一个最大深度为 14 的树,以存储 15000 个数据。

      最大深度越高,成本越高

      创建树时, maxDepth 值将是成本的主要驱动因素之一,因为您将在创建树时支付这笔成本。最大树深度越高,您可以存储的数据指纹(也称为哈希)越多,成本就越高。

      max buffer size

      max buffer size” 实际上是树上可以发生的最大变化数量,同时仍然有效的 root hash

      由于根哈希有效地是所有叶子数据的单一哈希,改变任何一个叶子将使得所有后续尝试改变常规树的叶子所需的证明无效。

      但是使用并发树,对于这些证明来说,实际上有一个更新的日志。这个日志缓冲区的大小和设置是通过这个 maxBufferSize 值在树创建时完成的。

      Canopy depth

      Canopy depth”,有时也称为Canopy大小,是指在任何给定的证明路径上缓存/存储在链上的证明节点数量。

      在对 leaf 执行更新操作时,例如转让所有权(例如出售压缩的NFT),必须使用完整的证明路径来验证叶子节点的原始所有权,从而允许进行更新操作。此验证是使用完整的证明路径来正确计算当前的 root hash (或通过链上的“并发缓冲区”缓存的任何 root hash )来执行的。

      树的最大深度越大,执行此验证所需的证明节点就越多。例如,如果您的最大深度是 14 ,则需要使用 14 个总的证明节点进行验证。随着树的增大,完整的证明路径也会变得更长。

      通常情况下,每个这些证明节点都需要在每个树更新事务中包含。由于每个证明节点的值在事务中占用 32 bytes (类似于提供公钥),较大的树很快就会超过最大事务大小限制。

      进入CanopyCanopy可以在链上存储一定数量的验证节点(对于任何给定的验证路径)。这样可以在每个更新交易中包含较少的验证节点,从而保持整体交易大小低于限制。

      例如,深度为 14 的树需要 14 个总的验证节点。而有 10Canopy的情况下,每个更新事务只需要提交 4 个验证节点。

      Canopy深度值越大,成本越高

      canopyDepth 值也是创建树时成本的主要因素,因为您将在树的创建时支付这个成本。canopyDepth越高,链上存储的数据证明节点越多,成本也越高。

      较小的Canopy限制了可组合性

      虽然树的创建成本随着Canopy的高度而增加,但较低的Canopy将需要在每个更新事务中包含更多的证明节点。所需提交的节点越多,事务的大小就越大,因此超过事务大小限制就越容易。

      这也适用于任何其他试图与您的树/叶子进行交互的Solana程序或dApp。如果您的树需要太多的证明节点(因为Canopy深度较低),那么任何其他链上程序可能提供的额外操作都将受到其特定指令大小加上您的证明节点列表大小的限制。这限制了可组合性,并限制了您的特定树的潜在附加效用。

      例如,如果您的树被用于压缩的非同质化代币(NFTs),并且Canopy深度非常低,一个NFT市场可能只能支持简单的NFT转移,而无法支持链上竞标系统。

      创建一棵树的成本

      创建并发 Merkle 树的成本基于树的大小参数: maxDepthmaxBufferSizecanopyDepth 。这些值都用于计算在链上存在树所需的链上存储空间(以字节为单位)。

      一旦计算出所需的空间(以字节为单位),并使用 getMinimumBalanceForRentExemption RPC方法,请求在链上分配这些字节所需的费用(以lamports为单位)。

      在JavaScript中计算树木成本

      @solana/spl-account-compression 包中,开发人员可以使用 getConcurrentMerkleTreeAccountSize 函数来计算给定树大小参数所需的空间。

      然后使用 getMinimumBalanceForRentExemption 函数来获取在链上分配所需空间的最终成本(以lamports计算)。

      然后确定以lamports计算的成本,使得这个大小的账户免除租金,与其他账户创建类似。

      // calculate the space required for the tree
      const requiredSpace = getConcurrentMerkleTreeAccountSize(
      maxDepth,
      maxBufferSize,
      canopyDepth,
      );

      // get the cost (in lamports) to store the tree on-chain
      const storageCost = await connection.getMinimumBalanceForRentExemption(
      requiredSpace,
      );

      示例费用

      以下是几个不同树大小的示例成本,包括每个树可能的叶节点数量:

      例子 #1:16,384个节点,成本为0.222 SOL

      • 最大深度为 14 ,最大缓冲区大小为 64
      • 叶节点的最大数量: 16,384
      • 创建 0.222 SOLCanopy深度大约需要 0 的成本

      例子 #2:16,384个节点,成本为1.134 SOL

      • 最大深度为 14 ,最大缓冲区大小为 64
      • 叶节点的最大数量: 16,384
      • 创建 1.134 SOLCanopy深度大约需要 11 的成本

      示例 #3:1,048,576个节点,成本为1.673 SOL

      • 最大深度为 20 ,最大缓冲区大小为 256
      • 叶节点的最大数量: 1,048,576
      • 创建 1.673 SOLCanopy深度大约需要 10 的成本

      示例#4:1,048,576个节点,成本为15.814 SOL

      • 最大深度为 20 ,最大缓冲区大小为 256
      • 叶节点的最大数量: 1,048,576
      • 创建 15.814 SOLCanopy深度大约需要 15 的成本

      压缩的NFTs

      压缩的NFT是Solana上状态压缩的最受欢迎的应用之一。通过压缩,一个拥有一百万个NFT的收藏品可以以 ~50 SOL 的价格铸造,而不是其未压缩的等价收藏品。

      开发者指南:

      阅读我们的开发者指南,了解如何铸造和转移压缩的NFT

      · 3 min read
      Davirain

      欢迎来到Solana共学,这是一个精心设计的教程系列,供任何对Solana感兴趣的人深入学习。无论你是初学者还是有经验的开发者,这些模块都会引导你了解Solana区块链开发的基本内容。

      模块1:Solana基础

      • 区块链基本概念介绍
      • 本地程序开发环境配置
        • 原始Solana合约实现《hello, World》
        • Anchor合约框架实现《hello, World》
        • 使用Solang编译器编译solidity合约实现《hello, World》
      • BackPack钱包使用
      • 客户端开发
      • 钱包和前端
      • 自定义指令
      • 开始你自己的定制项目

      模块2:Solana高级主题

      • SPL token
      • NFTs + 使用Metaplex进行铸造
      • 在用户界面中展示NFTs
      • 创造神奇的网络货币并出售JPEG图片

      更深入的模块:深入了解Solana

      • 模块3:Rust入门,原生Solana开发,安全性,NFT质押
      • 模块4:本地环境,跨程序调用,测试,质押应用开发
      • 模块5:Anchor入门,全栈Anchor应用开发
      • 模块6:发布周,随机性,完善

      特别主题:超越基础

      • Solana程序中的环境变量
      • Solana支付,版本化事务,Rust宏
      • Solana程序安全:签名授权,所有者检查,重新初始化攻击,PDA共享等
      • 使用Solidity编写Solana合约
      • 发行Token2020,压缩NFT
      • 在Solana中使用The Graph,Oracles Pyth SDK
      • TipLink使用,如何在Quicknode和Helius申请RPC endpoint
      • 等等...

      和我们一起,在这全面的指南中探索Solana的每一个方面。从最基本的内容到安全和合约开发的复杂方面,Solana共学为每一位Solana爱好者提供了内容。

      敬请期待,如果有任何问题或需要进一步的协助,请随时与我们联系。欢迎来到Solana共学!

      - + \ No newline at end of file diff --git a/blog/solana-state-compression/index.html b/blog/solana-state-compression/index.html index ea388e1eb..6dd6e206f 100644 --- a/blog/solana-state-compression/index.html +++ b/blog/solana-state-compression/index.html @@ -5,13 +5,13 @@ 翻译 Solana 的状态压缩 | All in One Solana - +

      翻译 Solana 的状态压缩

      · 17 min read
      Davirain

      Solana上,状态压缩是一种创建离链数据的“指纹”(或哈希)并将该指纹存储在链上以进行安全验证的方法。有效地利用Solana账本的安全性来安全验证离链数据,以确保其未被篡改。

      这种“压缩”方法使得Solana的程序和dApps能够使用廉价的区块链账本空间来安全存储数据,而不是更昂贵的账户空间。

      这是通过使用一种特殊的二叉树结构,称为并发默克尔树,对每个数据片段(称为 leaf )创建哈希,将它们哈希在一起,并仅将最终哈希存储在链上来实现的。

      什么是状态压缩?

      简单来说,状态压缩使用“树”结构将链外数据以确定性的方式进行加密哈希,计算出一个最终的哈希值,并将其存储在链上。

      这些树是通过这个“确定性”过程创建的:

      • 获取任何数据
      • 创建这些数据的哈希值
      • 将此哈希值存储为树底部的 leaf
      • 每个 leaf 对都会被一起哈希,创建一个 branch
      • 每个 branch 然后一起哈希
      • 不断攀爬树木并将相邻的树枝连接在一起
      • 树顶上一旦到达,就会产生最后的 root hash

      这个 root hash 然后存储在链上,作为每个叶子节点中所有数据的可验证证据。这样任何人都可以通过加密验证树中所有离链数据,而实际上只需在链上存储少量数据。因此,由于这种"状态压缩",大大降低了存储/证明大量数据的成本。

      默克尔树和并发默克尔树

      Solana的状态压缩使用了一种特殊类型的默克尔树,允许对任何给定的树进行多次更改,同时仍然保持树的完整性和有效性。

      这棵特殊的树被称为“并发默克尔树”,有效地在链上保留了树的“更改日志”。允许在一个证明失效之前对同一棵树进行多次快速更改(即在同一个区块中)。

      默克尔树是什么?

      默克尔树,有时也被称为“哈希树”,是一种基于哈希的二叉树结构,其中每个leaf节点都被表示为其内部数据的加密哈希。而每个非叶节点,也被称为“branch节点”,则被表示为其子叶节点哈希的哈希值。

      每个分支也被哈希在一起,沿着树向上爬,直到最后只剩下一个哈希。这个最终的哈希,称为 root hash 或者"根",可以与一个"证明路径"结合使用,来验证存储在叶节点中的任何数据。

      一旦计算出最终的根哈希值(root hash),可以通过重新计算特定叶子(leaf)节点的数据和每个相邻分支的哈希标签(称为“证明路径”)来验证存储在节点中的任何数据。将这个“重新哈希”与根哈希值进行比较,可以验证底层叶子数据的准确性。如果它们匹配,数据就被验证为准确的。如果它们不匹配,叶子数据已被更改。

      只要需要,原始叶子数据可以通过对新的叶子数据进行哈希运算并重新计算根哈希值来进行更改,方法与原始根哈希值的计算方式相同。然后,这个新的根哈希值用于验证任何数据,并且有效地使之前的根哈希值和证明无效。因此,对这些传统的默克尔树的每一次更改都需要按顺序执行。

      info

      当使用默克尔树时,更改叶子数据并计算新的根哈希的过程可能是非常常见的事情!虽然这是树的设计要点之一,但它可能导致最显著的缺点之一:快速变化。

      什么是并发默克尔树?

      在高吞吐量的应用中,比如在Solana运行时中,对于链上传统Merkle树的更改请求可能会相对快速地连续接收到验证者(例如在同一个槽中)。每个叶子数据的更改仍然需要按顺序执行。这导致每个后续的更改请求都会失败,因为根哈希和证明已经被同一槽中之前的更改请求无效化了。

      进入,并发默克尔树。

      并发默克尔树存储了最近更改的安全日志、它们的根哈希以及用于推导根哈希的证明。这个日志缓冲区存储在链上的每个树对应的特定账户中,最大记录数为(也称为 maxBufferSize )。

      当同一时隙内的验证者收到多个叶子数据变更请求时,链上并发 Merkle 树可以将这个“变更日志缓冲区”作为更可接受的证明的真实来源。有效地允许在同一时隙内对同一棵树进行多达 maxBufferSize 次变更。大幅提升吞吐量。

      并发默克尔树的大小调整

      创建这种链上树时,有三个值将决定您的树的大小、创建树的成本以及对树的并发更改数量:

      1. max depth 最大深度
      2. max buffer size 最大缓冲区大小
      3. canopy depth

      max depth

      树的“最大深度”是从任何数据 leaf 到树的 root 所需的最大跳数。

      由于默克尔树是二叉树,每个叶子节点只与另一个叶子节点相连;存在于一个 leaf pair 中。

      因此,树的 maxDepth 被用来确定可以通过简单的计算存储在树中的最大节点数(也称为数据或 leafs

      nodes_count = 2 ^ maxDepth

      由于树的深度必须在创建树时设置,您必须决定您希望树存储多少个数据。然后使用上述简单的计算,您可以确定存储数据的最低 maxDepth

      示例1:铸造100个NFTs

      如果你想创建一个用于存储100个压缩NFT的树,我们至少需要"100个叶子"或"100个节点"。

      // maxDepth=6 -> 64 nodes
      2^6 = 64

      // maxDepth=7 -> 128 nodes
      2^7 = 128

      因此,我们需要一个最大深度为 7 的树,以存储 100 个数据。

      例子2:铸造15000个NFTs

      如果你想创建一个用于存储15000个压缩NFT的树,我们将需要至少"15000个叶子"或"15000个节点"。

      // maxDepth=13 -> 8192 nodes
      2^13 = 8192

      // maxDepth=14 -> 16384 nodes
      2^14 = 16384

      因此,我们需要一个最大深度为 14 的树,以存储 15000 个数据。

      最大深度越高,成本越高

      创建树时, maxDepth 值将是成本的主要驱动因素之一,因为您将在创建树时支付这笔成本。最大树深度越高,您可以存储的数据指纹(也称为哈希)越多,成本就越高。

      max buffer size

      max buffer size” 实际上是树上可以发生的最大变化数量,同时仍然有效的 root hash

      由于根哈希有效地是所有叶子数据的单一哈希,改变任何一个叶子将使得所有后续尝试改变常规树的叶子所需的证明无效。

      但是使用并发树,对于这些证明来说,实际上有一个更新的日志。这个日志缓冲区的大小和设置是通过这个 maxBufferSize 值在树创建时完成的。

      Canopy depth

      Canopy depth”,有时也称为Canopy大小,是指在任何给定的证明路径上缓存/存储在链上的证明节点数量。

      在对 leaf 执行更新操作时,例如转让所有权(例如出售压缩的NFT),必须使用完整的证明路径来验证叶子节点的原始所有权,从而允许进行更新操作。此验证是使用完整的证明路径来正确计算当前的 root hash (或通过链上的“并发缓冲区”缓存的任何 root hash )来执行的。

      树的最大深度越大,执行此验证所需的证明节点就越多。例如,如果您的最大深度是 14 ,则需要使用 14 个总的证明节点进行验证。随着树的增大,完整的证明路径也会变得更长。

      通常情况下,每个这些证明节点都需要在每个树更新事务中包含。由于每个证明节点的值在事务中占用 32 bytes (类似于提供公钥),较大的树很快就会超过最大事务大小限制。

      进入CanopyCanopy可以在链上存储一定数量的验证节点(对于任何给定的验证路径)。这样可以在每个更新交易中包含较少的验证节点,从而保持整体交易大小低于限制。

      例如,深度为 14 的树需要 14 个总的验证节点。而有 10Canopy的情况下,每个更新事务只需要提交 4 个验证节点。

      Canopy深度值越大,成本越高

      canopyDepth 值也是创建树时成本的主要因素,因为您将在树的创建时支付这个成本。canopyDepth越高,链上存储的数据证明节点越多,成本也越高。

      较小的Canopy限制了可组合性

      虽然树的创建成本随着Canopy的高度而增加,但较低的Canopy将需要在每个更新事务中包含更多的证明节点。所需提交的节点越多,事务的大小就越大,因此超过事务大小限制就越容易。

      这也适用于任何其他试图与您的树/叶子进行交互的Solana程序或dApp。如果您的树需要太多的证明节点(因为Canopy深度较低),那么任何其他链上程序可能提供的额外操作都将受到其特定指令大小加上您的证明节点列表大小的限制。这限制了可组合性,并限制了您的特定树的潜在附加效用。

      例如,如果您的树被用于压缩的非同质化代币(NFTs),并且Canopy深度非常低,一个NFT市场可能只能支持简单的NFT转移,而无法支持链上竞标系统。

      创建一棵树的成本

      创建并发 Merkle 树的成本基于树的大小参数: maxDepthmaxBufferSizecanopyDepth 。这些值都用于计算在链上存在树所需的链上存储空间(以字节为单位)。

      一旦计算出所需的空间(以字节为单位),并使用 getMinimumBalanceForRentExemption RPC方法,请求在链上分配这些字节所需的费用(以lamports为单位)。

      在JavaScript中计算树木成本

      @solana/spl-account-compression 包中,开发人员可以使用 getConcurrentMerkleTreeAccountSize 函数来计算给定树大小参数所需的空间。

      然后使用 getMinimumBalanceForRentExemption 函数来获取在链上分配所需空间的最终成本(以lamports计算)。

      然后确定以lamports计算的成本,使得这个大小的账户免除租金,与其他账户创建类似。

      // calculate the space required for the tree
      const requiredSpace = getConcurrentMerkleTreeAccountSize(
      maxDepth,
      maxBufferSize,
      canopyDepth,
      );

      // get the cost (in lamports) to store the tree on-chain
      const storageCost = await connection.getMinimumBalanceForRentExemption(
      requiredSpace,
      );

      示例费用

      以下是几个不同树大小的示例成本,包括每个树可能的叶节点数量:

      例子 #1:16,384个节点,成本为0.222 SOL

      • 最大深度为 14 ,最大缓冲区大小为 64
      • 叶节点的最大数量: 16,384
      • 创建 0.222 SOLCanopy深度大约需要 0 的成本

      例子 #2:16,384个节点,成本为1.134 SOL

      • 最大深度为 14 ,最大缓冲区大小为 64
      • 叶节点的最大数量: 16,384
      • 创建 1.134 SOLCanopy深度大约需要 11 的成本

      示例 #3:1,048,576个节点,成本为1.673 SOL

      • 最大深度为 20 ,最大缓冲区大小为 256
      • 叶节点的最大数量: 1,048,576
      • 创建 1.673 SOLCanopy深度大约需要 10 的成本

      示例#4:1,048,576个节点,成本为15.814 SOL

      • 最大深度为 20 ,最大缓冲区大小为 256
      • 叶节点的最大数量: 1,048,576
      • 创建 15.814 SOLCanopy深度大约需要 15 的成本

      压缩的NFTs

      压缩的NFT是Solana上状态压缩的最受欢迎的应用之一。通过压缩,一个拥有一百万个NFT的收藏品可以以 ~50 SOL 的价格铸造,而不是其未压缩的等价收藏品。

      开发者指南:

      阅读我们的开发者指南,了解如何铸造和转移压缩的NFT

      - + \ No newline at end of file diff --git a/blog/tags/anchor/index.html b/blog/tags/anchor/index.html index 6a48bd521..623a94b84 100644 --- a/blog/tags/anchor/index.html +++ b/blog/tags/anchor/index.html @@ -5,13 +5,13 @@ One post tagged with "anchor" | All in One Solana - +

      One post tagged with "anchor"

      View All Tags

      · 3 min read
      YanAemons

      報錯日志

      在使用solana-cli時候,鑑於一些依賴版本限制,會用到cli14.xx(主網版本),而不是16.xx(測試網版本)

      例如,在使用solana-cli版本爲1.14.17, anchor版本爲0.26.0的環境中, anchor init創建一個新項目後運行 anchor build會發生以下錯誤:

      error: package constant_time_eq v0.3.0 cannot be built because it requires rustc 1.66.0 or newer, while the currently active rustc version is 1.62.0-dev

      報錯原因

      使用的solana-cli版本在14.xxx, cli內自帶的rustc版本過老,無法編譯較新的依賴

      解決方案

      1. 升級solana-cli至最新版本

      solana-install update

      2.指定依賴包版本

      需要在Cargo.toml文件下指定以下依賴版本

      getrandom = { version = "0.2.9", features = ["custom"] }  
      solana-program = "=1.14.17"
      winnow="=0.4.1"
      toml_datetime="=0.6.1"
      blake3 = "=1.3.1"

      運行cargo clean後重新運行anchor build即可解決

      監聽程序log監聽到兩次

      在使用program.addEventListener()有可能聽到兩次相同的事件,其中一次的txSign會是“1111111111111111111111111111111111111111111111111111111111111111”, 這是因爲監聽到了模擬時的交易哈系,我們只需要在監聽到該交易哈系時拋棄即可

      program.addEventListener("eventName", (event, slot, signature) => {
      if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return

      // do ur stuff
      })

      然而,有時websocket訂閱也會多次返回實際簽名。如果是這種情況,您可以使用一些緩存解決方案。例如,創建一個具有一定長度限制的集合,在此處添加簽名並檢查該集合中是否存在新簽名:

      const handledSignatures = new Set<string>()
      const maxHandledSignaturesLen = 100

      program.addEventListener("eventName", (event, slot, signature) => {
      if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return
      if (handledSignatures.has(signature)) return

      // do ur stuff

      handledSignatures.add(signature)
      if (handledSignatures.size > maxHandledSignaturesLen) {
      handledSignatures.delete(handledSignatures.values().next().value)
      }
      })
      - + \ No newline at end of file diff --git a/blog/tags/blockchain/index.html b/blog/tags/blockchain/index.html index d876dcab3..a8c6d89c7 100644 --- a/blog/tags/blockchain/index.html +++ b/blog/tags/blockchain/index.html @@ -5,7 +5,7 @@ 4 posts tagged with "blockchain" | All in One Solana - + @@ -14,7 +14,7 @@ 通常由特定程序(通常是一个智能合约)关联额外的账户。该账号没有私钥,故除程序本身外,无法完成数据签名,无法完成完整的数据交易。

      • ADA (Account Derived Account)

      由 createWithSeed 方法产生。 有一个账号公钥派生出来的关联账户,数据签名权限属于主账号。也即,需要主账号的签名才能完成完整的数据交易。

      solana中,根据数据签名,决定了数据的真实所有权。即 我的数据我做主

      本文主要分析这两种账号的异同。

      地址生成逻辑介绍如下

      • PDA 地址生成规则
      1. buffer = [seed,programId,"ProgramDerivedAddress"]
      2. 对buffer 取 sha256
      3. 如果在曲线上,那么抛出error, 如果不在,那么直接返回作为 使用地址

      createProgramAddressSync

      • ADA 生成
      1. buffer=[fromPublicKey,seed,programId]
      2. buffer 取 sha256, 直接返回

      createWithSeed

      区别在于,数据的托管使用逻辑.

      • ADA 数据签名权限,在于账户本身。即 我的数据我做主,未经允许(我未签名)不能修改。
      • PDA 数据签名权限在于合约。经过程序签名,可以修改 account 的数据和提取其中的sol。

      ADA 账号使用

      数据操作,有配套的函数对应,内部包含 xxxxWithSeedParams 类型的参数,完成对应的操作。 操作数据,需要 主账户的签名,这一点决定了,账号的真实所有权。

      • SystemProgram.createAccountWithSeed 初始化账号
      • SystemProgram.assign 重新分配owner
      • SystemProgram.allocate 分配空间
      • SystemProgram.transfer 转移SOL

      PDA 账号使用

      • 客户端只用于账户地址推导,不能初始化。初始化过程在合约内部完成。
      • 因其签名权限,必须在合约内部完成。他的操作权限完全属于智能合约。

      ADA 账号使用 example

        const seed = "ada.creator";

      // 初始化ada 账户
      let ada_account = await web3.PublicKey.createWithSeed(
      signer.publicKey,
      seed,
      program
      );
      console.log("ada_account address: ", ada_account.toBase58());

      let ada_info = await connection.getAccountInfo(ada_account);

      // 根据是否存在账号,决定是否初始化
      if (ada_info) {
      console.log(ada_info);
      } else {
      console.log("ada account not found");
      const transaction = new web3.Transaction().add(
      web3.SystemProgram.createAccountWithSeed({
      newAccountPubkey: ada_account,
      fromPubkey: signer.publicKey,
      basePubkey: signer.publicKey,
      programId: program,
      seed,
      lamports: web3.LAMPORTS_PER_SOL,
      space: 20,
      })
      );

      PDA 使用 example

      客户端部分代码逻辑

      const pda_seed = "pda.creator";

      const obj = new Model();

      const [pda, bump_seed] = web3.PublicKey.findProgramAddressSync(
      [signer.publicKey.toBuffer(), new TextEncoder().encode(movie.title)],
      program
      );

      console.log("pda address : ", pda.toBase58());

      const instruction = new web3.TransactionInstruction({
      keys: [
      {
      // 付钱的账户
      pubkey: signer.publicKey,
      isSigner: true,
      isWritable: false,
      },
      {
      // PDA将存储数据
      pubkey: pda,
      isSigner: false,
      isWritable: true,
      },
      {
      // 系统程序将用于创建PDA
      pubkey: web3.SystemProgram.programId,
      isSigner: false,
      isWritable: false,
      },
      ],
      // 传输数据
      data: obj.serialize(),
      programId: program,
      });

      const transaction = new web3.Transaction().add(instruction);

      const signature = await web3.sendAndConfirmTransaction(
      connection,
      transaction,
      [signer]
      );

      console.log(signature);

      合约部分代码逻辑

      // 获取账户迭代器
      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)?;

      // 构造PDA账户
      let (pda, bump_seed) =
      Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes()], program_id);

      // 和客户端比对
      if pda != *pda_account.key {
      msg!("Invalid seeds for PDA");
      return Err(ProgramError::InvalidArgument);
      }

      // 计算所需的租金
      let rent = Rent::get()?;
      let rent_lamports = rent.minimum_balance(total_len);

      // 创建账户
      invoke_signed(
      &system_instruction::create_account(
      initializer.key,
      pda_account.key,
      rent_lamports,
      total_len
      .try_into()
      .map_err(|_| Error::ConvertUsizeToU64Failed)?,
      program_id,
      ),
      &[
      initializer.clone(),
      pda_account.clone(),
      system_program.clone(),
      ],
      &[&[initializer.key.as_ref(), title.as_bytes(), &[bump_seed]]],
      )?;

      // MovieAccountState 定义的state类型
      let mut account_data =
      try_from_slice_unchecked::<MovieAccountState>(&pda_account.data.borrow()).unwrap();

      account_data.title = title;
      account_data.rating = rating;
      account_data.description = description;
      account_data.is_initialized = true;

      // 写入pda 数据本身
      account_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;

      参考资料

      · 3 min read
      YanAemons

      報錯日志

      在使用solana-cli時候,鑑於一些依賴版本限制,會用到cli14.xx(主網版本),而不是16.xx(測試網版本)

      例如,在使用solana-cli版本爲1.14.17, anchor版本爲0.26.0的環境中, anchor init創建一個新項目後運行 anchor build會發生以下錯誤:

      error: package constant_time_eq v0.3.0 cannot be built because it requires rustc 1.66.0 or newer, while the currently active rustc version is 1.62.0-dev

      報錯原因

      使用的solana-cli版本在14.xxx, cli內自帶的rustc版本過老,無法編譯較新的依賴

      解決方案

      1. 升級solana-cli至最新版本

      solana-install update

      2.指定依賴包版本

      需要在Cargo.toml文件下指定以下依賴版本

      getrandom = { version = "0.2.9", features = ["custom"] }  
      solana-program = "=1.14.17"
      winnow="=0.4.1"
      toml_datetime="=0.6.1"
      blake3 = "=1.3.1"

      運行cargo clean後重新運行anchor build即可解決

      監聽程序log監聽到兩次

      在使用program.addEventListener()有可能聽到兩次相同的事件,其中一次的txSign會是“1111111111111111111111111111111111111111111111111111111111111111”, 這是因爲監聽到了模擬時的交易哈系,我們只需要在監聽到該交易哈系時拋棄即可

      program.addEventListener("eventName", (event, slot, signature) => {
      if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return

      // do ur stuff
      })

      然而,有時websocket訂閱也會多次返回實際簽名。如果是這種情況,您可以使用一些緩存解決方案。例如,創建一個具有一定長度限制的集合,在此處添加簽名並檢查該集合中是否存在新簽名:

      const handledSignatures = new Set<string>()
      const maxHandledSignaturesLen = 100

      program.addEventListener("eventName", (event, slot, signature) => {
      if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return
      if (handledSignatures.has(signature)) return

      // do ur stuff

      handledSignatures.add(signature)
      if (handledSignatures.size > maxHandledSignaturesLen) {
      handledSignatures.delete(handledSignatures.values().next().value)
      }
      })

      · 17 min read
      Davirain

      Solana上,状态压缩是一种创建离链数据的“指纹”(或哈希)并将该指纹存储在链上以进行安全验证的方法。有效地利用Solana账本的安全性来安全验证离链数据,以确保其未被篡改。

      这种“压缩”方法使得Solana的程序和dApps能够使用廉价的区块链账本空间来安全存储数据,而不是更昂贵的账户空间。

      这是通过使用一种特殊的二叉树结构,称为并发默克尔树,对每个数据片段(称为 leaf )创建哈希,将它们哈希在一起,并仅将最终哈希存储在链上来实现的。

      什么是状态压缩?

      简单来说,状态压缩使用“树”结构将链外数据以确定性的方式进行加密哈希,计算出一个最终的哈希值,并将其存储在链上。

      这些树是通过这个“确定性”过程创建的:

      • 获取任何数据
      • 创建这些数据的哈希值
      • 将此哈希值存储为树底部的 leaf
      • 每个 leaf 对都会被一起哈希,创建一个 branch
      • 每个 branch 然后一起哈希
      • 不断攀爬树木并将相邻的树枝连接在一起
      • 树顶上一旦到达,就会产生最后的 root hash

      这个 root hash 然后存储在链上,作为每个叶子节点中所有数据的可验证证据。这样任何人都可以通过加密验证树中所有离链数据,而实际上只需在链上存储少量数据。因此,由于这种"状态压缩",大大降低了存储/证明大量数据的成本。

      默克尔树和并发默克尔树

      Solana的状态压缩使用了一种特殊类型的默克尔树,允许对任何给定的树进行多次更改,同时仍然保持树的完整性和有效性。

      这棵特殊的树被称为“并发默克尔树”,有效地在链上保留了树的“更改日志”。允许在一个证明失效之前对同一棵树进行多次快速更改(即在同一个区块中)。

      默克尔树是什么?

      默克尔树,有时也被称为“哈希树”,是一种基于哈希的二叉树结构,其中每个leaf节点都被表示为其内部数据的加密哈希。而每个非叶节点,也被称为“branch节点”,则被表示为其子叶节点哈希的哈希值。

      每个分支也被哈希在一起,沿着树向上爬,直到最后只剩下一个哈希。这个最终的哈希,称为 root hash 或者"根",可以与一个"证明路径"结合使用,来验证存储在叶节点中的任何数据。

      一旦计算出最终的根哈希值(root hash),可以通过重新计算特定叶子(leaf)节点的数据和每个相邻分支的哈希标签(称为“证明路径”)来验证存储在节点中的任何数据。将这个“重新哈希”与根哈希值进行比较,可以验证底层叶子数据的准确性。如果它们匹配,数据就被验证为准确的。如果它们不匹配,叶子数据已被更改。

      只要需要,原始叶子数据可以通过对新的叶子数据进行哈希运算并重新计算根哈希值来进行更改,方法与原始根哈希值的计算方式相同。然后,这个新的根哈希值用于验证任何数据,并且有效地使之前的根哈希值和证明无效。因此,对这些传统的默克尔树的每一次更改都需要按顺序执行。

      info

      当使用默克尔树时,更改叶子数据并计算新的根哈希的过程可能是非常常见的事情!虽然这是树的设计要点之一,但它可能导致最显著的缺点之一:快速变化。

      什么是并发默克尔树?

      在高吞吐量的应用中,比如在Solana运行时中,对于链上传统Merkle树的更改请求可能会相对快速地连续接收到验证者(例如在同一个槽中)。每个叶子数据的更改仍然需要按顺序执行。这导致每个后续的更改请求都会失败,因为根哈希和证明已经被同一槽中之前的更改请求无效化了。

      进入,并发默克尔树。

      并发默克尔树存储了最近更改的安全日志、它们的根哈希以及用于推导根哈希的证明。这个日志缓冲区存储在链上的每个树对应的特定账户中,最大记录数为(也称为 maxBufferSize )。

      当同一时隙内的验证者收到多个叶子数据变更请求时,链上并发 Merkle 树可以将这个“变更日志缓冲区”作为更可接受的证明的真实来源。有效地允许在同一时隙内对同一棵树进行多达 maxBufferSize 次变更。大幅提升吞吐量。

      并发默克尔树的大小调整

      创建这种链上树时,有三个值将决定您的树的大小、创建树的成本以及对树的并发更改数量:

      1. max depth 最大深度
      2. max buffer size 最大缓冲区大小
      3. canopy depth

      max depth

      树的“最大深度”是从任何数据 leaf 到树的 root 所需的最大跳数。

      由于默克尔树是二叉树,每个叶子节点只与另一个叶子节点相连;存在于一个 leaf pair 中。

      因此,树的 maxDepth 被用来确定可以通过简单的计算存储在树中的最大节点数(也称为数据或 leafs

      nodes_count = 2 ^ maxDepth

      由于树的深度必须在创建树时设置,您必须决定您希望树存储多少个数据。然后使用上述简单的计算,您可以确定存储数据的最低 maxDepth

      示例1:铸造100个NFTs

      如果你想创建一个用于存储100个压缩NFT的树,我们至少需要"100个叶子"或"100个节点"。

      // maxDepth=6 -> 64 nodes
      2^6 = 64

      // maxDepth=7 -> 128 nodes
      2^7 = 128

      因此,我们需要一个最大深度为 7 的树,以存储 100 个数据。

      例子2:铸造15000个NFTs

      如果你想创建一个用于存储15000个压缩NFT的树,我们将需要至少"15000个叶子"或"15000个节点"。

      // maxDepth=13 -> 8192 nodes
      2^13 = 8192

      // maxDepth=14 -> 16384 nodes
      2^14 = 16384

      因此,我们需要一个最大深度为 14 的树,以存储 15000 个数据。

      最大深度越高,成本越高

      创建树时, maxDepth 值将是成本的主要驱动因素之一,因为您将在创建树时支付这笔成本。最大树深度越高,您可以存储的数据指纹(也称为哈希)越多,成本就越高。

      max buffer size

      max buffer size” 实际上是树上可以发生的最大变化数量,同时仍然有效的 root hash

      由于根哈希有效地是所有叶子数据的单一哈希,改变任何一个叶子将使得所有后续尝试改变常规树的叶子所需的证明无效。

      但是使用并发树,对于这些证明来说,实际上有一个更新的日志。这个日志缓冲区的大小和设置是通过这个 maxBufferSize 值在树创建时完成的。

      Canopy depth

      Canopy depth”,有时也称为Canopy大小,是指在任何给定的证明路径上缓存/存储在链上的证明节点数量。

      在对 leaf 执行更新操作时,例如转让所有权(例如出售压缩的NFT),必须使用完整的证明路径来验证叶子节点的原始所有权,从而允许进行更新操作。此验证是使用完整的证明路径来正确计算当前的 root hash (或通过链上的“并发缓冲区”缓存的任何 root hash )来执行的。

      树的最大深度越大,执行此验证所需的证明节点就越多。例如,如果您的最大深度是 14 ,则需要使用 14 个总的证明节点进行验证。随着树的增大,完整的证明路径也会变得更长。

      通常情况下,每个这些证明节点都需要在每个树更新事务中包含。由于每个证明节点的值在事务中占用 32 bytes (类似于提供公钥),较大的树很快就会超过最大事务大小限制。

      进入CanopyCanopy可以在链上存储一定数量的验证节点(对于任何给定的验证路径)。这样可以在每个更新交易中包含较少的验证节点,从而保持整体交易大小低于限制。

      例如,深度为 14 的树需要 14 个总的验证节点。而有 10Canopy的情况下,每个更新事务只需要提交 4 个验证节点。

      Canopy深度值越大,成本越高

      canopyDepth 值也是创建树时成本的主要因素,因为您将在树的创建时支付这个成本。canopyDepth越高,链上存储的数据证明节点越多,成本也越高。

      较小的Canopy限制了可组合性

      虽然树的创建成本随着Canopy的高度而增加,但较低的Canopy将需要在每个更新事务中包含更多的证明节点。所需提交的节点越多,事务的大小就越大,因此超过事务大小限制就越容易。

      这也适用于任何其他试图与您的树/叶子进行交互的Solana程序或dApp。如果您的树需要太多的证明节点(因为Canopy深度较低),那么任何其他链上程序可能提供的额外操作都将受到其特定指令大小加上您的证明节点列表大小的限制。这限制了可组合性,并限制了您的特定树的潜在附加效用。

      例如,如果您的树被用于压缩的非同质化代币(NFTs),并且Canopy深度非常低,一个NFT市场可能只能支持简单的NFT转移,而无法支持链上竞标系统。

      创建一棵树的成本

      创建并发 Merkle 树的成本基于树的大小参数: maxDepthmaxBufferSizecanopyDepth 。这些值都用于计算在链上存在树所需的链上存储空间(以字节为单位)。

      一旦计算出所需的空间(以字节为单位),并使用 getMinimumBalanceForRentExemption RPC方法,请求在链上分配这些字节所需的费用(以lamports为单位)。

      在JavaScript中计算树木成本

      @solana/spl-account-compression 包中,开发人员可以使用 getConcurrentMerkleTreeAccountSize 函数来计算给定树大小参数所需的空间。

      然后使用 getMinimumBalanceForRentExemption 函数来获取在链上分配所需空间的最终成本(以lamports计算)。

      然后确定以lamports计算的成本,使得这个大小的账户免除租金,与其他账户创建类似。

      // calculate the space required for the tree
      const requiredSpace = getConcurrentMerkleTreeAccountSize(
      maxDepth,
      maxBufferSize,
      canopyDepth,
      );

      // get the cost (in lamports) to store the tree on-chain
      const storageCost = await connection.getMinimumBalanceForRentExemption(
      requiredSpace,
      );

      示例费用

      以下是几个不同树大小的示例成本,包括每个树可能的叶节点数量:

      例子 #1:16,384个节点,成本为0.222 SOL

      • 最大深度为 14 ,最大缓冲区大小为 64
      • 叶节点的最大数量: 16,384
      • 创建 0.222 SOLCanopy深度大约需要 0 的成本

      例子 #2:16,384个节点,成本为1.134 SOL

      • 最大深度为 14 ,最大缓冲区大小为 64
      • 叶节点的最大数量: 16,384
      • 创建 1.134 SOLCanopy深度大约需要 11 的成本

      示例 #3:1,048,576个节点,成本为1.673 SOL

      • 最大深度为 20 ,最大缓冲区大小为 256
      • 叶节点的最大数量: 1,048,576
      • 创建 1.673 SOLCanopy深度大约需要 10 的成本

      示例#4:1,048,576个节点,成本为15.814 SOL

      • 最大深度为 20 ,最大缓冲区大小为 256
      • 叶节点的最大数量: 1,048,576
      • 创建 15.814 SOLCanopy深度大约需要 15 的成本

      压缩的NFTs

      压缩的NFT是Solana上状态压缩的最受欢迎的应用之一。通过压缩,一个拥有一百万个NFT的收藏品可以以 ~50 SOL 的价格铸造,而不是其未压缩的等价收藏品。

      开发者指南:

      阅读我们的开发者指南,了解如何铸造和转移压缩的NFT

      · 3 min read
      Davirain

      欢迎来到Solana共学,这是一个精心设计的教程系列,供任何对Solana感兴趣的人深入学习。无论你是初学者还是有经验的开发者,这些模块都会引导你了解Solana区块链开发的基本内容。

      模块1:Solana基础

      • 区块链基本概念介绍
      • 本地程序开发环境配置
        • 原始Solana合约实现《hello, World》
        • Anchor合约框架实现《hello, World》
        • 使用Solang编译器编译solidity合约实现《hello, World》
      • BackPack钱包使用
      • 客户端开发
      • 钱包和前端
      • 自定义指令
      • 开始你自己的定制项目

      模块2:Solana高级主题

      • SPL token
      • NFTs + 使用Metaplex进行铸造
      • 在用户界面中展示NFTs
      • 创造神奇的网络货币并出售JPEG图片

      更深入的模块:深入了解Solana

      • 模块3:Rust入门,原生Solana开发,安全性,NFT质押
      • 模块4:本地环境,跨程序调用,测试,质押应用开发
      • 模块5:Anchor入门,全栈Anchor应用开发
      • 模块6:发布周,随机性,完善

      特别主题:超越基础

      • Solana程序中的环境变量
      • Solana支付,版本化事务,Rust宏
      • Solana程序安全:签名授权,所有者检查,重新初始化攻击,PDA共享等
      • 使用Solidity编写Solana合约
      • 发行Token2020,压缩NFT
      • 在Solana中使用The Graph,Oracles Pyth SDK
      • TipLink使用,如何在Quicknode和Helius申请RPC endpoint
      • 等等...

      和我们一起,在这全面的指南中探索Solana的每一个方面。从最基本的内容到安全和合约开发的复杂方面,Solana共学为每一位Solana爱好者提供了内容。

      敬请期待,如果有任何问题或需要进一步的协助,请随时与我们联系。欢迎来到Solana共学!

      - + \ No newline at end of file diff --git a/blog/tags/blog/index.html b/blog/tags/blog/index.html index 2f8434c68..5f20245f1 100644 --- a/blog/tags/blog/index.html +++ b/blog/tags/blog/index.html @@ -5,7 +5,7 @@ 4 posts tagged with "blog" | All in One Solana - + @@ -14,7 +14,7 @@ 通常由特定程序(通常是一个智能合约)关联额外的账户。该账号没有私钥,故除程序本身外,无法完成数据签名,无法完成完整的数据交易。

      • ADA (Account Derived Account)

      由 createWithSeed 方法产生。 有一个账号公钥派生出来的关联账户,数据签名权限属于主账号。也即,需要主账号的签名才能完成完整的数据交易。

      solana中,根据数据签名,决定了数据的真实所有权。即 我的数据我做主

      本文主要分析这两种账号的异同。

      地址生成逻辑介绍如下

      • PDA 地址生成规则
      1. buffer = [seed,programId,"ProgramDerivedAddress"]
      2. 对buffer 取 sha256
      3. 如果在曲线上,那么抛出error, 如果不在,那么直接返回作为 使用地址

      createProgramAddressSync

      • ADA 生成
      1. buffer=[fromPublicKey,seed,programId]
      2. buffer 取 sha256, 直接返回

      createWithSeed

      区别在于,数据的托管使用逻辑.

      • ADA 数据签名权限,在于账户本身。即 我的数据我做主,未经允许(我未签名)不能修改。
      • PDA 数据签名权限在于合约。经过程序签名,可以修改 account 的数据和提取其中的sol。

      ADA 账号使用

      数据操作,有配套的函数对应,内部包含 xxxxWithSeedParams 类型的参数,完成对应的操作。 操作数据,需要 主账户的签名,这一点决定了,账号的真实所有权。

      • SystemProgram.createAccountWithSeed 初始化账号
      • SystemProgram.assign 重新分配owner
      • SystemProgram.allocate 分配空间
      • SystemProgram.transfer 转移SOL

      PDA 账号使用

      • 客户端只用于账户地址推导,不能初始化。初始化过程在合约内部完成。
      • 因其签名权限,必须在合约内部完成。他的操作权限完全属于智能合约。

      ADA 账号使用 example

        const seed = "ada.creator";

      // 初始化ada 账户
      let ada_account = await web3.PublicKey.createWithSeed(
      signer.publicKey,
      seed,
      program
      );
      console.log("ada_account address: ", ada_account.toBase58());

      let ada_info = await connection.getAccountInfo(ada_account);

      // 根据是否存在账号,决定是否初始化
      if (ada_info) {
      console.log(ada_info);
      } else {
      console.log("ada account not found");
      const transaction = new web3.Transaction().add(
      web3.SystemProgram.createAccountWithSeed({
      newAccountPubkey: ada_account,
      fromPubkey: signer.publicKey,
      basePubkey: signer.publicKey,
      programId: program,
      seed,
      lamports: web3.LAMPORTS_PER_SOL,
      space: 20,
      })
      );

      PDA 使用 example

      客户端部分代码逻辑

      const pda_seed = "pda.creator";

      const obj = new Model();

      const [pda, bump_seed] = web3.PublicKey.findProgramAddressSync(
      [signer.publicKey.toBuffer(), new TextEncoder().encode(movie.title)],
      program
      );

      console.log("pda address : ", pda.toBase58());

      const instruction = new web3.TransactionInstruction({
      keys: [
      {
      // 付钱的账户
      pubkey: signer.publicKey,
      isSigner: true,
      isWritable: false,
      },
      {
      // PDA将存储数据
      pubkey: pda,
      isSigner: false,
      isWritable: true,
      },
      {
      // 系统程序将用于创建PDA
      pubkey: web3.SystemProgram.programId,
      isSigner: false,
      isWritable: false,
      },
      ],
      // 传输数据
      data: obj.serialize(),
      programId: program,
      });

      const transaction = new web3.Transaction().add(instruction);

      const signature = await web3.sendAndConfirmTransaction(
      connection,
      transaction,
      [signer]
      );

      console.log(signature);

      合约部分代码逻辑

      // 获取账户迭代器
      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)?;

      // 构造PDA账户
      let (pda, bump_seed) =
      Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes()], program_id);

      // 和客户端比对
      if pda != *pda_account.key {
      msg!("Invalid seeds for PDA");
      return Err(ProgramError::InvalidArgument);
      }

      // 计算所需的租金
      let rent = Rent::get()?;
      let rent_lamports = rent.minimum_balance(total_len);

      // 创建账户
      invoke_signed(
      &system_instruction::create_account(
      initializer.key,
      pda_account.key,
      rent_lamports,
      total_len
      .try_into()
      .map_err(|_| Error::ConvertUsizeToU64Failed)?,
      program_id,
      ),
      &[
      initializer.clone(),
      pda_account.clone(),
      system_program.clone(),
      ],
      &[&[initializer.key.as_ref(), title.as_bytes(), &[bump_seed]]],
      )?;

      // MovieAccountState 定义的state类型
      let mut account_data =
      try_from_slice_unchecked::<MovieAccountState>(&pda_account.data.borrow()).unwrap();

      account_data.title = title;
      account_data.rating = rating;
      account_data.description = description;
      account_data.is_initialized = true;

      // 写入pda 数据本身
      account_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;

      参考资料

      · 3 min read
      YanAemons

      報錯日志

      在使用solana-cli時候,鑑於一些依賴版本限制,會用到cli14.xx(主網版本),而不是16.xx(測試網版本)

      例如,在使用solana-cli版本爲1.14.17, anchor版本爲0.26.0的環境中, anchor init創建一個新項目後運行 anchor build會發生以下錯誤:

      error: package constant_time_eq v0.3.0 cannot be built because it requires rustc 1.66.0 or newer, while the currently active rustc version is 1.62.0-dev

      報錯原因

      使用的solana-cli版本在14.xxx, cli內自帶的rustc版本過老,無法編譯較新的依賴

      解決方案

      1. 升級solana-cli至最新版本

      solana-install update

      2.指定依賴包版本

      需要在Cargo.toml文件下指定以下依賴版本

      getrandom = { version = "0.2.9", features = ["custom"] }  
      solana-program = "=1.14.17"
      winnow="=0.4.1"
      toml_datetime="=0.6.1"
      blake3 = "=1.3.1"

      運行cargo clean後重新運行anchor build即可解決

      監聽程序log監聽到兩次

      在使用program.addEventListener()有可能聽到兩次相同的事件,其中一次的txSign會是“1111111111111111111111111111111111111111111111111111111111111111”, 這是因爲監聽到了模擬時的交易哈系,我們只需要在監聽到該交易哈系時拋棄即可

      program.addEventListener("eventName", (event, slot, signature) => {
      if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return

      // do ur stuff
      })

      然而,有時websocket訂閱也會多次返回實際簽名。如果是這種情況,您可以使用一些緩存解決方案。例如,創建一個具有一定長度限制的集合,在此處添加簽名並檢查該集合中是否存在新簽名:

      const handledSignatures = new Set<string>()
      const maxHandledSignaturesLen = 100

      program.addEventListener("eventName", (event, slot, signature) => {
      if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return
      if (handledSignatures.has(signature)) return

      // do ur stuff

      handledSignatures.add(signature)
      if (handledSignatures.size > maxHandledSignaturesLen) {
      handledSignatures.delete(handledSignatures.values().next().value)
      }
      })

      · 17 min read
      Davirain

      Solana上,状态压缩是一种创建离链数据的“指纹”(或哈希)并将该指纹存储在链上以进行安全验证的方法。有效地利用Solana账本的安全性来安全验证离链数据,以确保其未被篡改。

      这种“压缩”方法使得Solana的程序和dApps能够使用廉价的区块链账本空间来安全存储数据,而不是更昂贵的账户空间。

      这是通过使用一种特殊的二叉树结构,称为并发默克尔树,对每个数据片段(称为 leaf )创建哈希,将它们哈希在一起,并仅将最终哈希存储在链上来实现的。

      什么是状态压缩?

      简单来说,状态压缩使用“树”结构将链外数据以确定性的方式进行加密哈希,计算出一个最终的哈希值,并将其存储在链上。

      这些树是通过这个“确定性”过程创建的:

      • 获取任何数据
      • 创建这些数据的哈希值
      • 将此哈希值存储为树底部的 leaf
      • 每个 leaf 对都会被一起哈希,创建一个 branch
      • 每个 branch 然后一起哈希
      • 不断攀爬树木并将相邻的树枝连接在一起
      • 树顶上一旦到达,就会产生最后的 root hash

      这个 root hash 然后存储在链上,作为每个叶子节点中所有数据的可验证证据。这样任何人都可以通过加密验证树中所有离链数据,而实际上只需在链上存储少量数据。因此,由于这种"状态压缩",大大降低了存储/证明大量数据的成本。

      默克尔树和并发默克尔树

      Solana的状态压缩使用了一种特殊类型的默克尔树,允许对任何给定的树进行多次更改,同时仍然保持树的完整性和有效性。

      这棵特殊的树被称为“并发默克尔树”,有效地在链上保留了树的“更改日志”。允许在一个证明失效之前对同一棵树进行多次快速更改(即在同一个区块中)。

      默克尔树是什么?

      默克尔树,有时也被称为“哈希树”,是一种基于哈希的二叉树结构,其中每个leaf节点都被表示为其内部数据的加密哈希。而每个非叶节点,也被称为“branch节点”,则被表示为其子叶节点哈希的哈希值。

      每个分支也被哈希在一起,沿着树向上爬,直到最后只剩下一个哈希。这个最终的哈希,称为 root hash 或者"根",可以与一个"证明路径"结合使用,来验证存储在叶节点中的任何数据。

      一旦计算出最终的根哈希值(root hash),可以通过重新计算特定叶子(leaf)节点的数据和每个相邻分支的哈希标签(称为“证明路径”)来验证存储在节点中的任何数据。将这个“重新哈希”与根哈希值进行比较,可以验证底层叶子数据的准确性。如果它们匹配,数据就被验证为准确的。如果它们不匹配,叶子数据已被更改。

      只要需要,原始叶子数据可以通过对新的叶子数据进行哈希运算并重新计算根哈希值来进行更改,方法与原始根哈希值的计算方式相同。然后,这个新的根哈希值用于验证任何数据,并且有效地使之前的根哈希值和证明无效。因此,对这些传统的默克尔树的每一次更改都需要按顺序执行。

      info

      当使用默克尔树时,更改叶子数据并计算新的根哈希的过程可能是非常常见的事情!虽然这是树的设计要点之一,但它可能导致最显著的缺点之一:快速变化。

      什么是并发默克尔树?

      在高吞吐量的应用中,比如在Solana运行时中,对于链上传统Merkle树的更改请求可能会相对快速地连续接收到验证者(例如在同一个槽中)。每个叶子数据的更改仍然需要按顺序执行。这导致每个后续的更改请求都会失败,因为根哈希和证明已经被同一槽中之前的更改请求无效化了。

      进入,并发默克尔树。

      并发默克尔树存储了最近更改的安全日志、它们的根哈希以及用于推导根哈希的证明。这个日志缓冲区存储在链上的每个树对应的特定账户中,最大记录数为(也称为 maxBufferSize )。

      当同一时隙内的验证者收到多个叶子数据变更请求时,链上并发 Merkle 树可以将这个“变更日志缓冲区”作为更可接受的证明的真实来源。有效地允许在同一时隙内对同一棵树进行多达 maxBufferSize 次变更。大幅提升吞吐量。

      并发默克尔树的大小调整

      创建这种链上树时,有三个值将决定您的树的大小、创建树的成本以及对树的并发更改数量:

      1. max depth 最大深度
      2. max buffer size 最大缓冲区大小
      3. canopy depth

      max depth

      树的“最大深度”是从任何数据 leaf 到树的 root 所需的最大跳数。

      由于默克尔树是二叉树,每个叶子节点只与另一个叶子节点相连;存在于一个 leaf pair 中。

      因此,树的 maxDepth 被用来确定可以通过简单的计算存储在树中的最大节点数(也称为数据或 leafs

      nodes_count = 2 ^ maxDepth

      由于树的深度必须在创建树时设置,您必须决定您希望树存储多少个数据。然后使用上述简单的计算,您可以确定存储数据的最低 maxDepth

      示例1:铸造100个NFTs

      如果你想创建一个用于存储100个压缩NFT的树,我们至少需要"100个叶子"或"100个节点"。

      // maxDepth=6 -> 64 nodes
      2^6 = 64

      // maxDepth=7 -> 128 nodes
      2^7 = 128

      因此,我们需要一个最大深度为 7 的树,以存储 100 个数据。

      例子2:铸造15000个NFTs

      如果你想创建一个用于存储15000个压缩NFT的树,我们将需要至少"15000个叶子"或"15000个节点"。

      // maxDepth=13 -> 8192 nodes
      2^13 = 8192

      // maxDepth=14 -> 16384 nodes
      2^14 = 16384

      因此,我们需要一个最大深度为 14 的树,以存储 15000 个数据。

      最大深度越高,成本越高

      创建树时, maxDepth 值将是成本的主要驱动因素之一,因为您将在创建树时支付这笔成本。最大树深度越高,您可以存储的数据指纹(也称为哈希)越多,成本就越高。

      max buffer size

      max buffer size” 实际上是树上可以发生的最大变化数量,同时仍然有效的 root hash

      由于根哈希有效地是所有叶子数据的单一哈希,改变任何一个叶子将使得所有后续尝试改变常规树的叶子所需的证明无效。

      但是使用并发树,对于这些证明来说,实际上有一个更新的日志。这个日志缓冲区的大小和设置是通过这个 maxBufferSize 值在树创建时完成的。

      Canopy depth

      Canopy depth”,有时也称为Canopy大小,是指在任何给定的证明路径上缓存/存储在链上的证明节点数量。

      在对 leaf 执行更新操作时,例如转让所有权(例如出售压缩的NFT),必须使用完整的证明路径来验证叶子节点的原始所有权,从而允许进行更新操作。此验证是使用完整的证明路径来正确计算当前的 root hash (或通过链上的“并发缓冲区”缓存的任何 root hash )来执行的。

      树的最大深度越大,执行此验证所需的证明节点就越多。例如,如果您的最大深度是 14 ,则需要使用 14 个总的证明节点进行验证。随着树的增大,完整的证明路径也会变得更长。

      通常情况下,每个这些证明节点都需要在每个树更新事务中包含。由于每个证明节点的值在事务中占用 32 bytes (类似于提供公钥),较大的树很快就会超过最大事务大小限制。

      进入CanopyCanopy可以在链上存储一定数量的验证节点(对于任何给定的验证路径)。这样可以在每个更新交易中包含较少的验证节点,从而保持整体交易大小低于限制。

      例如,深度为 14 的树需要 14 个总的验证节点。而有 10Canopy的情况下,每个更新事务只需要提交 4 个验证节点。

      Canopy深度值越大,成本越高

      canopyDepth 值也是创建树时成本的主要因素,因为您将在树的创建时支付这个成本。canopyDepth越高,链上存储的数据证明节点越多,成本也越高。

      较小的Canopy限制了可组合性

      虽然树的创建成本随着Canopy的高度而增加,但较低的Canopy将需要在每个更新事务中包含更多的证明节点。所需提交的节点越多,事务的大小就越大,因此超过事务大小限制就越容易。

      这也适用于任何其他试图与您的树/叶子进行交互的Solana程序或dApp。如果您的树需要太多的证明节点(因为Canopy深度较低),那么任何其他链上程序可能提供的额外操作都将受到其特定指令大小加上您的证明节点列表大小的限制。这限制了可组合性,并限制了您的特定树的潜在附加效用。

      例如,如果您的树被用于压缩的非同质化代币(NFTs),并且Canopy深度非常低,一个NFT市场可能只能支持简单的NFT转移,而无法支持链上竞标系统。

      创建一棵树的成本

      创建并发 Merkle 树的成本基于树的大小参数: maxDepthmaxBufferSizecanopyDepth 。这些值都用于计算在链上存在树所需的链上存储空间(以字节为单位)。

      一旦计算出所需的空间(以字节为单位),并使用 getMinimumBalanceForRentExemption RPC方法,请求在链上分配这些字节所需的费用(以lamports为单位)。

      在JavaScript中计算树木成本

      @solana/spl-account-compression 包中,开发人员可以使用 getConcurrentMerkleTreeAccountSize 函数来计算给定树大小参数所需的空间。

      然后使用 getMinimumBalanceForRentExemption 函数来获取在链上分配所需空间的最终成本(以lamports计算)。

      然后确定以lamports计算的成本,使得这个大小的账户免除租金,与其他账户创建类似。

      // calculate the space required for the tree
      const requiredSpace = getConcurrentMerkleTreeAccountSize(
      maxDepth,
      maxBufferSize,
      canopyDepth,
      );

      // get the cost (in lamports) to store the tree on-chain
      const storageCost = await connection.getMinimumBalanceForRentExemption(
      requiredSpace,
      );

      示例费用

      以下是几个不同树大小的示例成本,包括每个树可能的叶节点数量:

      例子 #1:16,384个节点,成本为0.222 SOL

      • 最大深度为 14 ,最大缓冲区大小为 64
      • 叶节点的最大数量: 16,384
      • 创建 0.222 SOLCanopy深度大约需要 0 的成本

      例子 #2:16,384个节点,成本为1.134 SOL

      • 最大深度为 14 ,最大缓冲区大小为 64
      • 叶节点的最大数量: 16,384
      • 创建 1.134 SOLCanopy深度大约需要 11 的成本

      示例 #3:1,048,576个节点,成本为1.673 SOL

      • 最大深度为 20 ,最大缓冲区大小为 256
      • 叶节点的最大数量: 1,048,576
      • 创建 1.673 SOLCanopy深度大约需要 10 的成本

      示例#4:1,048,576个节点,成本为15.814 SOL

      • 最大深度为 20 ,最大缓冲区大小为 256
      • 叶节点的最大数量: 1,048,576
      • 创建 15.814 SOLCanopy深度大约需要 15 的成本

      压缩的NFTs

      压缩的NFT是Solana上状态压缩的最受欢迎的应用之一。通过压缩,一个拥有一百万个NFT的收藏品可以以 ~50 SOL 的价格铸造,而不是其未压缩的等价收藏品。

      开发者指南:

      阅读我们的开发者指南,了解如何铸造和转移压缩的NFT

      · 3 min read
      Davirain

      欢迎来到Solana共学,这是一个精心设计的教程系列,供任何对Solana感兴趣的人深入学习。无论你是初学者还是有经验的开发者,这些模块都会引导你了解Solana区块链开发的基本内容。

      模块1:Solana基础

      • 区块链基本概念介绍
      • 本地程序开发环境配置
        • 原始Solana合约实现《hello, World》
        • Anchor合约框架实现《hello, World》
        • 使用Solang编译器编译solidity合约实现《hello, World》
      • BackPack钱包使用
      • 客户端开发
      • 钱包和前端
      • 自定义指令
      • 开始你自己的定制项目

      模块2:Solana高级主题

      • SPL token
      • NFTs + 使用Metaplex进行铸造
      • 在用户界面中展示NFTs
      • 创造神奇的网络货币并出售JPEG图片

      更深入的模块:深入了解Solana

      • 模块3:Rust入门,原生Solana开发,安全性,NFT质押
      • 模块4:本地环境,跨程序调用,测试,质押应用开发
      • 模块5:Anchor入门,全栈Anchor应用开发
      • 模块6:发布周,随机性,完善

      特别主题:超越基础

      • Solana程序中的环境变量
      • Solana支付,版本化事务,Rust宏
      • Solana程序安全:签名授权,所有者检查,重新初始化攻击,PDA共享等
      • 使用Solidity编写Solana合约
      • 发行Token2020,压缩NFT
      • 在Solana中使用The Graph,Oracles Pyth SDK
      • TipLink使用,如何在Quicknode和Helius申请RPC endpoint
      • 等等...

      和我们一起,在这全面的指南中探索Solana的每一个方面。从最基本的内容到安全和合约开发的复杂方面,Solana共学为每一位Solana爱好者提供了内容。

      敬请期待,如果有任何问题或需要进一步的协助,请随时与我们联系。欢迎来到Solana共学!

      - + \ No newline at end of file diff --git a/blog/tags/co-learn/index.html b/blog/tags/co-learn/index.html index 545b727f7..6b99db72a 100644 --- a/blog/tags/co-learn/index.html +++ b/blog/tags/co-learn/index.html @@ -5,7 +5,7 @@ 2 posts tagged with "co-learn" | All in One Solana - + @@ -14,7 +14,7 @@ 通常由特定程序(通常是一个智能合约)关联额外的账户。该账号没有私钥,故除程序本身外,无法完成数据签名,无法完成完整的数据交易。

      • ADA (Account Derived Account)

      由 createWithSeed 方法产生。 有一个账号公钥派生出来的关联账户,数据签名权限属于主账号。也即,需要主账号的签名才能完成完整的数据交易。

      solana中,根据数据签名,决定了数据的真实所有权。即 我的数据我做主

      本文主要分析这两种账号的异同。

      地址生成逻辑介绍如下

      • PDA 地址生成规则
      1. buffer = [seed,programId,"ProgramDerivedAddress"]
      2. 对buffer 取 sha256
      3. 如果在曲线上,那么抛出error, 如果不在,那么直接返回作为 使用地址

      createProgramAddressSync

      • ADA 生成
      1. buffer=[fromPublicKey,seed,programId]
      2. buffer 取 sha256, 直接返回

      createWithSeed

      区别在于,数据的托管使用逻辑.

      • ADA 数据签名权限,在于账户本身。即 我的数据我做主,未经允许(我未签名)不能修改。
      • PDA 数据签名权限在于合约。经过程序签名,可以修改 account 的数据和提取其中的sol。

      ADA 账号使用

      数据操作,有配套的函数对应,内部包含 xxxxWithSeedParams 类型的参数,完成对应的操作。 操作数据,需要 主账户的签名,这一点决定了,账号的真实所有权。

      • SystemProgram.createAccountWithSeed 初始化账号
      • SystemProgram.assign 重新分配owner
      • SystemProgram.allocate 分配空间
      • SystemProgram.transfer 转移SOL

      PDA 账号使用

      • 客户端只用于账户地址推导,不能初始化。初始化过程在合约内部完成。
      • 因其签名权限,必须在合约内部完成。他的操作权限完全属于智能合约。

      ADA 账号使用 example

        const seed = "ada.creator";

      // 初始化ada 账户
      let ada_account = await web3.PublicKey.createWithSeed(
      signer.publicKey,
      seed,
      program
      );
      console.log("ada_account address: ", ada_account.toBase58());

      let ada_info = await connection.getAccountInfo(ada_account);

      // 根据是否存在账号,决定是否初始化
      if (ada_info) {
      console.log(ada_info);
      } else {
      console.log("ada account not found");
      const transaction = new web3.Transaction().add(
      web3.SystemProgram.createAccountWithSeed({
      newAccountPubkey: ada_account,
      fromPubkey: signer.publicKey,
      basePubkey: signer.publicKey,
      programId: program,
      seed,
      lamports: web3.LAMPORTS_PER_SOL,
      space: 20,
      })
      );

      PDA 使用 example

      客户端部分代码逻辑

      const pda_seed = "pda.creator";

      const obj = new Model();

      const [pda, bump_seed] = web3.PublicKey.findProgramAddressSync(
      [signer.publicKey.toBuffer(), new TextEncoder().encode(movie.title)],
      program
      );

      console.log("pda address : ", pda.toBase58());

      const instruction = new web3.TransactionInstruction({
      keys: [
      {
      // 付钱的账户
      pubkey: signer.publicKey,
      isSigner: true,
      isWritable: false,
      },
      {
      // PDA将存储数据
      pubkey: pda,
      isSigner: false,
      isWritable: true,
      },
      {
      // 系统程序将用于创建PDA
      pubkey: web3.SystemProgram.programId,
      isSigner: false,
      isWritable: false,
      },
      ],
      // 传输数据
      data: obj.serialize(),
      programId: program,
      });

      const transaction = new web3.Transaction().add(instruction);

      const signature = await web3.sendAndConfirmTransaction(
      connection,
      transaction,
      [signer]
      );

      console.log(signature);

      合约部分代码逻辑

      // 获取账户迭代器
      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)?;

      // 构造PDA账户
      let (pda, bump_seed) =
      Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes()], program_id);

      // 和客户端比对
      if pda != *pda_account.key {
      msg!("Invalid seeds for PDA");
      return Err(ProgramError::InvalidArgument);
      }

      // 计算所需的租金
      let rent = Rent::get()?;
      let rent_lamports = rent.minimum_balance(total_len);

      // 创建账户
      invoke_signed(
      &system_instruction::create_account(
      initializer.key,
      pda_account.key,
      rent_lamports,
      total_len
      .try_into()
      .map_err(|_| Error::ConvertUsizeToU64Failed)?,
      program_id,
      ),
      &[
      initializer.clone(),
      pda_account.clone(),
      system_program.clone(),
      ],
      &[&[initializer.key.as_ref(), title.as_bytes(), &[bump_seed]]],
      )?;

      // MovieAccountState 定义的state类型
      let mut account_data =
      try_from_slice_unchecked::<MovieAccountState>(&pda_account.data.borrow()).unwrap();

      account_data.title = title;
      account_data.rating = rating;
      account_data.description = description;
      account_data.is_initialized = true;

      // 写入pda 数据本身
      account_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;

      参考资料

      · 3 min read
      Davirain

      欢迎来到Solana共学,这是一个精心设计的教程系列,供任何对Solana感兴趣的人深入学习。无论你是初学者还是有经验的开发者,这些模块都会引导你了解Solana区块链开发的基本内容。

      模块1:Solana基础

      • 区块链基本概念介绍
      • 本地程序开发环境配置
        • 原始Solana合约实现《hello, World》
        • Anchor合约框架实现《hello, World》
        • 使用Solang编译器编译solidity合约实现《hello, World》
      • BackPack钱包使用
      • 客户端开发
      • 钱包和前端
      • 自定义指令
      • 开始你自己的定制项目

      模块2:Solana高级主题

      • SPL token
      • NFTs + 使用Metaplex进行铸造
      • 在用户界面中展示NFTs
      • 创造神奇的网络货币并出售JPEG图片

      更深入的模块:深入了解Solana

      • 模块3:Rust入门,原生Solana开发,安全性,NFT质押
      • 模块4:本地环境,跨程序调用,测试,质押应用开发
      • 模块5:Anchor入门,全栈Anchor应用开发
      • 模块6:发布周,随机性,完善

      特别主题:超越基础

      • Solana程序中的环境变量
      • Solana支付,版本化事务,Rust宏
      • Solana程序安全:签名授权,所有者检查,重新初始化攻击,PDA共享等
      • 使用Solidity编写Solana合约
      • 发行Token2020,压缩NFT
      • 在Solana中使用The Graph,Oracles Pyth SDK
      • TipLink使用,如何在Quicknode和Helius申请RPC endpoint
      • 等等...

      和我们一起,在这全面的指南中探索Solana的每一个方面。从最基本的内容到安全和合约开发的复杂方面,Solana共学为每一位Solana爱好者提供了内容。

      敬请期待,如果有任何问题或需要进一步的协助,请随时与我们联系。欢迎来到Solana共学!

      - + \ No newline at end of file diff --git a/blog/tags/index.html b/blog/tags/index.html index 42260557e..df1202d98 100644 --- a/blog/tags/index.html +++ b/blog/tags/index.html @@ -5,13 +5,13 @@ 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 18b9ffd53..4ffd3f304 100644 --- a/blog/tags/solana/index.html +++ b/blog/tags/solana/index.html @@ -5,7 +5,7 @@ 4 posts tagged with "solana" | All in One Solana - + @@ -14,7 +14,7 @@ 通常由特定程序(通常是一个智能合约)关联额外的账户。该账号没有私钥,故除程序本身外,无法完成数据签名,无法完成完整的数据交易。

      • ADA (Account Derived Account)

      由 createWithSeed 方法产生。 有一个账号公钥派生出来的关联账户,数据签名权限属于主账号。也即,需要主账号的签名才能完成完整的数据交易。

      solana中,根据数据签名,决定了数据的真实所有权。即 我的数据我做主

      本文主要分析这两种账号的异同。

      地址生成逻辑介绍如下

      • PDA 地址生成规则
      1. buffer = [seed,programId,"ProgramDerivedAddress"]
      2. 对buffer 取 sha256
      3. 如果在曲线上,那么抛出error, 如果不在,那么直接返回作为 使用地址

      createProgramAddressSync

      • ADA 生成
      1. buffer=[fromPublicKey,seed,programId]
      2. buffer 取 sha256, 直接返回

      createWithSeed

      区别在于,数据的托管使用逻辑.

      • ADA 数据签名权限,在于账户本身。即 我的数据我做主,未经允许(我未签名)不能修改。
      • PDA 数据签名权限在于合约。经过程序签名,可以修改 account 的数据和提取其中的sol。

      ADA 账号使用

      数据操作,有配套的函数对应,内部包含 xxxxWithSeedParams 类型的参数,完成对应的操作。 操作数据,需要 主账户的签名,这一点决定了,账号的真实所有权。

      • SystemProgram.createAccountWithSeed 初始化账号
      • SystemProgram.assign 重新分配owner
      • SystemProgram.allocate 分配空间
      • SystemProgram.transfer 转移SOL

      PDA 账号使用

      • 客户端只用于账户地址推导,不能初始化。初始化过程在合约内部完成。
      • 因其签名权限,必须在合约内部完成。他的操作权限完全属于智能合约。

      ADA 账号使用 example

        const seed = "ada.creator";

      // 初始化ada 账户
      let ada_account = await web3.PublicKey.createWithSeed(
      signer.publicKey,
      seed,
      program
      );
      console.log("ada_account address: ", ada_account.toBase58());

      let ada_info = await connection.getAccountInfo(ada_account);

      // 根据是否存在账号,决定是否初始化
      if (ada_info) {
      console.log(ada_info);
      } else {
      console.log("ada account not found");
      const transaction = new web3.Transaction().add(
      web3.SystemProgram.createAccountWithSeed({
      newAccountPubkey: ada_account,
      fromPubkey: signer.publicKey,
      basePubkey: signer.publicKey,
      programId: program,
      seed,
      lamports: web3.LAMPORTS_PER_SOL,
      space: 20,
      })
      );

      PDA 使用 example

      客户端部分代码逻辑

      const pda_seed = "pda.creator";

      const obj = new Model();

      const [pda, bump_seed] = web3.PublicKey.findProgramAddressSync(
      [signer.publicKey.toBuffer(), new TextEncoder().encode(movie.title)],
      program
      );

      console.log("pda address : ", pda.toBase58());

      const instruction = new web3.TransactionInstruction({
      keys: [
      {
      // 付钱的账户
      pubkey: signer.publicKey,
      isSigner: true,
      isWritable: false,
      },
      {
      // PDA将存储数据
      pubkey: pda,
      isSigner: false,
      isWritable: true,
      },
      {
      // 系统程序将用于创建PDA
      pubkey: web3.SystemProgram.programId,
      isSigner: false,
      isWritable: false,
      },
      ],
      // 传输数据
      data: obj.serialize(),
      programId: program,
      });

      const transaction = new web3.Transaction().add(instruction);

      const signature = await web3.sendAndConfirmTransaction(
      connection,
      transaction,
      [signer]
      );

      console.log(signature);

      合约部分代码逻辑

      // 获取账户迭代器
      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)?;

      // 构造PDA账户
      let (pda, bump_seed) =
      Pubkey::find_program_address(&[initializer.key.as_ref(), title.as_bytes()], program_id);

      // 和客户端比对
      if pda != *pda_account.key {
      msg!("Invalid seeds for PDA");
      return Err(ProgramError::InvalidArgument);
      }

      // 计算所需的租金
      let rent = Rent::get()?;
      let rent_lamports = rent.minimum_balance(total_len);

      // 创建账户
      invoke_signed(
      &system_instruction::create_account(
      initializer.key,
      pda_account.key,
      rent_lamports,
      total_len
      .try_into()
      .map_err(|_| Error::ConvertUsizeToU64Failed)?,
      program_id,
      ),
      &[
      initializer.clone(),
      pda_account.clone(),
      system_program.clone(),
      ],
      &[&[initializer.key.as_ref(), title.as_bytes(), &[bump_seed]]],
      )?;

      // MovieAccountState 定义的state类型
      let mut account_data =
      try_from_slice_unchecked::<MovieAccountState>(&pda_account.data.borrow()).unwrap();

      account_data.title = title;
      account_data.rating = rating;
      account_data.description = description;
      account_data.is_initialized = true;

      // 写入pda 数据本身
      account_data.serialize(&mut &mut pda_account.data.borrow_mut()[..])?;

      参考资料

      · 3 min read
      YanAemons

      報錯日志

      在使用solana-cli時候,鑑於一些依賴版本限制,會用到cli14.xx(主網版本),而不是16.xx(測試網版本)

      例如,在使用solana-cli版本爲1.14.17, anchor版本爲0.26.0的環境中, anchor init創建一個新項目後運行 anchor build會發生以下錯誤:

      error: package constant_time_eq v0.3.0 cannot be built because it requires rustc 1.66.0 or newer, while the currently active rustc version is 1.62.0-dev

      報錯原因

      使用的solana-cli版本在14.xxx, cli內自帶的rustc版本過老,無法編譯較新的依賴

      解決方案

      1. 升級solana-cli至最新版本

      solana-install update

      2.指定依賴包版本

      需要在Cargo.toml文件下指定以下依賴版本

      getrandom = { version = "0.2.9", features = ["custom"] }  
      solana-program = "=1.14.17"
      winnow="=0.4.1"
      toml_datetime="=0.6.1"
      blake3 = "=1.3.1"

      運行cargo clean後重新運行anchor build即可解決

      監聽程序log監聽到兩次

      在使用program.addEventListener()有可能聽到兩次相同的事件,其中一次的txSign會是“1111111111111111111111111111111111111111111111111111111111111111”, 這是因爲監聽到了模擬時的交易哈系,我們只需要在監聽到該交易哈系時拋棄即可

      program.addEventListener("eventName", (event, slot, signature) => {
      if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return

      // do ur stuff
      })

      然而,有時websocket訂閱也會多次返回實際簽名。如果是這種情況,您可以使用一些緩存解決方案。例如,創建一個具有一定長度限制的集合,在此處添加簽名並檢查該集合中是否存在新簽名:

      const handledSignatures = new Set<string>()
      const maxHandledSignaturesLen = 100

      program.addEventListener("eventName", (event, slot, signature) => {
      if (signature === '1111111111111111111111111111111111111111111111111111111111111111') return
      if (handledSignatures.has(signature)) return

      // do ur stuff

      handledSignatures.add(signature)
      if (handledSignatures.size > maxHandledSignaturesLen) {
      handledSignatures.delete(handledSignatures.values().next().value)
      }
      })

      · 17 min read
      Davirain

      Solana上,状态压缩是一种创建离链数据的“指纹”(或哈希)并将该指纹存储在链上以进行安全验证的方法。有效地利用Solana账本的安全性来安全验证离链数据,以确保其未被篡改。

      这种“压缩”方法使得Solana的程序和dApps能够使用廉价的区块链账本空间来安全存储数据,而不是更昂贵的账户空间。

      这是通过使用一种特殊的二叉树结构,称为并发默克尔树,对每个数据片段(称为 leaf )创建哈希,将它们哈希在一起,并仅将最终哈希存储在链上来实现的。

      什么是状态压缩?

      简单来说,状态压缩使用“树”结构将链外数据以确定性的方式进行加密哈希,计算出一个最终的哈希值,并将其存储在链上。

      这些树是通过这个“确定性”过程创建的:

      • 获取任何数据
      • 创建这些数据的哈希值
      • 将此哈希值存储为树底部的 leaf
      • 每个 leaf 对都会被一起哈希,创建一个 branch
      • 每个 branch 然后一起哈希
      • 不断攀爬树木并将相邻的树枝连接在一起
      • 树顶上一旦到达,就会产生最后的 root hash

      这个 root hash 然后存储在链上,作为每个叶子节点中所有数据的可验证证据。这样任何人都可以通过加密验证树中所有离链数据,而实际上只需在链上存储少量数据。因此,由于这种"状态压缩",大大降低了存储/证明大量数据的成本。

      默克尔树和并发默克尔树

      Solana的状态压缩使用了一种特殊类型的默克尔树,允许对任何给定的树进行多次更改,同时仍然保持树的完整性和有效性。

      这棵特殊的树被称为“并发默克尔树”,有效地在链上保留了树的“更改日志”。允许在一个证明失效之前对同一棵树进行多次快速更改(即在同一个区块中)。

      默克尔树是什么?

      默克尔树,有时也被称为“哈希树”,是一种基于哈希的二叉树结构,其中每个leaf节点都被表示为其内部数据的加密哈希。而每个非叶节点,也被称为“branch节点”,则被表示为其子叶节点哈希的哈希值。

      每个分支也被哈希在一起,沿着树向上爬,直到最后只剩下一个哈希。这个最终的哈希,称为 root hash 或者"根",可以与一个"证明路径"结合使用,来验证存储在叶节点中的任何数据。

      一旦计算出最终的根哈希值(root hash),可以通过重新计算特定叶子(leaf)节点的数据和每个相邻分支的哈希标签(称为“证明路径”)来验证存储在节点中的任何数据。将这个“重新哈希”与根哈希值进行比较,可以验证底层叶子数据的准确性。如果它们匹配,数据就被验证为准确的。如果它们不匹配,叶子数据已被更改。

      只要需要,原始叶子数据可以通过对新的叶子数据进行哈希运算并重新计算根哈希值来进行更改,方法与原始根哈希值的计算方式相同。然后,这个新的根哈希值用于验证任何数据,并且有效地使之前的根哈希值和证明无效。因此,对这些传统的默克尔树的每一次更改都需要按顺序执行。

      info

      当使用默克尔树时,更改叶子数据并计算新的根哈希的过程可能是非常常见的事情!虽然这是树的设计要点之一,但它可能导致最显著的缺点之一:快速变化。

      什么是并发默克尔树?

      在高吞吐量的应用中,比如在Solana运行时中,对于链上传统Merkle树的更改请求可能会相对快速地连续接收到验证者(例如在同一个槽中)。每个叶子数据的更改仍然需要按顺序执行。这导致每个后续的更改请求都会失败,因为根哈希和证明已经被同一槽中之前的更改请求无效化了。

      进入,并发默克尔树。

      并发默克尔树存储了最近更改的安全日志、它们的根哈希以及用于推导根哈希的证明。这个日志缓冲区存储在链上的每个树对应的特定账户中,最大记录数为(也称为 maxBufferSize )。

      当同一时隙内的验证者收到多个叶子数据变更请求时,链上并发 Merkle 树可以将这个“变更日志缓冲区”作为更可接受的证明的真实来源。有效地允许在同一时隙内对同一棵树进行多达 maxBufferSize 次变更。大幅提升吞吐量。

      并发默克尔树的大小调整

      创建这种链上树时,有三个值将决定您的树的大小、创建树的成本以及对树的并发更改数量:

      1. max depth 最大深度
      2. max buffer size 最大缓冲区大小
      3. canopy depth

      max depth

      树的“最大深度”是从任何数据 leaf 到树的 root 所需的最大跳数。

      由于默克尔树是二叉树,每个叶子节点只与另一个叶子节点相连;存在于一个 leaf pair 中。

      因此,树的 maxDepth 被用来确定可以通过简单的计算存储在树中的最大节点数(也称为数据或 leafs

      nodes_count = 2 ^ maxDepth

      由于树的深度必须在创建树时设置,您必须决定您希望树存储多少个数据。然后使用上述简单的计算,您可以确定存储数据的最低 maxDepth

      示例1:铸造100个NFTs

      如果你想创建一个用于存储100个压缩NFT的树,我们至少需要"100个叶子"或"100个节点"。

      // maxDepth=6 -> 64 nodes
      2^6 = 64

      // maxDepth=7 -> 128 nodes
      2^7 = 128

      因此,我们需要一个最大深度为 7 的树,以存储 100 个数据。

      例子2:铸造15000个NFTs

      如果你想创建一个用于存储15000个压缩NFT的树,我们将需要至少"15000个叶子"或"15000个节点"。

      // maxDepth=13 -> 8192 nodes
      2^13 = 8192

      // maxDepth=14 -> 16384 nodes
      2^14 = 16384

      因此,我们需要一个最大深度为 14 的树,以存储 15000 个数据。

      最大深度越高,成本越高

      创建树时, maxDepth 值将是成本的主要驱动因素之一,因为您将在创建树时支付这笔成本。最大树深度越高,您可以存储的数据指纹(也称为哈希)越多,成本就越高。

      max buffer size

      max buffer size” 实际上是树上可以发生的最大变化数量,同时仍然有效的 root hash

      由于根哈希有效地是所有叶子数据的单一哈希,改变任何一个叶子将使得所有后续尝试改变常规树的叶子所需的证明无效。

      但是使用并发树,对于这些证明来说,实际上有一个更新的日志。这个日志缓冲区的大小和设置是通过这个 maxBufferSize 值在树创建时完成的。

      Canopy depth

      Canopy depth”,有时也称为Canopy大小,是指在任何给定的证明路径上缓存/存储在链上的证明节点数量。

      在对 leaf 执行更新操作时,例如转让所有权(例如出售压缩的NFT),必须使用完整的证明路径来验证叶子节点的原始所有权,从而允许进行更新操作。此验证是使用完整的证明路径来正确计算当前的 root hash (或通过链上的“并发缓冲区”缓存的任何 root hash )来执行的。

      树的最大深度越大,执行此验证所需的证明节点就越多。例如,如果您的最大深度是 14 ,则需要使用 14 个总的证明节点进行验证。随着树的增大,完整的证明路径也会变得更长。

      通常情况下,每个这些证明节点都需要在每个树更新事务中包含。由于每个证明节点的值在事务中占用 32 bytes (类似于提供公钥),较大的树很快就会超过最大事务大小限制。

      进入CanopyCanopy可以在链上存储一定数量的验证节点(对于任何给定的验证路径)。这样可以在每个更新交易中包含较少的验证节点,从而保持整体交易大小低于限制。

      例如,深度为 14 的树需要 14 个总的验证节点。而有 10Canopy的情况下,每个更新事务只需要提交 4 个验证节点。

      Canopy深度值越大,成本越高

      canopyDepth 值也是创建树时成本的主要因素,因为您将在树的创建时支付这个成本。canopyDepth越高,链上存储的数据证明节点越多,成本也越高。

      较小的Canopy限制了可组合性

      虽然树的创建成本随着Canopy的高度而增加,但较低的Canopy将需要在每个更新事务中包含更多的证明节点。所需提交的节点越多,事务的大小就越大,因此超过事务大小限制就越容易。

      这也适用于任何其他试图与您的树/叶子进行交互的Solana程序或dApp。如果您的树需要太多的证明节点(因为Canopy深度较低),那么任何其他链上程序可能提供的额外操作都将受到其特定指令大小加上您的证明节点列表大小的限制。这限制了可组合性,并限制了您的特定树的潜在附加效用。

      例如,如果您的树被用于压缩的非同质化代币(NFTs),并且Canopy深度非常低,一个NFT市场可能只能支持简单的NFT转移,而无法支持链上竞标系统。

      创建一棵树的成本

      创建并发 Merkle 树的成本基于树的大小参数: maxDepthmaxBufferSizecanopyDepth 。这些值都用于计算在链上存在树所需的链上存储空间(以字节为单位)。

      一旦计算出所需的空间(以字节为单位),并使用 getMinimumBalanceForRentExemption RPC方法,请求在链上分配这些字节所需的费用(以lamports为单位)。

      在JavaScript中计算树木成本

      @solana/spl-account-compression 包中,开发人员可以使用 getConcurrentMerkleTreeAccountSize 函数来计算给定树大小参数所需的空间。

      然后使用 getMinimumBalanceForRentExemption 函数来获取在链上分配所需空间的最终成本(以lamports计算)。

      然后确定以lamports计算的成本,使得这个大小的账户免除租金,与其他账户创建类似。

      // calculate the space required for the tree
      const requiredSpace = getConcurrentMerkleTreeAccountSize(
      maxDepth,
      maxBufferSize,
      canopyDepth,
      );

      // get the cost (in lamports) to store the tree on-chain
      const storageCost = await connection.getMinimumBalanceForRentExemption(
      requiredSpace,
      );

      示例费用

      以下是几个不同树大小的示例成本,包括每个树可能的叶节点数量:

      例子 #1:16,384个节点,成本为0.222 SOL

      • 最大深度为 14 ,最大缓冲区大小为 64
      • 叶节点的最大数量: 16,384
      • 创建 0.222 SOLCanopy深度大约需要 0 的成本

      例子 #2:16,384个节点,成本为1.134 SOL

      • 最大深度为 14 ,最大缓冲区大小为 64
      • 叶节点的最大数量: 16,384
      • 创建 1.134 SOLCanopy深度大约需要 11 的成本

      示例 #3:1,048,576个节点,成本为1.673 SOL

      • 最大深度为 20 ,最大缓冲区大小为 256
      • 叶节点的最大数量: 1,048,576
      • 创建 1.673 SOLCanopy深度大约需要 10 的成本

      示例#4:1,048,576个节点,成本为15.814 SOL

      • 最大深度为 20 ,最大缓冲区大小为 256
      • 叶节点的最大数量: 1,048,576
      • 创建 15.814 SOLCanopy深度大约需要 15 的成本

      压缩的NFTs

      压缩的NFT是Solana上状态压缩的最受欢迎的应用之一。通过压缩,一个拥有一百万个NFT的收藏品可以以 ~50 SOL 的价格铸造,而不是其未压缩的等价收藏品。

      开发者指南:

      阅读我们的开发者指南,了解如何铸造和转移压缩的NFT

      · 3 min read
      Davirain

      欢迎来到Solana共学,这是一个精心设计的教程系列,供任何对Solana感兴趣的人深入学习。无论你是初学者还是有经验的开发者,这些模块都会引导你了解Solana区块链开发的基本内容。

      模块1:Solana基础

      • 区块链基本概念介绍
      • 本地程序开发环境配置
        • 原始Solana合约实现《hello, World》
        • Anchor合约框架实现《hello, World》
        • 使用Solang编译器编译solidity合约实现《hello, World》
      • BackPack钱包使用
      • 客户端开发
      • 钱包和前端
      • 自定义指令
      • 开始你自己的定制项目

      模块2:Solana高级主题

      • SPL token
      • NFTs + 使用Metaplex进行铸造
      • 在用户界面中展示NFTs
      • 创造神奇的网络货币并出售JPEG图片

      更深入的模块:深入了解Solana

      • 模块3:Rust入门,原生Solana开发,安全性,NFT质押
      • 模块4:本地环境,跨程序调用,测试,质押应用开发
      • 模块5:Anchor入门,全栈Anchor应用开发
      • 模块6:发布周,随机性,完善

      特别主题:超越基础

      • Solana程序中的环境变量
      • Solana支付,版本化事务,Rust宏
      • Solana程序安全:签名授权,所有者检查,重新初始化攻击,PDA共享等
      • 使用Solidity编写Solana合约
      • 发行Token2020,压缩NFT
      • 在Solana中使用The Graph,Oracles Pyth SDK
      • TipLink使用,如何在Quicknode和Helius申请RPC endpoint
      • 等等...

      和我们一起,在这全面的指南中探索Solana的每一个方面。从最基本的内容到安全和合约开发的复杂方面,Solana共学为每一位Solana爱好者提供了内容。

      敬请期待,如果有任何问题或需要进一步的协助,请随时与我们联系。欢迎来到Solana共学!

      - + \ No newline at end of file diff --git a/blog/tags/state-compression/index.html b/blog/tags/state-compression/index.html index 613164c4d..7335dcad4 100644 --- a/blog/tags/state-compression/index.html +++ b/blog/tags/state-compression/index.html @@ -5,13 +5,13 @@ One post tagged with "state-compression" | All in One Solana - +

      One post tagged with "state-compression"

      View All Tags

      · 17 min read
      Davirain

      Solana上,状态压缩是一种创建离链数据的“指纹”(或哈希)并将该指纹存储在链上以进行安全验证的方法。有效地利用Solana账本的安全性来安全验证离链数据,以确保其未被篡改。

      这种“压缩”方法使得Solana的程序和dApps能够使用廉价的区块链账本空间来安全存储数据,而不是更昂贵的账户空间。

      这是通过使用一种特殊的二叉树结构,称为并发默克尔树,对每个数据片段(称为 leaf )创建哈希,将它们哈希在一起,并仅将最终哈希存储在链上来实现的。

      什么是状态压缩?

      简单来说,状态压缩使用“树”结构将链外数据以确定性的方式进行加密哈希,计算出一个最终的哈希值,并将其存储在链上。

      这些树是通过这个“确定性”过程创建的:

      • 获取任何数据
      • 创建这些数据的哈希值
      • 将此哈希值存储为树底部的 leaf
      • 每个 leaf 对都会被一起哈希,创建一个 branch
      • 每个 branch 然后一起哈希
      • 不断攀爬树木并将相邻的树枝连接在一起
      • 树顶上一旦到达,就会产生最后的 root hash

      这个 root hash 然后存储在链上,作为每个叶子节点中所有数据的可验证证据。这样任何人都可以通过加密验证树中所有离链数据,而实际上只需在链上存储少量数据。因此,由于这种"状态压缩",大大降低了存储/证明大量数据的成本。

      默克尔树和并发默克尔树

      Solana的状态压缩使用了一种特殊类型的默克尔树,允许对任何给定的树进行多次更改,同时仍然保持树的完整性和有效性。

      这棵特殊的树被称为“并发默克尔树”,有效地在链上保留了树的“更改日志”。允许在一个证明失效之前对同一棵树进行多次快速更改(即在同一个区块中)。

      默克尔树是什么?

      默克尔树,有时也被称为“哈希树”,是一种基于哈希的二叉树结构,其中每个leaf节点都被表示为其内部数据的加密哈希。而每个非叶节点,也被称为“branch节点”,则被表示为其子叶节点哈希的哈希值。

      每个分支也被哈希在一起,沿着树向上爬,直到最后只剩下一个哈希。这个最终的哈希,称为 root hash 或者"根",可以与一个"证明路径"结合使用,来验证存储在叶节点中的任何数据。

      一旦计算出最终的根哈希值(root hash),可以通过重新计算特定叶子(leaf)节点的数据和每个相邻分支的哈希标签(称为“证明路径”)来验证存储在节点中的任何数据。将这个“重新哈希”与根哈希值进行比较,可以验证底层叶子数据的准确性。如果它们匹配,数据就被验证为准确的。如果它们不匹配,叶子数据已被更改。

      只要需要,原始叶子数据可以通过对新的叶子数据进行哈希运算并重新计算根哈希值来进行更改,方法与原始根哈希值的计算方式相同。然后,这个新的根哈希值用于验证任何数据,并且有效地使之前的根哈希值和证明无效。因此,对这些传统的默克尔树的每一次更改都需要按顺序执行。

      info

      当使用默克尔树时,更改叶子数据并计算新的根哈希的过程可能是非常常见的事情!虽然这是树的设计要点之一,但它可能导致最显著的缺点之一:快速变化。

      什么是并发默克尔树?

      在高吞吐量的应用中,比如在Solana运行时中,对于链上传统Merkle树的更改请求可能会相对快速地连续接收到验证者(例如在同一个槽中)。每个叶子数据的更改仍然需要按顺序执行。这导致每个后续的更改请求都会失败,因为根哈希和证明已经被同一槽中之前的更改请求无效化了。

      进入,并发默克尔树。

      并发默克尔树存储了最近更改的安全日志、它们的根哈希以及用于推导根哈希的证明。这个日志缓冲区存储在链上的每个树对应的特定账户中,最大记录数为(也称为 maxBufferSize )。

      当同一时隙内的验证者收到多个叶子数据变更请求时,链上并发 Merkle 树可以将这个“变更日志缓冲区”作为更可接受的证明的真实来源。有效地允许在同一时隙内对同一棵树进行多达 maxBufferSize 次变更。大幅提升吞吐量。

      并发默克尔树的大小调整

      创建这种链上树时,有三个值将决定您的树的大小、创建树的成本以及对树的并发更改数量:

      1. max depth 最大深度
      2. max buffer size 最大缓冲区大小
      3. canopy depth

      max depth

      树的“最大深度”是从任何数据 leaf 到树的 root 所需的最大跳数。

      由于默克尔树是二叉树,每个叶子节点只与另一个叶子节点相连;存在于一个 leaf pair 中。

      因此,树的 maxDepth 被用来确定可以通过简单的计算存储在树中的最大节点数(也称为数据或 leafs

      nodes_count = 2 ^ maxDepth

      由于树的深度必须在创建树时设置,您必须决定您希望树存储多少个数据。然后使用上述简单的计算,您可以确定存储数据的最低 maxDepth

      示例1:铸造100个NFTs

      如果你想创建一个用于存储100个压缩NFT的树,我们至少需要"100个叶子"或"100个节点"。

      // maxDepth=6 -> 64 nodes
      2^6 = 64

      // maxDepth=7 -> 128 nodes
      2^7 = 128

      因此,我们需要一个最大深度为 7 的树,以存储 100 个数据。

      例子2:铸造15000个NFTs

      如果你想创建一个用于存储15000个压缩NFT的树,我们将需要至少"15000个叶子"或"15000个节点"。

      // maxDepth=13 -> 8192 nodes
      2^13 = 8192

      // maxDepth=14 -> 16384 nodes
      2^14 = 16384

      因此,我们需要一个最大深度为 14 的树,以存储 15000 个数据。

      最大深度越高,成本越高

      创建树时, maxDepth 值将是成本的主要驱动因素之一,因为您将在创建树时支付这笔成本。最大树深度越高,您可以存储的数据指纹(也称为哈希)越多,成本就越高。

      max buffer size

      max buffer size” 实际上是树上可以发生的最大变化数量,同时仍然有效的 root hash

      由于根哈希有效地是所有叶子数据的单一哈希,改变任何一个叶子将使得所有后续尝试改变常规树的叶子所需的证明无效。

      但是使用并发树,对于这些证明来说,实际上有一个更新的日志。这个日志缓冲区的大小和设置是通过这个 maxBufferSize 值在树创建时完成的。

      Canopy depth

      Canopy depth”,有时也称为Canopy大小,是指在任何给定的证明路径上缓存/存储在链上的证明节点数量。

      在对 leaf 执行更新操作时,例如转让所有权(例如出售压缩的NFT),必须使用完整的证明路径来验证叶子节点的原始所有权,从而允许进行更新操作。此验证是使用完整的证明路径来正确计算当前的 root hash (或通过链上的“并发缓冲区”缓存的任何 root hash )来执行的。

      树的最大深度越大,执行此验证所需的证明节点就越多。例如,如果您的最大深度是 14 ,则需要使用 14 个总的证明节点进行验证。随着树的增大,完整的证明路径也会变得更长。

      通常情况下,每个这些证明节点都需要在每个树更新事务中包含。由于每个证明节点的值在事务中占用 32 bytes (类似于提供公钥),较大的树很快就会超过最大事务大小限制。

      进入CanopyCanopy可以在链上存储一定数量的验证节点(对于任何给定的验证路径)。这样可以在每个更新交易中包含较少的验证节点,从而保持整体交易大小低于限制。

      例如,深度为 14 的树需要 14 个总的验证节点。而有 10Canopy的情况下,每个更新事务只需要提交 4 个验证节点。

      Canopy深度值越大,成本越高

      canopyDepth 值也是创建树时成本的主要因素,因为您将在树的创建时支付这个成本。canopyDepth越高,链上存储的数据证明节点越多,成本也越高。

      较小的Canopy限制了可组合性

      虽然树的创建成本随着Canopy的高度而增加,但较低的Canopy将需要在每个更新事务中包含更多的证明节点。所需提交的节点越多,事务的大小就越大,因此超过事务大小限制就越容易。

      这也适用于任何其他试图与您的树/叶子进行交互的Solana程序或dApp。如果您的树需要太多的证明节点(因为Canopy深度较低),那么任何其他链上程序可能提供的额外操作都将受到其特定指令大小加上您的证明节点列表大小的限制。这限制了可组合性,并限制了您的特定树的潜在附加效用。

      例如,如果您的树被用于压缩的非同质化代币(NFTs),并且Canopy深度非常低,一个NFT市场可能只能支持简单的NFT转移,而无法支持链上竞标系统。

      创建一棵树的成本

      创建并发 Merkle 树的成本基于树的大小参数: maxDepthmaxBufferSizecanopyDepth 。这些值都用于计算在链上存在树所需的链上存储空间(以字节为单位)。

      一旦计算出所需的空间(以字节为单位),并使用 getMinimumBalanceForRentExemption RPC方法,请求在链上分配这些字节所需的费用(以lamports为单位)。

      在JavaScript中计算树木成本

      @solana/spl-account-compression 包中,开发人员可以使用 getConcurrentMerkleTreeAccountSize 函数来计算给定树大小参数所需的空间。

      然后使用 getMinimumBalanceForRentExemption 函数来获取在链上分配所需空间的最终成本(以lamports计算)。

      然后确定以lamports计算的成本,使得这个大小的账户免除租金,与其他账户创建类似。

      // calculate the space required for the tree
      const requiredSpace = getConcurrentMerkleTreeAccountSize(
      maxDepth,
      maxBufferSize,
      canopyDepth,
      );

      // get the cost (in lamports) to store the tree on-chain
      const storageCost = await connection.getMinimumBalanceForRentExemption(
      requiredSpace,
      );

      示例费用

      以下是几个不同树大小的示例成本,包括每个树可能的叶节点数量:

      例子 #1:16,384个节点,成本为0.222 SOL

      • 最大深度为 14 ,最大缓冲区大小为 64
      • 叶节点的最大数量: 16,384
      • 创建 0.222 SOLCanopy深度大约需要 0 的成本

      例子 #2:16,384个节点,成本为1.134 SOL

      • 最大深度为 14 ,最大缓冲区大小为 64
      • 叶节点的最大数量: 16,384
      • 创建 1.134 SOLCanopy深度大约需要 11 的成本

      示例 #3:1,048,576个节点,成本为1.673 SOL

      • 最大深度为 20 ,最大缓冲区大小为 256
      • 叶节点的最大数量: 1,048,576
      • 创建 1.673 SOLCanopy深度大约需要 10 的成本

      示例#4:1,048,576个节点,成本为15.814 SOL

      • 最大深度为 20 ,最大缓冲区大小为 256
      • 叶节点的最大数量: 1,048,576
      • 创建 15.814 SOLCanopy深度大约需要 15 的成本

      压缩的NFTs

      压缩的NFT是Solana上状态压缩的最受欢迎的应用之一。通过压缩,一个拥有一百万个NFT的收藏品可以以 ~50 SOL 的价格铸造,而不是其未压缩的等价收藏品。

      开发者指南:

      阅读我们的开发者指南,了解如何铸造和转移压缩的NFT

      - + \ No newline at end of file diff --git a/cookbook-zh/core-concepts/accounts/index.html b/cookbook-zh/core-concepts/accounts/index.html index 96e0d17d2..40dca3ae8 100644 --- a/cookbook-zh/core-concepts/accounts/index.html +++ b/cookbook-zh/core-concepts/accounts/index.html @@ -5,7 +5,7 @@ 账户 | All in One Solana - + @@ -13,8 +13,8 @@

      账户

      在Solana中,账户是用来存储状态的。账户是Solana开发中非常重要的构成要素。

      info

      tip 要点

      • 账户是用来存放数据的
      • 每个账户都有一个独一无二的地址
      • 每个账户大小不能超过10MB
      • 程序派生账户(PDA accounts)大小不能超过10KB
      • 程序派生账户(PDA accounts)可以用其对应程序进行签名
      • 账户大小在创建时固定,但可以使用realloc进行调整
      • 账户数据存储需要付租金
      • 默认的账户所有者是"系统程序"

      深入

      账户模型

      在Solana中有三类账户:

      • 数据账户,用来存储数据
      • 程序账户,用来存储可执行程序
      • 原生账户,指Solana上的原生程序,例如"System","Stake",以及"Vote"。

      数据账户又分为两类:

      • 系统所有账户
      • 程序派生账户(PDA)

      每个数据账户都有一个地址(一般情况下是一个公钥)以及一个所有者(程序账户的地址)。 下面详细列出一个账户存储的完整字段列表。

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

      关于所有权,有几条重要的规则:

      • 只有账户的所有者才能改变账户中的数据,提取lamport
      • 任何人都可以向数据账户中存入lamport
      • 当账户中的数据被抹除之后,账户的所有者可以指定新的所有者

      程序账户不储存状态。

      例如,假设有一个计数程序,这个程序用来为一个计数器加数,你需要创建两个账户,一个用于存储程序的代码, 另一个用于存储计数器本身。

      为了避免账户被删除,必须付租金。

      租金

      在账户中存储数据需要花费SOL来维持,这部分花费的SOL被称作租金。如果你在一个账户中存入大于两年租金的SOL, -这个账户就可以被豁免付租。租金可以通过关闭账户的方式来取回。lamport会被返还回你的钱包。

      租金在这两个不同的时间点被支取:

      1. 被一个交易引用的时候
      2. epoch更迭时

      收取的租金,一定百分比会被销毁,另一部分会在每个slot(插槽)结束时被分配给投票账户。

      当一个账户没有足够的余额支付租金时,这个账户会被释放,数据会被清除。

      其他资料

      致谢

      这些核心概念来源于Pencilflip. 在Twitter上关注他.

      - +这个账户就可以被豁免付租。租金可以通过关闭账户的方式来取回。lamport会被返还回你的钱包。

      租金在这两个不同的时间点被支取:

      1. 被一个交易引用的时候
      2. epoch更迭时

      收取的租金,一定百分比会被销毁,另一部分会在每个slot(插槽)结束时被分配给投票账户。

      当一个账户没有足够的余额支付租金时,这个账户会被释放,数据会被清除。

      其他资料

      致谢

      这些核心概念来源于Pencilflip. 在Twitter上关注他.

      + \ No newline at end of file diff --git a/cookbook-zh/core-concepts/cpi/index.html b/cookbook-zh/core-concepts/cpi/index.html index bb0adb034..7ed930d70 100644 --- a/cookbook-zh/core-concepts/cpi/index.html +++ b/cookbook-zh/core-concepts/cpi/index.html @@ -5,13 +5,13 @@ Cross Program Invocations (CPIs) | All in One Solana - +
      -

      Cross Program Invocations (CPIs)

      A Cross-Program Invocation (CPI) is a direct call from one program into another, allowing for the composability of Solana programs. Just as any client can call any program using the JSON RPC, any program can call any other program via a CPI. CPIs essentially turn the entire Solana ecosystem into one giant API that is at your disposal as a developer.

      The purpose of this section is to provide a high-level overview CPIs. Please refer to the linked resources below for more detailed explanations, examples, and walkthroughs.

      info

      tip Fact Sheet

      • A Cross-Program Invocation (CPI) is a call from one program to another, targeting a specific instruction on the program being called
      • CPIs allow the calling program to extend its signer privileges to the callee program
      • Programs can execute CPIs using either invoke or invoke_signed within their instructions
      • invoke is used when all required signatures are accessible prior to invocation, without the need for PDAs to act as signers
      • invoke_signed is used when PDAs from the calling program are required as signers in the CPI
      • After a CPI is made to another program, the callee program can make further CPIs to other programs, up to a maximum depth of 4

      Deep Dive

      Cross Program Invocations (CPIs) enable the composability of Solana programs, which allow developers to utilize and build on the instruction of existing programs.

      To execute CPIs, use the invoke or invoke_signed function found in the solana_program crate.

      // Used when there are not signatures for PDAs needed
      pub fn invoke(
      instruction: &Instruction,
      account_infos: &[AccountInfo<'_>]
      ) -> ProgramResult

      // Used when a program must provide a 'signature' for a PDA, hence the signer_seeds parameter
      pub fn invoke_signed(
      instruction: &Instruction,
      account_infos: &[AccountInfo<'_>],
      signers_seeds: &[&[&[u8]]]
      ) -> ProgramResult

      To make a CPI, you must specify and construct an instruction on the program being invoked and supply a list of accounts necessary for that instruction. If a PDA is required as a signer, the signers_seeds must also be provided when using invoke_signed.

      CPI with invoke

      The invoke function is used when making a CPI that does not require any PDAs to act as signers. When making CPIs, the Solana runtime extends the original signature passed into a program to the callee program.

      invoke(
      &some_instruction, // instruction to invoke
      &[account_one.clone(), account_two.clone()], // accounts required by instruction
      )?;

      CPI with invoke_signed

      To make a CPI that requires a PDA as a signer, use the invoke_signed function and provide the necessary seeds to derive the required PDA of the calling program.

      invoke_signed(
      &some_instruction, // instruction to invoke
      &[account_one.clone(), pda.clone()], // accounts required by instruction, where one is a pda required as signer
      &[signers_seeds], // seeds to derive pda
      )?;

      While PDAs have no private keys of their own, they can still act as a signer in an instruction via a CPI. To verify that a PDA belongs to the calling program, the seeds used to generate the PDA required as a signer must be included in as signers_seeds.

      The Solana runtime will internally call create_program_address using the seeds provided and the program_id of the calling program. The resulting PDA is then compared to the addresses supplied in the instruction. If there's a match, the PDA is considered a valid signer.

      CPI Instruction

      Depending on the program you're making the call to, there may be a crate available with helper functions for creating the Instruction. Many individuals and organizations create publicly available crates alongside their programs that expose these sorts of functions to simplify calling their programs.

      The definition of the Instruction type required for a CPI includes:

      • program_id - the public key of the program that executes the instruction
      • accounts - a list of all accounts that may be read or written to during the execution of the instruction
      • data - the instruction data required by the instruction
      pub struct Instruction {
      pub program_id: Pubkey,
      pub accounts: Vec<AccountMeta>,
      pub data: Vec<u8>,
      }

      The AccountMeta struct has the following definition:

      pub struct AccountMeta {
      pub pubkey: Pubkey,
      pub is_signer: bool,
      pub is_writable: bool,
      }

      When creating a CPI, use the following syntax to specify the AccountMeta for each account:

      • AccountMeta::new - indicates writable
      • AccountMeta::new_readonly - indicates not writable
      • (pubkey, true) - indicates account is signer
      • (pubkey, false) - indicates account is not signer

      Here is an example:

      use solana_program::instruction::AccountMeta;

      let account_metas = vec![
      AccountMeta::new(account1_pubkey, true),
      AccountMeta::new(account2_pubkey, false),
      AccountMeta::new_readonly(account3_pubkey, false),
      AccountMeta::new_readonly(account4_pubkey, true),
      ]

      CPI AccountInfo

      To use invoke and invoke_signed, a list of account_infos is also required. Similar to the list of AccountMeta in the instruction, you need to include all the AccountInfo of each account that the program you're calling will read from or write to.

      For reference, the AccountInfo struct has the following definition:

      /// Account information
      #[derive(Clone)]
      pub struct AccountInfo<'a> {
      /// Public key of the account
      pub key: &'a Pubkey,
      /// Was the transaction signed by this account's public key?
      pub is_signer: bool,
      /// Is the account writable?
      pub is_writable: bool,
      /// The lamports in the account. Modifiable by programs.
      pub lamports: Rc<RefCell<&'a mut u64>>,
      /// The data held in this account. Modifiable by programs.
      pub data: Rc<RefCell<&'a mut [u8]>>,
      /// Program that owns this account
      pub owner: &'a Pubkey,
      /// This account's data contains a loaded program (and is now read-only)
      pub executable: bool,
      /// The epoch at which this account will next owe rent
      pub rent_epoch: Epoch,
      }

      You can create a copy of the AccountInfo for each required account using the Clone trait, which is implemented for the AccountInfo struct in the solana_program crate.

      let accounts_infos = [
      account_one.clone(),
      account_two.clone(),
      account_three.clone(),
      ];

      While this section has provided a high-level overview of CPIs, more detailed explanations, examples, and walkthroughs can be found in the linked resources below.

      Other Resources

      - +

      Cross Program Invocations (CPIs)

      A Cross-Program Invocation (CPI) is a direct call from one program into another, allowing for the composability of Solana programs. Just as any client can call any program using the JSON RPC, any program can call any other program via a CPI. CPIs essentially turn the entire Solana ecosystem into one giant API that is at your disposal as a developer.

      The purpose of this section is to provide a high-level overview CPIs. Please refer to the linked resources below for more detailed explanations, examples, and walkthroughs.

      info

      tip Fact Sheet

      • A Cross-Program Invocation (CPI) is a call from one program to another, targeting a specific instruction on the program being called
      • CPIs allow the calling program to extend its signer privileges to the callee program
      • Programs can execute CPIs using either invoke or invoke_signed within their instructions
      • invoke is used when all required signatures are accessible prior to invocation, without the need for PDAs to act as signers
      • invoke_signed is used when PDAs from the calling program are required as signers in the CPI
      • After a CPI is made to another program, the callee program can make further CPIs to other programs, up to a maximum depth of 4

      Deep Dive

      Cross Program Invocations (CPIs) enable the composability of Solana programs, which allow developers to utilize and build on the instruction of existing programs.

      To execute CPIs, use the invoke or invoke_signed function found in the solana_program crate.

      // Used when there are not signatures for PDAs needed
      pub fn invoke(
      instruction: &Instruction,
      account_infos: &[AccountInfo<'_>]
      ) -> ProgramResult

      // Used when a program must provide a 'signature' for a PDA, hence the signer_seeds parameter
      pub fn invoke_signed(
      instruction: &Instruction,
      account_infos: &[AccountInfo<'_>],
      signers_seeds: &[&[&[u8]]]
      ) -> ProgramResult

      To make a CPI, you must specify and construct an instruction on the program being invoked and supply a list of accounts necessary for that instruction. If a PDA is required as a signer, the signers_seeds must also be provided when using invoke_signed.

      CPI with invoke

      The invoke function is used when making a CPI that does not require any PDAs to act as signers. When making CPIs, the Solana runtime extends the original signature passed into a program to the callee program.

      invoke(
      &some_instruction, // instruction to invoke
      &[account_one.clone(), account_two.clone()], // accounts required by instruction
      )?;

      CPI with invoke_signed

      To make a CPI that requires a PDA as a signer, use the invoke_signed function and provide the necessary seeds to derive the required PDA of the calling program.

      invoke_signed(
      &some_instruction, // instruction to invoke
      &[account_one.clone(), pda.clone()], // accounts required by instruction, where one is a pda required as signer
      &[signers_seeds], // seeds to derive pda
      )?;

      While PDAs have no private keys of their own, they can still act as a signer in an instruction via a CPI. To verify that a PDA belongs to the calling program, the seeds used to generate the PDA required as a signer must be included in as signers_seeds.

      The Solana runtime will internally call create_program_address using the seeds provided and the program_id of the calling program. The resulting PDA is then compared to the addresses supplied in the instruction. If there's a match, the PDA is considered a valid signer.

      CPI Instruction

      Depending on the program you're making the call to, there may be a crate available with helper functions for creating the Instruction. Many individuals and organizations create publicly available crates alongside their programs that expose these sorts of functions to simplify calling their programs.

      The definition of the Instruction type required for a CPI includes:

      • program_id - the public key of the program that executes the instruction
      • accounts - a list of all accounts that may be read or written to during the execution of the instruction
      • data - the instruction data required by the instruction
      pub struct Instruction {
      pub program_id: Pubkey,
      pub accounts: Vec<AccountMeta>,
      pub data: Vec<u8>,
      }

      The AccountMeta struct has the following definition:

      pub struct AccountMeta {
      pub pubkey: Pubkey,
      pub is_signer: bool,
      pub is_writable: bool,
      }

      When creating a CPI, use the following syntax to specify the AccountMeta for each account:

      • AccountMeta::new - indicates writable
      • AccountMeta::new_readonly - indicates not writable
      • (pubkey, true) - indicates account is signer
      • (pubkey, false) - indicates account is not signer

      Here is an example:

      use solana_program::instruction::AccountMeta;

      let account_metas = vec![
      AccountMeta::new(account1_pubkey, true),
      AccountMeta::new(account2_pubkey, false),
      AccountMeta::new_readonly(account3_pubkey, false),
      AccountMeta::new_readonly(account4_pubkey, true),
      ]

      CPI AccountInfo

      To use invoke and invoke_signed, a list of account_infos is also required. Similar to the list of AccountMeta in the instruction, you need to include all the AccountInfo of each account that the program you're calling will read from or write to.

      For reference, the AccountInfo struct has the following definition:

      /// Account information
      #[derive(Clone)]
      pub struct AccountInfo<'a> {
      /// Public key of the account
      pub key: &'a Pubkey,
      /// Was the transaction signed by this account's public key?
      pub is_signer: bool,
      /// Is the account writable?
      pub is_writable: bool,
      /// The lamports in the account. Modifiable by programs.
      pub lamports: Rc<RefCell<&'a mut u64>>,
      /// The data held in this account. Modifiable by programs.
      pub data: Rc<RefCell<&'a mut [u8]>>,
      /// Program that owns this account
      pub owner: &'a Pubkey,
      /// This account's data contains a loaded program (and is now read-only)
      pub executable: bool,
      /// The epoch at which this account will next owe rent
      pub rent_epoch: Epoch,
      }

      You can create a copy of the AccountInfo for each required account using the Clone trait, which is implemented for the AccountInfo struct in the solana_program crate.

      let accounts_infos = [
      account_one.clone(),
      account_two.clone(),
      account_three.clone(),
      ];

      While this section has provided a high-level overview of CPIs, more detailed explanations, examples, and walkthroughs can be found in the linked resources below.

      Other Resources

      + \ No newline at end of file diff --git a/cookbook-zh/core-concepts/index.html b/cookbook-zh/core-concepts/index.html index 21d7402db..2ed2375ac 100644 --- a/cookbook-zh/core-concepts/index.html +++ b/cookbook-zh/core-concepts/index.html @@ -5,13 +5,13 @@ 核心概念 | All in One Solana - + - + + \ No newline at end of file diff --git a/cookbook-zh/core-concepts/pdas/index.html b/cookbook-zh/core-concepts/pdas/index.html index f1d618d60..031988223 100644 --- a/cookbook-zh/core-concepts/pdas/index.html +++ b/cookbook-zh/core-concepts/pdas/index.html @@ -5,7 +5,7 @@ 程序派生账户(PDA) | All in One Solana - + @@ -19,8 +19,8 @@ 这个看起来简陋的办法可以让我们每次生成PDA的时候都能够得到唯一确定的结果。

      落在椭圆曲线上的PDA

      与PDA交互

      生成PDA的时候,findProgramAddress会把得到的地址和用来将PDA碰撞出椭圆曲线所用的bump都返回出来。 有了这个bump,程序就可以对任何需要这个PDA地址的指令进行签名。签名时,程序调用invoke_signed函数,传入指令,账户列表,以及用于生成PDA的种子和bump。 除了为指令签名之外,PDA在他自己通过invoke_signed函数被创建时,也需要签名。

      在使用PDA编写程序时,经常会将这个bump存储在这个账户本身的数据当中。 -这种机制可以让开发者轻易的对PDA进行验证,而不用重新在指令参数当中传入这个值。

      Other Resources

      - +这种机制可以让开发者轻易的对PDA进行验证,而不用重新在指令参数当中传入这个值。

      Other Resources

      + \ No newline at end of file diff --git a/cookbook-zh/core-concepts/programs/index.html b/cookbook-zh/core-concepts/programs/index.html index 88962f005..aef065f2d 100644 --- a/cookbook-zh/core-concepts/programs/index.html +++ b/cookbook-zh/core-concepts/programs/index.html @@ -5,7 +5,7 @@ 程序 | All in One Solana - + @@ -27,8 +27,8 @@ Solana支持以下的几个环境:

      集群环境RPC连接URL
      Mainnet-betahttps://api.mainnet-beta.solana.com
      Testnethttps://api.testnet.solana.com
      Devnethttps://api.devnet.solana.com
      Localhost默认端口:8899(例如,http://localhost:8899,http://192.168.1.88:8899)

      部署到一个环境之后,客户端就可以通过对应集群的RPC连接与链上程序进行交互。

      部署程序

      开发者可以使用命令行部署程序:

      solana program deploy <PROGRAM_FILEPATH>

      部署程序的时候,程序会被编译为包含BPF字节码的ELF共享对象,并上传到Solana集群上。 和Solana上其他的任何东西一样,程序储存在账户当中。唯一的特殊之处是,这些账户标记为executable(可执行),并且其所有者是"BPF Loader(BPF加载器)"。 这个账户的地址被称为program_id,在后面的一切交易当中,用于指代这个程序。

      Solana支持多种BPF加载器,最新的是Upgradable BPF Loader。 -BPF加载器负责管理程序账户,让客户端可以通过其program_id对程序进行访问。每个程序都只有一个入口点,这里对指令进行处理。这里的参数须包括:

      • program_id: pubkey(公钥)
      • accounts: array(数组)
      • instruction_data: byte array(字节数组)

      当程序被调用时,会在Solana运行库中被执行。

      其他资料

      - +BPF加载器负责管理程序账户,让客户端可以通过其program_id对程序进行访问。每个程序都只有一个入口点,这里对指令进行处理。这里的参数须包括:

      • program_id: pubkey(公钥)
      • accounts: array(数组)
      • instruction_data: byte array(字节数组)

      当程序被调用时,会在Solana运行库中被执行。

      其他资料

      + \ No newline at end of file diff --git a/cookbook-zh/core-concepts/transactions/index.html b/cookbook-zh/core-concepts/transactions/index.html index 4d884dbdd..e18f3761d 100644 --- a/cookbook-zh/core-concepts/transactions/index.html +++ b/cookbook-zh/core-concepts/transactions/index.html @@ -5,7 +5,7 @@ 交易 | All in One Solana - + @@ -20,8 +20,8 @@ 块哈希被用于去重,以及移除过期交易。一个块哈希的最大寿命是150个区块,成文时这个时间大约是1分钟19秒。

      费用

      Solana网络收取两种费用:

      • 交易费,用于向网络广播消息(亦即gas费)
      • 租金,用于向区块链上存储数据

      在Solana中,交易费是确定的。并没有费率竞价的概念,用户无法通过增加交易费的方式增加自己的交易被打包进下一个区块的概率。 在成文时,交易费只与交易所需的签名数量相关(参见lamports_per_signature),与交易所使用的资源无关。 这是因为目前所有交易都有一个严格的1232字节的限制。

      每个交易都需要至少有一个writable(可写)的账户,用于为交易签名。这个账户无论交易成功与否都需要为交易成本付费。 -如果付费者没有足够为交易付费的余额,这个交易就会被丢弃。

      成文时,50%的交易费被出块的验证节点收取,剩下的50%被燃烧掉。这样的结构会激励验证节点在leader schedule(领导时间表)规定的属于自己的slot(插槽)中处理尽可能多的交易。

      Other Resources

      - +如果付费者没有足够为交易付费的余额,这个交易就会被丢弃。

      成文时,50%的交易费被出块的验证节点收取,剩下的50%被燃烧掉。这样的结构会激励验证节点在leader schedule(领导时间表)规定的属于自己的slot(插槽)中处理尽可能多的交易。

      Other Resources

      + \ No newline at end of file diff --git a/cookbook-zh/getting-started/contributing/index.html b/cookbook-zh/getting-started/contributing/index.html index 3629ba36c..0003e61d4 100644 --- a/cookbook-zh/getting-started/contributing/index.html +++ b/cookbook-zh/getting-started/contributing/index.html @@ -5,13 +5,13 @@ 贡献 | All in One Solana - +
      -

      贡献

      欢迎任何人对这本食谱进行贡献。在贡献新的代码片段时,请参考项目的风格。

      结构

      目前我们在 /docs 下有"cookbook-zh",所有的内容都在这个文件中。

      参考文献

      参考资料是一个总体主题,其中列出了关于如何在该主题下进行操作的参考资料。一般的结构如下:

      Code Reference Title

      Short Summary

      Code Snippet

      指南

      指南是关于各种主题的长篇信息文档。撰写指南的一般结构如下:

      Brief Summary/TLDR

      Fact Sheet

      Deep Dive

      Other Resources

      建筑

      我们使用 Docusaurus 来构建这个网站。请参考它的文档来了解如何在本地运行它。

      一般是这样的:

      npm install
      npm run build
      npm run start

      Committing

      我们在这个仓库中使用传统的提交方式。

      选择一个任务或者自己创建一个,按照以下步骤进行:

      1. 任务添加一个问题,并将其分配给自己或在问题上进行评论
      2. 制作一份涉及该问题的初稿公关文件。

      做出贡献的一般流程:

      1. 在GitHub上fork这个仓库
      2. 将项目克隆到您自己的机器上
      3. 提交更改到你自己的分支
      4. 将你的工作推回到你的分支
      5. 提交一个Pull请求,以便我们可以审查您的更改
      caution

      注意:在发起拉取请求之前,请确保将最新的更改合并到“上游”!

      您可以在项目看板上找到任务,或者创建一个问题并将其分配给自己。

      快乐烹饪!

      - +

      贡献

      欢迎任何人对这本食谱进行贡献。在贡献新的代码片段时,请参考项目的风格。

      结构

      目前我们在 /docs 下有"cookbook-zh",所有的内容都在这个文件中。

      参考文献

      参考资料是一个总体主题,其中列出了关于如何在该主题下进行操作的参考资料。一般的结构如下:

      Code Reference Title

      Short Summary

      Code Snippet

      指南

      指南是关于各种主题的长篇信息文档。撰写指南的一般结构如下:

      Brief Summary/TLDR

      Fact Sheet

      Deep Dive

      Other Resources

      建筑

      我们使用 Docusaurus 来构建这个网站。请参考它的文档来了解如何在本地运行它。

      一般是这样的:

      npm install
      npm run build
      npm run start

      Committing

      我们在这个仓库中使用传统的提交方式。

      选择一个任务或者自己创建一个,按照以下步骤进行:

      1. 任务添加一个问题,并将其分配给自己或在问题上进行评论
      2. 制作一份涉及该问题的初稿公关文件。

      做出贡献的一般流程:

      1. 在GitHub上fork这个仓库
      2. 将项目克隆到您自己的机器上
      3. 提交更改到你自己的分支
      4. 将你的工作推回到你的分支
      5. 提交一个Pull请求,以便我们可以审查您的更改
      caution

      注意:在发起拉取请求之前,请确保将最新的更改合并到“上游”!

      您可以在项目看板上找到任务,或者创建一个问题并将其分配给自己。

      快乐烹饪!

      + \ No newline at end of file diff --git a/cookbook-zh/getting-started/index.html b/cookbook-zh/getting-started/index.html index 9900cb5df..0394a694a 100644 --- a/cookbook-zh/getting-started/index.html +++ b/cookbook-zh/getting-started/index.html @@ -5,13 +5,13 @@ 开始 | All in One Solana - + - + + \ No newline at end of file diff --git a/cookbook-zh/getting-started/installation/index.html b/cookbook-zh/getting-started/installation/index.html index c46b2d6e8..925bc78f1 100644 --- a/cookbook-zh/getting-started/installation/index.html +++ b/cookbook-zh/getting-started/installation/index.html @@ -5,7 +5,7 @@ 安装 | All in One Solana - + @@ -24,8 +24,8 @@ https://github.com/solana-labs/solana/releases/latest, 下载 solana-release-x86_64-pc-windows-msvc.tar.bz2并解压。

      打开命令提示符并切换目录至刚才解压的位置,运行以下命令:

      cd solana-release/
      set PATH=%cd%/bin;%PATH%

      从源码编译

      如果你不能使用预编译的二进制文件,或者希望自己从源码进行编译,可以访问 https://github.com/solana-labs/solana/releases/latest, -下载Source Code压缩包。解压代码,用以下命令编译二进制文件:

      ./scripts/cargo-install-all.sh .
      export PATH=$PWD/bin:$PATH

      然后运行以下命令,可以和预编译二进制文件获得一样的结果:

      solana-install init
      - +下载Source Code压缩包。解压代码,用以下命令编译二进制文件:

      ./scripts/cargo-install-all.sh .
      export PATH=$PWD/bin:$PATH

      然后运行以下命令,可以和预编译二进制文件获得一样的结果:

      solana-install init
      + \ No newline at end of file diff --git a/cookbook-zh/guides/account-maps/index.html b/cookbook-zh/guides/account-maps/index.html index b01d5b158..867cb3431 100644 --- a/cookbook-zh/guides/account-maps/index.html +++ b/cookbook-zh/guides/account-maps/index.html @@ -5,13 +5,13 @@ 账户映射 | All in One Solana - +
      -

      账户映射

      在编程中,我们经常使用映射(Map)这种数据结构,将一个键与某种值关联起来。键和值可以是任意类型的数据,键用作标识要保存的特定值的标识符。通过键,我们可以高效地插入、检索和更新这些值。

      正如我们所了解的,Solana的账户模型要求程序数据和相关状态数据存储在不同的账户中。这些账户都有与之关联的地址,这本身就有映射的作用!在这里了解更多关于Solana账户模型的信息。

      因此,将值存储在单独的账户中,以其地址作为检索值所需的键是有意义的。但这也带来了一些问题,比如:

      *上述地址很可能不是理想的键,你可能难以记住并检索所需的值。

      *上述地址是不同Keypair的公钥,每个公钥(或地址)都有与之关联的私钥。如果需要,这个私钥将用于对不同的指令进行签名,这意味着我们需要在某个地方存储私钥,这绝对不是推荐的做法!

      这给许多Solana开发者带来了一个问题,即如何在他们的程序中实现类似Map的逻辑。让我们看看几种解决这个问题的方法。

      派生PDA

      PDA的全称是“程序派生地址” - Program Derived Address,简而言之,它们是从一组种子和程序ID(或地址)派生出来的地址。

      PDAs的独特之处在于,这些地址不与任何私钥相关联。这是因为这些地址不位于ED25519曲线上。因此,只有派生此地址的程序可以使用提供的密钥和种子对指令进行签名。在这里了解更多信息。

      现在我们对PDAs有了一个概念,让我们使用它们来映射一些账户!我们以一个博客程序作为示例,演示如何实现这一点。

      在这个博客程序中,我们希望每个User都拥有一个Blog。这个博客可以有任意数量的Posts。这意味着我们将每个用户映射到一个博客,每个帖子映射到某个博客。

      简而言之,用户和他/她的博客之间是1:1的映射,而博客和其帖子之间是1:N的映射。

      对于1:1的映射,我们希望一个博客的地址仅从其用户派生,这样我们可以通过其权限(或用户)来检索博客。因此,博客的种子将包括其权限的密钥,可能还有一个前缀博客,作为类型标识符。

      对于1:N的映射,我们希望每个帖子的地址不仅从它所关联的博客派生,还从另一个标识符派生,以区分博客中的多个帖子。在下面的示例中,每个帖子的地址是从博客的密钥、一个用于标识每个帖子的slug和一个前缀帖子派生出来的,作为类型标识符。

      代码如下所示:

      #[derive(Accounts)]
      #[instruction(blog_account_bump: u8)]
      pub struct InitializeBlog<'info> {
      #[account(
      init,
      seeds = [
      b"blog".as_ref(),
      authority.key().as_ref()
      ],
      bump = blog_account_bump,
      payer = authority,
      space = Blog::LEN
      )]
      pub blog_account: Account<'info, Blog>,

      #[account(mut)]
      pub authority: Signer<'info>,

      pub system_program: Program<'info, System>
      }

      #[derive(Accounts)]
      #[instruction(post_account_bump: u8, post: Post)]
      pub struct CreatePost<'info> {
      #[account(mut, has_one = authority)]
      pub blog_account: Account<'info, Blog>,

      #[account(
      init,
      seeds = [
      b"post".as_ref(),
      blog_account.key().as_ref(),
      post.slug.as_ref(),
      ],
      bump = post_account_bump,
      payer = authority,
      space = Post::LEN
      )]
      pub post_account: Account<'info, Post>,

      #[account(mut)]
      pub authority: Signer<'info>,

      pub system_program: Program<'info, System>
      }

      在客户端,你可以使用PublicKey.findProgramAddress()来获取所需的BlogPost账户地址,然后将其传递给connection.getAccountInfo()来获取账户数据。下面是一个示例:

      async () => {
      const connection = new Connection("http://localhost:8899", "confirmed");

      const [blogAccount] = await PublicKey.findProgramAddress(
      [Buffer.from("blog"), user.publicKey.toBuffer()],
      MY_PROGRAM_ID
      );

      const [postAccount] = await PublicKey.findProgramAddress(
      [Buffer.from("post"), Buffer.from("slug-1"), user.publicKey.toBuffer()],
      MY_PROGRAM_ID
      );

      const blogAccountInfo = await connection.getAccountInfo(blogAccount);
      const blogAccountState = BLOG_ACCOUNT_DATA_LAYOUT.decode(
      blogAccountInfo.data
      );
      console.log("Blog account state: ", blogAccountState);

      const postAccountInfo = await connection.getAccountInfo(postAccount);
      const postAccountState = POST_ACCOUNT_DATA_LAYOUT.decode(
      postAccountInfo.data
      );
      console.log("Post account state: ", postAccountState);
      };

      单个映射账户

      另一种实现映射的方法是在单个账户中显式存储一个BTreeMap数据结构。这个账户的地址本身可以是一个PDA,或者是生成的Keypair的公钥。

      这种账户映射的方法并不理想,原因如下:

      *首先,你需要初始化存储BTreeMap的账户,然后才能向其中插入必要的键值对。然后,你还需要将这个账户的地址存储在某个地方,以便每次更新时进行更新。

      *账户存在内存限制,每个账户的最大大小为10兆字节,这限制了BTreeMap存储大量键值对的能力。

      因此,在考虑你的用例后,可以按照以下方式实现这种方法:

      fn process_init_map(accounts: &[AccountInfo], program_id: &Pubkey) -> ProgramResult {
      let account_info_iter = &mut accounts.iter();

      let authority_account = next_account_info(account_info_iter)?;
      let map_account = next_account_info(account_info_iter)?;
      let system_program = next_account_info(account_info_iter)?;

      if !authority_account.is_signer {
      return Err(ProgramError::MissingRequiredSignature)
      }

      let (map_pda, map_bump) = Pubkey::find_program_address(
      &[b"map".as_ref()],
      program_id
      );

      if map_pda != *map_account.key || !map_account.is_writable || !map_account.data_is_empty() {
      return Err(BlogError::InvalidMapAccount.into())
      }

      let rent = Rent::get()?;
      let rent_lamports = rent.minimum_balance(MapAccount::LEN);

      let create_map_ix = &system_instruction::create_account(
      authority_account.key,
      map_account.key,
      rent_lamports,
      MapAccount::LEN.try_into().unwrap(),
      program_id
      );

      msg!("Creating MapAccount account");
      invoke_signed(
      create_map_ix,
      &[
      authority_account.clone(),
      map_account.clone(),
      system_program.clone()
      ],
      &[&[
      b"map".as_ref(),
      &[map_bump]
      ]]
      )?;

      msg!("Deserializing MapAccount account");
      let mut map_state = try_from_slice_unchecked::<MapAccount>(&map_account.data.borrow()).unwrap();
      let empty_map: BTreeMap<Pubkey, Pubkey> = BTreeMap::new();

      map_state.is_initialized = 1;
      map_state.map = empty_map;

      msg!("Serializing MapAccount account");
      map_state.serialize(&mut &mut map_account.data.borrow_mut()[..])?;

      Ok(())
      }

      fn process_insert_entry(accounts: &[AccountInfo], program_id: &Pubkey) -> ProgramResult {

      let account_info_iter = &mut accounts.iter();

      let a_account = next_account_info(account_info_iter)?;
      let b_account = next_account_info(account_info_iter)?;
      let map_account = next_account_info(account_info_iter)?;

      if !a_account.is_signer {
      return Err(ProgramError::MissingRequiredSignature)
      }

      if map_account.data.borrow()[0] == 0 || *map_account.owner != *program_id {
      return Err(BlogError::InvalidMapAccount.into())
      }

      msg!("Deserializing MapAccount account");
      let mut map_state = try_from_slice_unchecked::<MapAccount>(&map_account.data.borrow())?;

      if map_state.map.contains_key(a_account.key) {
      return Err(BlogError::AccountAlreadyHasEntry.into())
      }

      map_state.map.insert(*a_account.key, *b_account.key);

      msg!("Serializing MapAccount account");
      map_state.serialize(&mut &mut map_account.data.borrow_mut()[..])?;

      Ok(())
      }

      上述程序的客户端测试代码可能如下所示:

      const insertABIx = new TransactionInstruction({
      programId: MY_PROGRAM_ID,
      keys: [
      {
      pubkey: userA.publicKey,
      isSigner: true,
      isWritable: true,
      },
      {
      pubkey: userB.publicKey,
      isSigner: false,
      isWritable: false,
      },
      {
      pubkey: mapKey,
      isSigner: false,
      isWritable: true,
      },
      ],
      data: Buffer.from(Uint8Array.of(1)),
      });

      const insertBCIx = new TransactionInstruction({
      programId: MY_PROGRAM_ID,
      keys: [
      {
      pubkey: userB.publicKey,
      isSigner: true,
      isWritable: true,
      },
      {
      pubkey: userC.publicKey,
      isSigner: false,
      isWritable: false,
      },
      {
      pubkey: mapKey,
      isSigner: false,
      isWritable: true,
      },
      ],
      data: Buffer.from(Uint8Array.of(1)),
      });

      const insertCAIx = new TransactionInstruction({
      programId: MY_PROGRAM_ID,
      keys: [
      {
      pubkey: userC.publicKey,
      isSigner: true,
      isWritable: true,
      },
      {
      pubkey: userA.publicKey,
      isSigner: false,
      isWritable: false,
      },
      {
      pubkey: mapKey,
      isSigner: false,
      isWritable: true,
      },
      ],
      data: Buffer.from(Uint8Array.of(1)),
      });

      const tx = new Transaction();
      tx.add(initMapIx);
      tx.add(insertABIx);
      tx.add(insertBCIx);
      tx.add(insertCAIx);
      - +

      账户映射

      在编程中,我们经常使用映射(Map)这种数据结构,将一个键与某种值关联起来。键和值可以是任意类型的数据,键用作标识要保存的特定值的标识符。通过键,我们可以高效地插入、检索和更新这些值。

      正如我们所了解的,Solana的账户模型要求程序数据和相关状态数据存储在不同的账户中。这些账户都有与之关联的地址,这本身就有映射的作用!在这里了解更多关于Solana账户模型的信息。

      因此,将值存储在单独的账户中,以其地址作为检索值所需的键是有意义的。但这也带来了一些问题,比如:

      *上述地址很可能不是理想的键,你可能难以记住并检索所需的值。

      *上述地址是不同Keypair的公钥,每个公钥(或地址)都有与之关联的私钥。如果需要,这个私钥将用于对不同的指令进行签名,这意味着我们需要在某个地方存储私钥,这绝对不是推荐的做法!

      这给许多Solana开发者带来了一个问题,即如何在他们的程序中实现类似Map的逻辑。让我们看看几种解决这个问题的方法。

      派生PDA

      PDA的全称是“程序派生地址” - Program Derived Address,简而言之,它们是从一组种子和程序ID(或地址)派生出来的地址。

      PDAs的独特之处在于,这些地址不与任何私钥相关联。这是因为这些地址不位于ED25519曲线上。因此,只有派生此地址的程序可以使用提供的密钥和种子对指令进行签名。在这里了解更多信息。

      现在我们对PDAs有了一个概念,让我们使用它们来映射一些账户!我们以一个博客程序作为示例,演示如何实现这一点。

      在这个博客程序中,我们希望每个User都拥有一个Blog。这个博客可以有任意数量的Posts。这意味着我们将每个用户映射到一个博客,每个帖子映射到某个博客。

      简而言之,用户和他/她的博客之间是1:1的映射,而博客和其帖子之间是1:N的映射。

      对于1:1的映射,我们希望一个博客的地址仅从其用户派生,这样我们可以通过其权限(或用户)来检索博客。因此,博客的种子将包括其权限的密钥,可能还有一个前缀博客,作为类型标识符。

      对于1:N的映射,我们希望每个帖子的地址不仅从它所关联的博客派生,还从另一个标识符派生,以区分博客中的多个帖子。在下面的示例中,每个帖子的地址是从博客的密钥、一个用于标识每个帖子的slug和一个前缀帖子派生出来的,作为类型标识符。

      代码如下所示:

      #[derive(Accounts)]
      #[instruction(blog_account_bump: u8)]
      pub struct InitializeBlog<'info> {
      #[account(
      init,
      seeds = [
      b"blog".as_ref(),
      authority.key().as_ref()
      ],
      bump = blog_account_bump,
      payer = authority,
      space = Blog::LEN
      )]
      pub blog_account: Account<'info, Blog>,

      #[account(mut)]
      pub authority: Signer<'info>,

      pub system_program: Program<'info, System>
      }

      #[derive(Accounts)]
      #[instruction(post_account_bump: u8, post: Post)]
      pub struct CreatePost<'info> {
      #[account(mut, has_one = authority)]
      pub blog_account: Account<'info, Blog>,

      #[account(
      init,
      seeds = [
      b"post".as_ref(),
      blog_account.key().as_ref(),
      post.slug.as_ref(),
      ],
      bump = post_account_bump,
      payer = authority,
      space = Post::LEN
      )]
      pub post_account: Account<'info, Post>,

      #[account(mut)]
      pub authority: Signer<'info>,

      pub system_program: Program<'info, System>
      }

      在客户端,你可以使用PublicKey.findProgramAddress()来获取所需的BlogPost账户地址,然后将其传递给connection.getAccountInfo()来获取账户数据。下面是一个示例:

      async () => {
      const connection = new Connection("http://localhost:8899", "confirmed");

      const [blogAccount] = await PublicKey.findProgramAddress(
      [Buffer.from("blog"), user.publicKey.toBuffer()],
      MY_PROGRAM_ID
      );

      const [postAccount] = await PublicKey.findProgramAddress(
      [Buffer.from("post"), Buffer.from("slug-1"), user.publicKey.toBuffer()],
      MY_PROGRAM_ID
      );

      const blogAccountInfo = await connection.getAccountInfo(blogAccount);
      const blogAccountState = BLOG_ACCOUNT_DATA_LAYOUT.decode(
      blogAccountInfo.data
      );
      console.log("Blog account state: ", blogAccountState);

      const postAccountInfo = await connection.getAccountInfo(postAccount);
      const postAccountState = POST_ACCOUNT_DATA_LAYOUT.decode(
      postAccountInfo.data
      );
      console.log("Post account state: ", postAccountState);
      };

      单个映射账户

      另一种实现映射的方法是在单个账户中显式存储一个BTreeMap数据结构。这个账户的地址本身可以是一个PDA,或者是生成的Keypair的公钥。

      这种账户映射的方法并不理想,原因如下:

      *首先,你需要初始化存储BTreeMap的账户,然后才能向其中插入必要的键值对。然后,你还需要将这个账户的地址存储在某个地方,以便每次更新时进行更新。

      *账户存在内存限制,每个账户的最大大小为10兆字节,这限制了BTreeMap存储大量键值对的能力。

      因此,在考虑你的用例后,可以按照以下方式实现这种方法:

      fn process_init_map(accounts: &[AccountInfo], program_id: &Pubkey) -> ProgramResult {
      let account_info_iter = &mut accounts.iter();

      let authority_account = next_account_info(account_info_iter)?;
      let map_account = next_account_info(account_info_iter)?;
      let system_program = next_account_info(account_info_iter)?;

      if !authority_account.is_signer {
      return Err(ProgramError::MissingRequiredSignature)
      }

      let (map_pda, map_bump) = Pubkey::find_program_address(
      &[b"map".as_ref()],
      program_id
      );

      if map_pda != *map_account.key || !map_account.is_writable || !map_account.data_is_empty() {
      return Err(BlogError::InvalidMapAccount.into())
      }

      let rent = Rent::get()?;
      let rent_lamports = rent.minimum_balance(MapAccount::LEN);

      let create_map_ix = &system_instruction::create_account(
      authority_account.key,
      map_account.key,
      rent_lamports,
      MapAccount::LEN.try_into().unwrap(),
      program_id
      );

      msg!("Creating MapAccount account");
      invoke_signed(
      create_map_ix,
      &[
      authority_account.clone(),
      map_account.clone(),
      system_program.clone()
      ],
      &[&[
      b"map".as_ref(),
      &[map_bump]
      ]]
      )?;

      msg!("Deserializing MapAccount account");
      let mut map_state = try_from_slice_unchecked::<MapAccount>(&map_account.data.borrow()).unwrap();
      let empty_map: BTreeMap<Pubkey, Pubkey> = BTreeMap::new();

      map_state.is_initialized = 1;
      map_state.map = empty_map;

      msg!("Serializing MapAccount account");
      map_state.serialize(&mut &mut map_account.data.borrow_mut()[..])?;

      Ok(())
      }

      fn process_insert_entry(accounts: &[AccountInfo], program_id: &Pubkey) -> ProgramResult {

      let account_info_iter = &mut accounts.iter();

      let a_account = next_account_info(account_info_iter)?;
      let b_account = next_account_info(account_info_iter)?;
      let map_account = next_account_info(account_info_iter)?;

      if !a_account.is_signer {
      return Err(ProgramError::MissingRequiredSignature)
      }

      if map_account.data.borrow()[0] == 0 || *map_account.owner != *program_id {
      return Err(BlogError::InvalidMapAccount.into())
      }

      msg!("Deserializing MapAccount account");
      let mut map_state = try_from_slice_unchecked::<MapAccount>(&map_account.data.borrow())?;

      if map_state.map.contains_key(a_account.key) {
      return Err(BlogError::AccountAlreadyHasEntry.into())
      }

      map_state.map.insert(*a_account.key, *b_account.key);

      msg!("Serializing MapAccount account");
      map_state.serialize(&mut &mut map_account.data.borrow_mut()[..])?;

      Ok(())
      }

      上述程序的客户端测试代码可能如下所示:

      const insertABIx = new TransactionInstruction({
      programId: MY_PROGRAM_ID,
      keys: [
      {
      pubkey: userA.publicKey,
      isSigner: true,
      isWritable: true,
      },
      {
      pubkey: userB.publicKey,
      isSigner: false,
      isWritable: false,
      },
      {
      pubkey: mapKey,
      isSigner: false,
      isWritable: true,
      },
      ],
      data: Buffer.from(Uint8Array.of(1)),
      });

      const insertBCIx = new TransactionInstruction({
      programId: MY_PROGRAM_ID,
      keys: [
      {
      pubkey: userB.publicKey,
      isSigner: true,
      isWritable: true,
      },
      {
      pubkey: userC.publicKey,
      isSigner: false,
      isWritable: false,
      },
      {
      pubkey: mapKey,
      isSigner: false,
      isWritable: true,
      },
      ],
      data: Buffer.from(Uint8Array.of(1)),
      });

      const insertCAIx = new TransactionInstruction({
      programId: MY_PROGRAM_ID,
      keys: [
      {
      pubkey: userC.publicKey,
      isSigner: true,
      isWritable: true,
      },
      {
      pubkey: userA.publicKey,
      isSigner: false,
      isWritable: false,
      },
      {
      pubkey: mapKey,
      isSigner: false,
      isWritable: true,
      },
      ],
      data: Buffer.from(Uint8Array.of(1)),
      });

      const tx = new Transaction();
      tx.add(initMapIx);
      tx.add(insertABIx);
      tx.add(insertBCIx);
      tx.add(insertCAIx);
      + \ No newline at end of file diff --git a/cookbook-zh/guides/data-migration/index.html b/cookbook-zh/guides/data-migration/index.html index e1804ba5d..880e12ac3 100644 --- a/cookbook-zh/guides/data-migration/index.html +++ b/cookbook-zh/guides/data-migration/index.html @@ -5,14 +5,14 @@ 迁移程序的数据账户 | All in One Solana - +

      迁移程序的数据账户

      你如何迁移一个程序的数据账户?

      当你创建一个程序时,与该程序关联的每个数据账户都将具有特定的数据结构。如果你需要升级一个程序派生账户,那么你将得到一堆具有旧结构的剩余程序派生账户。

      通过账户版本控制,您可以将旧账户升级到新的结构。

      info

      tip 注意 -这只是在程序拥有的账户(POA)中迁移数据的众多方法之一。

      场景

      为了对账户数据进行版本控制和迁移,我们将为每个账户提供一个ID。该ID允许我们在将其传递给程序时识别账户的版本,从而正确处理账户。

      假设有以下账户状态和程序:

      #[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
      pub struct AccountContentCurrent {
      pub somevalue: u64,
      }

      #[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
      pub struct ProgramAccountState {
      is_initialized: bool,
      data_version: u8,
      account_data: AccountContentCurrent,
      }

      在我们账户的第一个版本中,我们执行以下操作:

      IDAction
      1Include a 'data version' field in your data. It can be a simple incrementing ordinal (e.g. u8) or something more sophisticated
      2Allocating enough space for data growth
      3Initializing a number of constants to be used across program versions
      4Add an update account function under fn conversion_logic for future upgrades

      假设我们现在希望升级程序的账户,包括一个新的必需字段:somestring字段。

      如果我们之前没有为账户分配额外的空间,我们将无法升级该账户,而被卡住。

      升级账户

      在我们的新程序中,我们希望为内容状态添加一个新属性。下面的变化展示了我们如何利用初始的程序结构,并在现在使用时进行修改。

      1. 添加账户转换逻辑

      /// Current state (DATA_VERSION 1). If version changes occur, this
      /// should be copied to another (see AccountContentOld below)
      /// We've added a new field: 'somestring'
      #[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
      pub struct AccountContentCurrent {
      pub somevalue: u64,
      pub somestring: String,
      }

      /// Old content state (DATA_VERSION 0).
      #[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
      pub struct AccountContentOld {
      pub somevalue: u64,
      }

      /// Maintains account data
      #[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
      pub struct ProgramAccountState {
      is_initialized: bool,
      data_version: u8,
      account_data: AccountContentCurrent,
      }
      Line(s)Note
      6We've added Solana's solana_program::borsh::try_from_slice_unchecked to simplify reading subsets of data from the larger data block
      13-26Here we've preserved the old content structure, AccountContentOld line 24, before extending the AccountContentCurrent starting in line 17.
      60We bump the DATA_VERSION constant
      71We now have a 'previous' version and we want to know it's size
      86The Coup de grâce is adding the plumbing to upgrade the previous content state to the new (current) content state

      然后,我们更新指令,添加一个新的指令来更新somestring,并更新处理器来处理新的指令。请注意,"升级"数据结构是通过pack/unpack封装起来的。

      //! instruction Contains the main VersionProgramInstruction enum

      use {
      crate::error::DataVersionError,
      borsh::{BorshDeserialize, BorshSerialize},
      solana_program::{borsh::try_from_slice_unchecked, msg, program_error::ProgramError},
      };

      #[derive(BorshDeserialize, BorshSerialize, Debug, PartialEq)]
      /// All custom program instructions
      pub enum VersionProgramInstruction {
      InitializeAccount,
      SetU64Value(u64),
      SetString(String), // Added with data version change
      FailInstruction,
      }

      impl VersionProgramInstruction {
      /// Unpack inbound buffer to associated Instruction
      /// The expected format for input is a Borsh serialized vector
      pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
      let payload = try_from_slice_unchecked::<VersionProgramInstruction>(input).unwrap();
      // let payload = VersionProgramInstruction::try_from_slice(input).unwrap();
      match payload {
      VersionProgramInstruction::InitializeAccount => Ok(payload),
      VersionProgramInstruction::SetU64Value(_) => Ok(payload),
      VersionProgramInstruction::SetString(_) => Ok(payload), // Added with data version change
      _ => Err(DataVersionError::InvalidInstruction.into()),
      }
      }
      }

      资料

      - +这只是在程序拥有的账户(POA)中迁移数据的众多方法之一。

      场景

      为了对账户数据进行版本控制和迁移,我们将为每个账户提供一个ID。该ID允许我们在将其传递给程序时识别账户的版本,从而正确处理账户。

      假设有以下账户状态和程序:

      #[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
      pub struct AccountContentCurrent {
      pub somevalue: u64,
      }

      #[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
      pub struct ProgramAccountState {
      is_initialized: bool,
      data_version: u8,
      account_data: AccountContentCurrent,
      }

      在我们账户的第一个版本中,我们执行以下操作:

      IDAction
      1Include a 'data version' field in your data. It can be a simple incrementing ordinal (e.g. u8) or something more sophisticated
      2Allocating enough space for data growth
      3Initializing a number of constants to be used across program versions
      4Add an update account function under fn conversion_logic for future upgrades

      假设我们现在希望升级程序的账户,包括一个新的必需字段:somestring字段。

      如果我们之前没有为账户分配额外的空间,我们将无法升级该账户,而被卡住。

      升级账户

      在我们的新程序中,我们希望为内容状态添加一个新属性。下面的变化展示了我们如何利用初始的程序结构,并在现在使用时进行修改。

      1. 添加账户转换逻辑

      /// Current state (DATA_VERSION 1). If version changes occur, this
      /// should be copied to another (see AccountContentOld below)
      /// We've added a new field: 'somestring'
      #[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
      pub struct AccountContentCurrent {
      pub somevalue: u64,
      pub somestring: String,
      }

      /// Old content state (DATA_VERSION 0).
      #[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
      pub struct AccountContentOld {
      pub somevalue: u64,
      }

      /// Maintains account data
      #[derive(BorshDeserialize, BorshSerialize, Debug, Default, PartialEq)]
      pub struct ProgramAccountState {
      is_initialized: bool,
      data_version: u8,
      account_data: AccountContentCurrent,
      }
      Line(s)Note
      6We've added Solana's solana_program::borsh::try_from_slice_unchecked to simplify reading subsets of data from the larger data block
      13-26Here we've preserved the old content structure, AccountContentOld line 24, before extending the AccountContentCurrent starting in line 17.
      60We bump the DATA_VERSION constant
      71We now have a 'previous' version and we want to know it's size
      86The Coup de grâce is adding the plumbing to upgrade the previous content state to the new (current) content state

      然后,我们更新指令,添加一个新的指令来更新somestring,并更新处理器来处理新的指令。请注意,"升级"数据结构是通过pack/unpack封装起来的。

      //! instruction Contains the main VersionProgramInstruction enum

      use {
      crate::error::DataVersionError,
      borsh::{BorshDeserialize, BorshSerialize},
      solana_program::{borsh::try_from_slice_unchecked, msg, program_error::ProgramError},
      };

      #[derive(BorshDeserialize, BorshSerialize, Debug, PartialEq)]
      /// All custom program instructions
      pub enum VersionProgramInstruction {
      InitializeAccount,
      SetU64Value(u64),
      SetString(String), // Added with data version change
      FailInstruction,
      }

      impl VersionProgramInstruction {
      /// Unpack inbound buffer to associated Instruction
      /// The expected format for input is a Borsh serialized vector
      pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
      let payload = try_from_slice_unchecked::<VersionProgramInstruction>(input).unwrap();
      // let payload = VersionProgramInstruction::try_from_slice(input).unwrap();
      match payload {
      VersionProgramInstruction::InitializeAccount => Ok(payload),
      VersionProgramInstruction::SetU64Value(_) => Ok(payload),
      VersionProgramInstruction::SetString(_) => Ok(payload), // Added with data version change
      _ => Err(DataVersionError::InvalidInstruction.into()),
      }
      }
      }

      资料

      + \ No newline at end of file diff --git a/cookbook-zh/guides/debugging-solana-programs/index.html b/cookbook-zh/guides/debugging-solana-programs/index.html index cb1e59ac4..595827cdb 100644 --- a/cookbook-zh/guides/debugging-solana-programs/index.html +++ b/cookbook-zh/guides/debugging-solana-programs/index.html @@ -5,7 +5,7 @@ 调试 Solana 程序 | All in One Solana - + @@ -13,8 +13,8 @@

      调试 Solana 程序

      有许多选项和支持工具可用于测试和调试Solana程序。

      info

      tip 事实表

      • solana-program-test 包可以使用基本的本地运行时,在其中可以交互式地测试和调试程序(例如在 vscode 中)。
      • solana-validator 包可以使用solana-test-validator实现进行更可靠的测试,该测试发生在本地验证器节点上。你可以从编辑器中运行,但是程序中的断点将被忽略。
      • CLI工具solana-test-validator 可以从命令行运行和加载你的程序,并处理来自命令行 Rust 应用程序或使用 web3 的 JavaScript/TypeScript 应用程序的事务执行。
      • 对于上述所有情况,建议在开始时大量使用msg!宏进行输出,然后在测试和确保行为稳定后将其移除。请记住,msg! 会消耗计算单位,如果达到计算单位的预算限制,最终可能导致程序失败。

      按照以下步骤使用 solana-program-bpf-template。将其克隆到你的计算机上:

      git clone git@github.com:mvines/solana-bpf-program-template.git
      cd solana-bpf-program-template
      code .

      在编辑器中进行运行时测试和调试

      打开文件 src/lib.rs

      你会看到该程序非常简单,基本上只是记录程序入口函数process_instruction接收到的内容。

      1.转到 #[cfg(test)] 部分,并点击Run Tests。这将构建程序,然后执行 async fn test_transaction() 测试。你将在 vscode 终端中看到简化的日志消息。

      running 1 test
      "bpf_program_template" program loaded as native code
      Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM invoke [1]
      Program log: process_instruction: 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM: 1 accounts, data=[1, 2, 3]
      Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM success
      test test::test_transaction ... ok
      test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 33.41s

      2.在程序的第11行(msg!行)上设置一个断点。 3. 返回测试模块,点击Debug,几秒钟后调试器会在断点处停下,现在你可以检查数据、逐步执行函数等等。

      这些测试也可以通过命令行运行:cargo testcargo test-bpf。当然,任何断点都会被忽略。

      多酷啊!

      info

      tip 请注意 你并没有使用验证节点,因此默认的程序、区块哈希等在验证节点中的行为可能与你的运行结果不同。这就是Solana 团队为我们提供本地验证节点测试的原因!

      在编辑器中进行本地验证节点测试

      tests/integration.rs 文件中,定义了使用程序加载本地验证节点进行集成测试。

      默认情况下,模板仓库的集成测试只能通过命令行使用 cargo test-bpf 运行。以下步骤将使你能够在编辑器中运行测试,并显示程序的验证节点日志和 msg! 输出:

      1. 在仓库目录中运行 cargo build-bpf 来构建示例程序
      2. 在编辑器中打开 tests/integration.rs 文件
      3. 将第 1 行注释掉 -> // #![cfg(feature = "test-bpf")]
      4. 在第 19 行将其修改为:.add_program("target/deploy/bpf_program_template", program_id)
      5. 在第 22 行插入以下内容solana_logger::setup_with_default("solana_runtime::message=debug");
      6. 点击在 test_validator_transaction() 函数上方的 Run Test

      这将加载验证节点,然后允许您构建一个交易(按照 Rust 的方式),并使用RpcClient提交给节点。

      程序的输出也将打印在编辑器的终端中。例如(简化):

      running 1 test
      Waiting for fees to stabilize 1...
      Waiting for fees to stabilize 2...
      Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM invoke [1]
      Program log: process_instruction: 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM: 1 accounts, data=[1, 2, 3]
      Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM consumed 13027 of 200000 compute units
      Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM success

      test test_validator_transaction ... ok
      test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.40s

      在这里进行调试将允许你调试测试主体中使用的函数和方法,但不会在你的程序中设置断点。

      非常出色,不是吗?

      从客户端应用程序进行本地验证节点测试

      最后,你可以从命令行启动一个本地验证节点,并使用solana-test-validator加载你的程序和任何账户。

      在这种方法中,你需要一个客户端应用程序,可以使用Rust的 RcpClient,也可以使用 -JavaScript or Typescript clients的客户端。

      有关更多详细信息和选项,请参阅solana-test-validator --help。对于这个示例程序,以下是基本设置:

      1. 在存储库文件夹中打开一个终端
      2. 运行solana config set -ul命令,将配置设置为指向本地
      3. 运行solana-test-validator --bpf-program target/deploy/bpf_program_template-keypair.json target/deploy/bpf_program_template.so
      4. 打开另一个终端并运行solana logs以启动日志流
      5. 然后,你可以运行客户端程序,并在您启动日志流的终端中观察程序输出

      那可真是太棒了!

      资料

      solana-program-bpf-template

      RcpClient

      JavaScript/Typescript Library

      - +JavaScript or Typescript clients的客户端。

      有关更多详细信息和选项,请参阅solana-test-validator --help。对于这个示例程序,以下是基本设置:

      1. 在存储库文件夹中打开一个终端
      2. 运行solana config set -ul命令,将配置设置为指向本地
      3. 运行solana-test-validator --bpf-program target/deploy/bpf_program_template-keypair.json target/deploy/bpf_program_template.so
      4. 打开另一个终端并运行solana logs以启动日志流
      5. 然后,你可以运行客户端程序,并在您启动日志流的终端中观察程序输出

      那可真是太棒了!

      资料

      solana-program-bpf-template

      RcpClient

      JavaScript/Typescript Library

      + \ No newline at end of file diff --git a/cookbook-zh/guides/feature-parity-testing/index.html b/cookbook-zh/guides/feature-parity-testing/index.html index 7433beb38..8a48160b5 100644 --- a/cookbook-zh/guides/feature-parity-testing/index.html +++ b/cookbook-zh/guides/feature-parity-testing/index.html @@ -5,13 +5,13 @@ 功能相等测试 | All in One Solana - +
      -

      功能相等测试

      当测试程序时,确保它在各个集群中以相同的方式运行对于确保质量和产生预期结果非常重要。

      综述

      info

      tip 事实表

      • 功能是为 Solana 验证节点引入的能力,需要激活才能使用。
      • 某个集群(例如测试网)中可能激活了某些特性,而另一个集群(例如主网测试网)则未激活。
      • 然而,在本地运行默认的solana-test-validator时,你的 Solana 版本中的所有可用功能都会自动激活。结果是,在本地测试时,特性和测试结果可能与在不同集群中部署和运行时不同!

      场景

      假设你有一个包含三(3)条指令的交易,每个指令大约消耗 100,000 计算单元(Compute Units,CU)。在运行 Solana 1.8.x 版本时,你会观察到指令的计算单元消耗类似于:

      InstructionStarting CUExecutionRemaining CU
      1200_000-100_000100_000
      2200_000-100_000100_000
      3200_000-100_000100_000

      在 Solana 1.9.2 中引入了一个名为“transaction wide compute cap”的功能,其中默认情况下,一个交易具有 200,000 计算单元(CU)的预算,封装的指令从该交易预算中消耗。运行上述相同的交易将会有非常不同的行为:

      InstructionStarting CUExecutionRemaining CU
      1200_000-100_000100_000
      2100_000-100_0000
      30FAIL!!!FAIL!!!

      天哪!如果你不知道这一点,你可能会感到沮丧,因为你的指令行为没有任何变化会导致这种情况。在开发网络上它正常工作,但在本地却失败了?!?

      你可以增加整体交易预算,比如将其增加到 300,000 计算单元(CU),来保持你的理智,但这也展示了为什么以功能相等的方式进行测试是避免任何混淆的积极方式。

      功能状态

      使用solana feature status命令可以很容易地检查特定集群启用了哪些功能。

      solana feature status -ud   // Displays by feature status for devnet
      solana feature status -ut // Displays for testnet
      solana feature status -um // Displays for mainnet-beta
      solana feature status -ul // Displays for local, requires running solana-test-validator

      或者,你可以使用类似的工具,像 scfsd,观察所有集群上的功能状态。该工具会显示如下的部分屏幕内容,并且不需要solana-test-validator运行:

      功能相等测试

      正如前面提到的,solana-test-validator 会自动激活所有功能。所以回答问题“如何在本地测试环境中与 devnet、testnet 或者 mainnet-beta 保持一致?”的解决方案是:Solana 1.9.6 添加了 PR 来允许禁用功能:

      solana-test-validator --deactivate-feature <FEATURE_PUBKEY> ...

      简单演示

      假设你有一个简单的程序,在其入口点中记录接收到的数据。你正在测试一个包含两(2)个指令的事务,用于执行你的程序。

      所有功能已激活

      1. 你在一个终端中启动测试验证节点:
      solana config set -ul
      solana-test-validator -l ./ledger --bpf-program ADDRESS target/deploy/PROGNAME.so --reset`
      1. 在另一个终端中启动日志流处理器:
      solana logs
      1. 然后运行你的事务。你会在日志终端中看到类似的输出(为了清晰起见进行了编辑):
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc invoke [1]
      Program log: process_instruction: PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc: 0 accounts, data=[0]
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc consumed 12843 of 200000 compute units
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc success
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc invoke [1]
      Program log: process_instruction: PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc: 0 accounts, data=[1]
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc consumed 12843 of 187157 compute units
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc success[

      因为我们的功能“事务整体计算容量”默认情况下是自动激活的,我们观察到每个指令从起始事务预算的 200,000 CU 中消耗 CU。

      选择性功能已停用

      1. 在这次运行中,我们希望使 CU 预算的行为与 devnet 中运行的行为保持一致。使用 Feature Status 中描述的工具,我们可以找到transaction wide compute cap的公钥,并在测试验证器启动时使用 --deactivate-feature 参数。
      solana-test-validator -l ./ledger --deactivate-feature 5ekBxc8itEnPv4NzGJtr8BVVQLNMQuLMNQQj7pHoLNZ9 --bpf-program target/deploy/PROGNAME.so --reset`
      1. 现在我们可以在日志中看到我们的指令现在拥有自己的 200,000 CU 预算(为了清晰起见进行了编辑),这目前是所有上游集群的状态。
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc invoke [1]
      Program log: process_instruction: PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc: 0 accounts, data=[0]
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc consumed 12843 of 200000 compute units
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc success
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc invoke [1]
      Program log: process_instruction: PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc: 0 accounts, data=[0]
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc consumed 12843 of 200000 compute units
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc success

      全面相等性测试

      你可以通过识别尚未激活的每个功能,并在调用solana-test-validator时添加--deactivate-feature <FEATURE_PUBKEY>来与特定集群完全保持一致。

      solana-test-validator --deactivate-feature PUBKEY_1 --deactivate-feature PUBKEY_2 ...

      或者,scfsd 提供了一个命令开关,用于输出集群的完整停用功能集,可以直接用于solana-test-validator的启动参数:

      solana-test-validator -l ./.ledger $(scfsd -c devnet -k -t)

      如果你在验证器运行时打开另一个终端,并运行solana feature status命令,你会看到一些在 devnet 中停用的功能也被停用了。

      以编程方式进行全面相等性测试

      对于那些在测试代码中控制运行测试验证器的人来说,可以使用TestValidatorGenesis来修改测试验证器的激活/停用功能。在 Solana 1.9.6 中,验证器构建器添加了一个函数来支持这个功能。

      在您的程序文件夹的根目录下,创建一个名为tests的新文件夹,并添加一个parity_test.rs文件。以下是每个测试使用的基本函数(模板函数):

      /// Setup the test validator passing features
      /// you want to deactivate before running transactions
      pub fn setup_validator(
      invalidate_features: Vec<Pubkey>,
      ) -> Result<(TestValidator, Keypair), Box<dyn error::Error>> {
      // Extend environment variable to include our program location
      std::env::set_var("BPF_OUT_DIR", PROG_PATH);
      // Instantiate the test validator
      let mut test_validator = TestValidatorGenesis::default();
      // Once instantiated, TestValidatorGenesis configuration functions follow
      // a builder pattern enabling chaining of settings function calls
      let (test_validator, kp) = test_validator
      // Set the ledger path and name
      // maps to `solana-test-validator --ledger <DIR>`
      .ledger_path(LEDGER_PATH)
      // Load our program. Ignored if reusing ledger
      // maps to `solana-test-validator --bpf-program <ADDRESS_OR_PATH BPF_PROGRAM.SO>`
      .add_program(PROG_NAME, PROG_KEY)
      // Identify features to deactivate. Ignored if reusing ledger
      // maps to `solana-test-validator --deactivate-feature <FEATURE_PUBKEY>`
      .deactivate_features(&invalidate_features)
      // Start the test validator
      .start();
      Ok((test_validator, kp))
      }

      /// Convenience function to remove existing ledger before TestValidatorGenesis setup
      /// maps to `solana-test-validator ... --reset`
      pub fn clean_ledger_setup_validator(
      invalidate_features: Vec<Pubkey>,
      ) -> Result<(TestValidator, Keypair), Box<dyn error::Error>> {
      if PathBuf::from_str(LEDGER_PATH).unwrap().exists() {
      std::fs::remove_dir_all(LEDGER_PATH).unwrap();
      }
      setup_validator(invalidate_features)
      }

      /// Submits a transaction with programs instruction
      /// Boiler plate
      fn submit_transaction(
      rpc_client: &RpcClient,
      wallet_signer: &dyn Signer,
      instructions: Vec<Instruction>,
      ) -> Result<Signature, Box<dyn std::error::Error>> {
      let mut transaction =
      Transaction::new_unsigned(Message::new(&instructions, Some(&wallet_signer.pubkey())));
      let recent_blockhash = rpc_client
      .get_latest_blockhash()
      .map_err(|err| format!("error: unable to get recent blockhash: {}", err))?;
      transaction
      .try_sign(&vec![wallet_signer], recent_blockhash)
      .map_err(|err| format!("error: failed to sign transaction: {}", err))?;
      let signature = rpc_client
      .send_and_confirm_transaction(&transaction)
      .map_err(|err| format!("error: send transaction: {}", err))?;
      Ok(signature)
      }

      现在我们可以在mod test {...}的主体中添加测试函数,来展示默认验证器的设置(所有功能都启用),然后禁用事务广域计算限制,就像之前在命令行中运行solana-test-validator的示例一样。

      #[test]
      fn test_base_pass() {
      // Run with all features activated (default for TestValidatorGenesis)
      let inv_feat = vec![];
      // Start validator with clean (new) ledger
      let (test_validator, main_payer) = clean_ledger_setup_validator(inv_feat).unwrap();
      // Get the RpcClient
      let connection = test_validator.get_rpc_client();
      // Capture our programs log statements
      solana_logger::setup_with_default("solana_runtime::message=debug");

      // This example doesn't require sending any accounts to program
      let accounts = &[];
      // Build instruction array and submit transaction
      let txn = submit_transaction(
      &connection,
      &main_payer,
      // Add two (2) instructions to transaction to demonstrate
      // that each instruction CU draws down from default Transaction CU (200_000)
      // Replace with instructions that make sense for your program
      [
      Instruction::new_with_borsh(PROG_KEY, &0u8, accounts.to_vec()),
      Instruction::new_with_borsh(PROG_KEY, &1u8, accounts.to_vec()),
      ]
      .to_vec(),
      );
      assert!(txn.is_ok());
      }

      另外,scfs engine gadget可以生成一个包含某个集群的所有已停用功能的完整向量。以下示例演示了如何使用该 engine 来获取 devnet 的所有已停用功能列表。

      devent parity

      #[test]
      fn test_devnet_parity_pass() {
      // Use gadget-scfs to get all deactivated features from devnet
      // must have `gadgets-scfs = "0.2.0" in Cargo.toml to use
      // Here we setup for a run that samples features only
      // from devnet
      let mut my_matrix = ScfsMatrix::new(Some(ScfsCriteria {
      clusters: Some(vec![SCFS_DEVNET.to_string()]),
      ..Default::default()
      }))
      .unwrap();
      // Run the sampler matrix
      assert!(my_matrix.run().is_ok());
      // Get all deactivated features
      let deactivated = my_matrix
      .get_features(Some(&ScfsMatrix::any_inactive))
      .unwrap();
      // Confirm we have them
      assert_ne!(deactivated.len(), 0);
      // Setup test validator and logging while deactivating all
      // features that are deactivated in devnet
      let (test_validator, main_payer) = clean_ledger_setup_validator(deactivated).unwrap();
      let connection = test_validator.get_rpc_client();
      solana_logger::setup_with_default("solana_runtime::message=debug");

      let accounts = &[];
      let txn = submit_transaction(
      &connection,
      &main_payer,
      [
      // Add two (2) instructions to transaction
      // Replace with instructions that make sense for your program
      Instruction::new_with_borsh(PROG_KEY, &0u8, accounts.to_vec()),
      Instruction::new_with_borsh(PROG_KEY, &1u8, accounts.to_vec()),
      ]
      .to_vec(),
      );
      assert!(txn.is_ok());
      }

      愉快的测试!

      资料

      - +

      功能相等测试

      当测试程序时,确保它在各个集群中以相同的方式运行对于确保质量和产生预期结果非常重要。

      综述

      info

      tip 事实表

      • 功能是为 Solana 验证节点引入的能力,需要激活才能使用。
      • 某个集群(例如测试网)中可能激活了某些特性,而另一个集群(例如主网测试网)则未激活。
      • 然而,在本地运行默认的solana-test-validator时,你的 Solana 版本中的所有可用功能都会自动激活。结果是,在本地测试时,特性和测试结果可能与在不同集群中部署和运行时不同!

      场景

      假设你有一个包含三(3)条指令的交易,每个指令大约消耗 100,000 计算单元(Compute Units,CU)。在运行 Solana 1.8.x 版本时,你会观察到指令的计算单元消耗类似于:

      InstructionStarting CUExecutionRemaining CU
      1200_000-100_000100_000
      2200_000-100_000100_000
      3200_000-100_000100_000

      在 Solana 1.9.2 中引入了一个名为“transaction wide compute cap”的功能,其中默认情况下,一个交易具有 200,000 计算单元(CU)的预算,封装的指令从该交易预算中消耗。运行上述相同的交易将会有非常不同的行为:

      InstructionStarting CUExecutionRemaining CU
      1200_000-100_000100_000
      2100_000-100_0000
      30FAIL!!!FAIL!!!

      天哪!如果你不知道这一点,你可能会感到沮丧,因为你的指令行为没有任何变化会导致这种情况。在开发网络上它正常工作,但在本地却失败了?!?

      你可以增加整体交易预算,比如将其增加到 300,000 计算单元(CU),来保持你的理智,但这也展示了为什么以功能相等的方式进行测试是避免任何混淆的积极方式。

      功能状态

      使用solana feature status命令可以很容易地检查特定集群启用了哪些功能。

      solana feature status -ud   // Displays by feature status for devnet
      solana feature status -ut // Displays for testnet
      solana feature status -um // Displays for mainnet-beta
      solana feature status -ul // Displays for local, requires running solana-test-validator

      或者,你可以使用类似的工具,像 scfsd,观察所有集群上的功能状态。该工具会显示如下的部分屏幕内容,并且不需要solana-test-validator运行:

      功能相等测试

      正如前面提到的,solana-test-validator 会自动激活所有功能。所以回答问题“如何在本地测试环境中与 devnet、testnet 或者 mainnet-beta 保持一致?”的解决方案是:Solana 1.9.6 添加了 PR 来允许禁用功能:

      solana-test-validator --deactivate-feature <FEATURE_PUBKEY> ...

      简单演示

      假设你有一个简单的程序,在其入口点中记录接收到的数据。你正在测试一个包含两(2)个指令的事务,用于执行你的程序。

      所有功能已激活

      1. 你在一个终端中启动测试验证节点:
      solana config set -ul
      solana-test-validator -l ./ledger --bpf-program ADDRESS target/deploy/PROGNAME.so --reset`
      1. 在另一个终端中启动日志流处理器:
      solana logs
      1. 然后运行你的事务。你会在日志终端中看到类似的输出(为了清晰起见进行了编辑):
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc invoke [1]
      Program log: process_instruction: PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc: 0 accounts, data=[0]
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc consumed 12843 of 200000 compute units
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc success
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc invoke [1]
      Program log: process_instruction: PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc: 0 accounts, data=[1]
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc consumed 12843 of 187157 compute units
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc success[

      因为我们的功能“事务整体计算容量”默认情况下是自动激活的,我们观察到每个指令从起始事务预算的 200,000 CU 中消耗 CU。

      选择性功能已停用

      1. 在这次运行中,我们希望使 CU 预算的行为与 devnet 中运行的行为保持一致。使用 Feature Status 中描述的工具,我们可以找到transaction wide compute cap的公钥,并在测试验证器启动时使用 --deactivate-feature 参数。
      solana-test-validator -l ./ledger --deactivate-feature 5ekBxc8itEnPv4NzGJtr8BVVQLNMQuLMNQQj7pHoLNZ9 --bpf-program target/deploy/PROGNAME.so --reset`
      1. 现在我们可以在日志中看到我们的指令现在拥有自己的 200,000 CU 预算(为了清晰起见进行了编辑),这目前是所有上游集群的状态。
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc invoke [1]
      Program log: process_instruction: PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc: 0 accounts, data=[0]
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc consumed 12843 of 200000 compute units
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc success
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc invoke [1]
      Program log: process_instruction: PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc: 0 accounts, data=[0]
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc consumed 12843 of 200000 compute units
      Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc success

      全面相等性测试

      你可以通过识别尚未激活的每个功能,并在调用solana-test-validator时添加--deactivate-feature <FEATURE_PUBKEY>来与特定集群完全保持一致。

      solana-test-validator --deactivate-feature PUBKEY_1 --deactivate-feature PUBKEY_2 ...

      或者,scfsd 提供了一个命令开关,用于输出集群的完整停用功能集,可以直接用于solana-test-validator的启动参数:

      solana-test-validator -l ./.ledger $(scfsd -c devnet -k -t)

      如果你在验证器运行时打开另一个终端,并运行solana feature status命令,你会看到一些在 devnet 中停用的功能也被停用了。

      以编程方式进行全面相等性测试

      对于那些在测试代码中控制运行测试验证器的人来说,可以使用TestValidatorGenesis来修改测试验证器的激活/停用功能。在 Solana 1.9.6 中,验证器构建器添加了一个函数来支持这个功能。

      在您的程序文件夹的根目录下,创建一个名为tests的新文件夹,并添加一个parity_test.rs文件。以下是每个测试使用的基本函数(模板函数):

      /// Setup the test validator passing features
      /// you want to deactivate before running transactions
      pub fn setup_validator(
      invalidate_features: Vec<Pubkey>,
      ) -> Result<(TestValidator, Keypair), Box<dyn error::Error>> {
      // Extend environment variable to include our program location
      std::env::set_var("BPF_OUT_DIR", PROG_PATH);
      // Instantiate the test validator
      let mut test_validator = TestValidatorGenesis::default();
      // Once instantiated, TestValidatorGenesis configuration functions follow
      // a builder pattern enabling chaining of settings function calls
      let (test_validator, kp) = test_validator
      // Set the ledger path and name
      // maps to `solana-test-validator --ledger <DIR>`
      .ledger_path(LEDGER_PATH)
      // Load our program. Ignored if reusing ledger
      // maps to `solana-test-validator --bpf-program <ADDRESS_OR_PATH BPF_PROGRAM.SO>`
      .add_program(PROG_NAME, PROG_KEY)
      // Identify features to deactivate. Ignored if reusing ledger
      // maps to `solana-test-validator --deactivate-feature <FEATURE_PUBKEY>`
      .deactivate_features(&invalidate_features)
      // Start the test validator
      .start();
      Ok((test_validator, kp))
      }

      /// Convenience function to remove existing ledger before TestValidatorGenesis setup
      /// maps to `solana-test-validator ... --reset`
      pub fn clean_ledger_setup_validator(
      invalidate_features: Vec<Pubkey>,
      ) -> Result<(TestValidator, Keypair), Box<dyn error::Error>> {
      if PathBuf::from_str(LEDGER_PATH).unwrap().exists() {
      std::fs::remove_dir_all(LEDGER_PATH).unwrap();
      }
      setup_validator(invalidate_features)
      }

      /// Submits a transaction with programs instruction
      /// Boiler plate
      fn submit_transaction(
      rpc_client: &RpcClient,
      wallet_signer: &dyn Signer,
      instructions: Vec<Instruction>,
      ) -> Result<Signature, Box<dyn std::error::Error>> {
      let mut transaction =
      Transaction::new_unsigned(Message::new(&instructions, Some(&wallet_signer.pubkey())));
      let recent_blockhash = rpc_client
      .get_latest_blockhash()
      .map_err(|err| format!("error: unable to get recent blockhash: {}", err))?;
      transaction
      .try_sign(&vec![wallet_signer], recent_blockhash)
      .map_err(|err| format!("error: failed to sign transaction: {}", err))?;
      let signature = rpc_client
      .send_and_confirm_transaction(&transaction)
      .map_err(|err| format!("error: send transaction: {}", err))?;
      Ok(signature)
      }

      现在我们可以在mod test {...}的主体中添加测试函数,来展示默认验证器的设置(所有功能都启用),然后禁用事务广域计算限制,就像之前在命令行中运行solana-test-validator的示例一样。

      #[test]
      fn test_base_pass() {
      // Run with all features activated (default for TestValidatorGenesis)
      let inv_feat = vec![];
      // Start validator with clean (new) ledger
      let (test_validator, main_payer) = clean_ledger_setup_validator(inv_feat).unwrap();
      // Get the RpcClient
      let connection = test_validator.get_rpc_client();
      // Capture our programs log statements
      solana_logger::setup_with_default("solana_runtime::message=debug");

      // This example doesn't require sending any accounts to program
      let accounts = &[];
      // Build instruction array and submit transaction
      let txn = submit_transaction(
      &connection,
      &main_payer,
      // Add two (2) instructions to transaction to demonstrate
      // that each instruction CU draws down from default Transaction CU (200_000)
      // Replace with instructions that make sense for your program
      [
      Instruction::new_with_borsh(PROG_KEY, &0u8, accounts.to_vec()),
      Instruction::new_with_borsh(PROG_KEY, &1u8, accounts.to_vec()),
      ]
      .to_vec(),
      );
      assert!(txn.is_ok());
      }

      另外,scfs engine gadget可以生成一个包含某个集群的所有已停用功能的完整向量。以下示例演示了如何使用该 engine 来获取 devnet 的所有已停用功能列表。

      devent parity

      #[test]
      fn test_devnet_parity_pass() {
      // Use gadget-scfs to get all deactivated features from devnet
      // must have `gadgets-scfs = "0.2.0" in Cargo.toml to use
      // Here we setup for a run that samples features only
      // from devnet
      let mut my_matrix = ScfsMatrix::new(Some(ScfsCriteria {
      clusters: Some(vec![SCFS_DEVNET.to_string()]),
      ..Default::default()
      }))
      .unwrap();
      // Run the sampler matrix
      assert!(my_matrix.run().is_ok());
      // Get all deactivated features
      let deactivated = my_matrix
      .get_features(Some(&ScfsMatrix::any_inactive))
      .unwrap();
      // Confirm we have them
      assert_ne!(deactivated.len(), 0);
      // Setup test validator and logging while deactivating all
      // features that are deactivated in devnet
      let (test_validator, main_payer) = clean_ledger_setup_validator(deactivated).unwrap();
      let connection = test_validator.get_rpc_client();
      solana_logger::setup_with_default("solana_runtime::message=debug");

      let accounts = &[];
      let txn = submit_transaction(
      &connection,
      &main_payer,
      [
      // Add two (2) instructions to transaction
      // Replace with instructions that make sense for your program
      Instruction::new_with_borsh(PROG_KEY, &0u8, accounts.to_vec()),
      Instruction::new_with_borsh(PROG_KEY, &1u8, accounts.to_vec()),
      ]
      .to_vec(),
      );
      assert!(txn.is_ok());
      }

      愉快的测试!

      资料

      + \ No newline at end of file diff --git a/cookbook-zh/guides/get-program-accounts/index.html b/cookbook-zh/guides/get-program-accounts/index.html index b03731676..9442de74f 100644 --- a/cookbook-zh/guides/get-program-accounts/index.html +++ b/cookbook-zh/guides/get-program-accounts/index.html @@ -5,13 +5,13 @@ 获取程序帐户 | All in One Solana - +
      -

      获取程序帐户

      一个返回程序所拥有的账户的RPC方法。目前不支持分页。请求getProgramAccounts应该包括dataSlice和/或filters参数,以提高响应时间并返回只有预期结果的内容。

      info

      tip 参数

      • programId: string - 要查询的程序的公钥,以base58编码的字符串形式提供。
      • (可选) configOrCommitment: object - 包含以下可选字段的配置参数:
        • (可选) commitment: string - 状态承诺/State commitment
        • (可选) encoding: string - 账户数据的编码方式,可以是: base58, base64, 或 jsonParsed. 请注意 web3js 用户应改用 getParsedProgramAccounts
        • (可选) dataSlice: object - 根据以下内容限制返回的账户数据:
          • offset: number - 开始返回账户数据的字节数
          • length: number - 要返回的账户数据的字节数
        • (可选) filters: array - 使用以下过滤器对象对结果进行过滤:
          • memcmp: object - 将一系列字节与账户数据匹配:
          • offset: number - 开始比较的账户数据字节偏移量
          • bytes: string - 要匹配的数据,以base58编码的字符串形式,限制为129个字节
          • dataSize: number - 将账户数据的长度与提供的数据大小进行比较
        • (可选) withContext: boolean - 将结果包装在一个 RpcResponse JSON object
      响应

      默认情况下,getProgramAccounts将返回一个具有以下结构的 JSON 对象数组:

      • pubkey: string - 账户公钥,以 base58 编码的字符串形式
      • account: object - 一个包含以下子字段的 JSON 对象:
        • lamports: number, 分配给账户的 lamports 数量
        • owner: string, 账户所分配的程序的 base58 编码的公钥
        • data: string | object - 与账户关联的数据,根据提供的编码参数,可以是编码的二进制数据或 JSON 格式 parameter
        • executable: boolean, 指示账户是否包含着程序
        • rentEpoch: number, 该账户下次需要支付租金的纪元(epoch)

      深入

      getProgramAccounts 是一个多功能的RPC方法,用于返回由程序拥有的所有账户。我们可以利用getProgramAccounts进行许多有用的查询,例如查找:

      • 特定钱包的所有代币账户
      • 特定代币发行的所有代币账户(即所有SRM持有人)
      • 特定程序的所有自定义账户(即所有Mango用户)

      尽管getProgramAccounts非常有用,但由于目前的限制,它经常被误解。许多由getProgramAccounts支持的查询需要RPC节点扫描大量数据。这些扫描需要大量的内存和资源。因此,调用过于频繁或范围过大可能导致连接超时。此外,在撰写本文时,getProgramAccounts端点不支持分页。如果查询结果太大,响应将被截断。

      为了解决当前的限制,getProgramAccounts提供了一些有用的参数,包括dataSlicefilters选项的memcmpdataSize。通过提供这些参数的组合,我们可以将查询范围缩小到可管理和可预测的大小。

      getProgramAccounts的一个常见示例涉及与SPL-Token Program 程序交互。仅使用基本调用请求由Token程序拥有的所有账户将涉及大量的数据。然而,通过提供参数,我们可以高效地请求我们要使用的数据。

      filters

      getProgramAccounts一起使用的最常见参数是filters数组。该数组接受两种类型的过滤器,即dataSizememcmp。在使用这些过滤器之前,我们应该熟悉我们请求的数据的布局和序列化方式。

      dataSize

      在Token程序的情况下,我们可以看到代币账户的长度为165个字节。 具体而言,一个代币账户有八个不同的字段,每个字段需要一定数量的字节。我们可以使用下面的示例图来可视化这些数据的布局。

      Account Size

      如果我们想找到由我们的钱包地址拥有的所有代币账户,我们可以在filters数组中添加{ dataSize: 165 }来将查询范围缩小为仅限长度为165个字节的账户。然而,仅此还不够。我们还需要添加一个过滤器来查找由我们的地址拥有的账户。我们可以使用memcmp过滤器实现这一点。

      memcmp

      memcmp过滤器,也叫"内存比较"过滤器,允许我们比较存储在账户上的任何字段的数据。具体而言,我们可以查询仅与特定位置上的特定一组字节匹配的账户。memcmp需要两个参数:

      • offset: 开始比较数据的位置。这个位置以字节为单位,表示为一个整数。
      • bytes: 数据应该与账户的数据匹配。这表示为一个base58编码的字符串,应该限制在129个字节以下。

      需要注意的是,memcmp只会返回与提供的bytes完全匹配的结果。目前,它不支持与提供的bytes相比小于或大于的比较。

      继续使用我们的Token程序示例,我们可以修改查询,只返回由我们的钱包地址拥有的代币账户。观察代币账户时,我们可以看到存储在代币账户上的前两个字段都是公钥,而且每个公钥的长度为32个字节。鉴于owner是第二个字段,我们应该从offset为32字节的位置开始进行memcmp。从这里开始,我们将寻找owner字段与我们的钱包地址匹配的账户。

      Account Size

      我们可以通过以下实例来调用此查询:

      use solana_client::{
      rpc_client::RpcClient,
      rpc_filter::{RpcFilterType, Memcmp, MemcmpEncodedBytes, MemcmpEncoding},
      rpc_config::{RpcProgramAccountsConfig, RpcAccountInfoConfig},
      };
      use solana_sdk::{commitment_config::CommitmentConfig, program_pack::Pack};
      use spl_token::{state::{Mint, Account}};
      use solana_account_decoder::{UiAccountEncoding};

      fn main() {
      const MY_WALLET_ADDRESS: &str = "FriELggez2Dy3phZeHHAdpcoEXkKQVkv6tx3zDtCVP8T";

      let rpc_url = String::from("http://api.devnet.solana.com");
      let connection = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());

      let filters = Some(vec![
      RpcFilterType::Memcmp(Memcmp {
      offset: 32,
      bytes: MemcmpEncodedBytes::Base58(MY_WALLET_ADDRESS.to_string()),
      encoding: Some(MemcmpEncoding::Binary),
      }),
      RpcFilterType::DataSize(165),
      ]);

      let accounts = connection.get_program_accounts_with_config(
      &spl_token::ID,
      RpcProgramAccountsConfig {
      filters,
      account_config: RpcAccountInfoConfig {
      encoding: Some(UiAccountEncoding::Base64),
      commitment: Some(connection.commitment()),
      ..RpcAccountInfoConfig::default()
      },
      ..RpcProgramAccountsConfig::default()
      },
      ).unwrap();

      println!("Found {:?} token account(s) for wallet {MY_WALLET_ADDRESS}: ", accounts.len());

      for (i, account) in accounts.iter().enumerate() {
      println!("-- Token Account Address {:?}: {:?} --", i, account.0);

      let mint_token_account = Account::unpack_from_slice(account.1.data.as_slice()).unwrap();
      println!("Mint: {:?}", mint_token_account.mint);

      let mint_account_data = connection.get_account_data(&mint_token_account.mint).unwrap();
      let mint = Mint::unpack_from_slice(mint_account_data.as_slice()).unwrap();
      println!("Amount: {:?}", mint_token_account.amount as f64 /10usize.pow(mint.decimals as u32) as f64);
      }
      }

      /*
      // Output

      Found 2 token account(s) for wallet FriELggez2Dy3phZeHHAdpcoEXkKQVkv6tx3zDtCVP8T:
      -- Token Account Address 0: H12yCcKLHFJFfohkeKiN8v3zgaLnUMwRcnJTyB4igAsy --
      Mint: CKKDsBT6KiT4GDKs3e39Ue9tDkhuGUKM3cC2a7pmV9YK
      Amount: 1.0
      -- Token Account Address 1: Et3bNDxe2wP1yE5ao6mMvUByQUHg8nZTndpJNvfKLdCb --
      Mint: BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf
      Amount: 3.0
      */

      dataSlice

      除了上面提到的两个过滤器参数以外,getProgramAccounts的第三个最常见参数是dataSlice。与filters参数不同,dataSlice不会减少查询返回的账户数量。dataSlice将限制的是每个账户的数据量。

      memcmp类似,dataSlice接受两个参数:

      • offset: 开始返回账户数据的位置(以字节为单位)
      • length: 应该返回的字节数

      在处理大型数据集但实际上不关心账户数据本身时,dataSlice特别有用。例如,如果我们想找到特定代币发行的代币账户数量(即代币持有者数量),就可以使用dataSlice

      use solana_client::{
      rpc_client::RpcClient,
      rpc_filter::{RpcFilterType, Memcmp, MemcmpEncodedBytes, MemcmpEncoding},
      rpc_config::{RpcProgramAccountsConfig, RpcAccountInfoConfig},
      };
      use solana_sdk::{commitment_config::CommitmentConfig};
      use solana_account_decoder::{UiAccountEncoding, UiDataSliceConfig};

      pub fn main() {
      const MY_TOKEN_MINT_ADDRESS: &str = "BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf";

      let rpc_url = String::from("http://api.devnet.solana.com");
      let connection = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());

      let filters = Some(vec![
      RpcFilterType::Memcmp(Memcmp {
      offset: 0, // number of bytes
      bytes: MemcmpEncodedBytes::Base58(MY_TOKEN_MINT_ADDRESS.to_string()),
      encoding: Some(MemcmpEncoding::Binary),
      }),
      RpcFilterType::DataSize(165), // number of bytes
      ]);

      let accounts = connection.get_program_accounts_with_config(
      &spl_token::ID,
      RpcProgramAccountsConfig {
      filters,
      account_config: RpcAccountInfoConfig {
      data_slice: Some(UiDataSliceConfig {
      offset: 0, // number of bytes
      length: 0, // number of bytes
      }),
      encoding: Some(UiAccountEncoding::Base64),
      commitment: Some(connection.commitment()),
      ..RpcAccountInfoConfig::default()
      },
      ..RpcProgramAccountsConfig::default()
      },
      ).unwrap();

      println!("Found {:?} token account(s) for mint {MY_TOKEN_MINT_ADDRESS}: ", accounts.len());
      println!("{:#?}", accounts);
      }

      /*
      // Output (notice the empty <Buffer > at acccount.data)

      Found 3 token account(s) for mint BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf:
      [
      (
      tofD3NzLfZ5pWG91JcnbfsAbfMcFF2SRRp3ChnjeTcL,
      Account {
      lamports: 2039280,
      data.len: 0,
      owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,
      executable: false,
      rent_epoch: 319,
      },
      ),
      (
      CMSC2GeWDsTPjfnhzCZHEqGRjKseBhrWaC2zNcfQQuGS,
      Account {
      lamports: 2039280,
      data.len: 0,
      owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,
      executable: false,
      rent_epoch: 318,
      },
      ),
      (
      Et3bNDxe2wP1yE5ao6mMvUByQUHg8nZTndpJNvfKLdCb,
      Account {
      lamports: 2039280,
      data.len: 0,
      owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,
      executable: false,
      rent_epoch: 318,
      },
      ),
      ]
      */

      通过组合这三个参数(dataSlicedataSizememcmp),我们可以限制查询的范围,并高效地返回我们想要的数据。

      其他资料

      - +

      获取程序帐户

      一个返回程序所拥有的账户的RPC方法。目前不支持分页。请求getProgramAccounts应该包括dataSlice和/或filters参数,以提高响应时间并返回只有预期结果的内容。

      info

      tip 参数

      • programId: string - 要查询的程序的公钥,以base58编码的字符串形式提供。
      • (可选) configOrCommitment: object - 包含以下可选字段的配置参数:
        • (可选) commitment: string - 状态承诺/State commitment
        • (可选) encoding: string - 账户数据的编码方式,可以是: base58, base64, 或 jsonParsed. 请注意 web3js 用户应改用 getParsedProgramAccounts
        • (可选) dataSlice: object - 根据以下内容限制返回的账户数据:
          • offset: number - 开始返回账户数据的字节数
          • length: number - 要返回的账户数据的字节数
        • (可选) filters: array - 使用以下过滤器对象对结果进行过滤:
          • memcmp: object - 将一系列字节与账户数据匹配:
          • offset: number - 开始比较的账户数据字节偏移量
          • bytes: string - 要匹配的数据,以base58编码的字符串形式,限制为129个字节
          • dataSize: number - 将账户数据的长度与提供的数据大小进行比较
        • (可选) withContext: boolean - 将结果包装在一个 RpcResponse JSON object
      响应

      默认情况下,getProgramAccounts将返回一个具有以下结构的 JSON 对象数组:

      • pubkey: string - 账户公钥,以 base58 编码的字符串形式
      • account: object - 一个包含以下子字段的 JSON 对象:
        • lamports: number, 分配给账户的 lamports 数量
        • owner: string, 账户所分配的程序的 base58 编码的公钥
        • data: string | object - 与账户关联的数据,根据提供的编码参数,可以是编码的二进制数据或 JSON 格式 parameter
        • executable: boolean, 指示账户是否包含着程序
        • rentEpoch: number, 该账户下次需要支付租金的纪元(epoch)

      深入

      getProgramAccounts 是一个多功能的RPC方法,用于返回由程序拥有的所有账户。我们可以利用getProgramAccounts进行许多有用的查询,例如查找:

      • 特定钱包的所有代币账户
      • 特定代币发行的所有代币账户(即所有SRM持有人)
      • 特定程序的所有自定义账户(即所有Mango用户)

      尽管getProgramAccounts非常有用,但由于目前的限制,它经常被误解。许多由getProgramAccounts支持的查询需要RPC节点扫描大量数据。这些扫描需要大量的内存和资源。因此,调用过于频繁或范围过大可能导致连接超时。此外,在撰写本文时,getProgramAccounts端点不支持分页。如果查询结果太大,响应将被截断。

      为了解决当前的限制,getProgramAccounts提供了一些有用的参数,包括dataSlicefilters选项的memcmpdataSize。通过提供这些参数的组合,我们可以将查询范围缩小到可管理和可预测的大小。

      getProgramAccounts的一个常见示例涉及与SPL-Token Program 程序交互。仅使用基本调用请求由Token程序拥有的所有账户将涉及大量的数据。然而,通过提供参数,我们可以高效地请求我们要使用的数据。

      filters

      getProgramAccounts一起使用的最常见参数是filters数组。该数组接受两种类型的过滤器,即dataSizememcmp。在使用这些过滤器之前,我们应该熟悉我们请求的数据的布局和序列化方式。

      dataSize

      在Token程序的情况下,我们可以看到代币账户的长度为165个字节。 具体而言,一个代币账户有八个不同的字段,每个字段需要一定数量的字节。我们可以使用下面的示例图来可视化这些数据的布局。

      Account Size

      如果我们想找到由我们的钱包地址拥有的所有代币账户,我们可以在filters数组中添加{ dataSize: 165 }来将查询范围缩小为仅限长度为165个字节的账户。然而,仅此还不够。我们还需要添加一个过滤器来查找由我们的地址拥有的账户。我们可以使用memcmp过滤器实现这一点。

      memcmp

      memcmp过滤器,也叫"内存比较"过滤器,允许我们比较存储在账户上的任何字段的数据。具体而言,我们可以查询仅与特定位置上的特定一组字节匹配的账户。memcmp需要两个参数:

      • offset: 开始比较数据的位置。这个位置以字节为单位,表示为一个整数。
      • bytes: 数据应该与账户的数据匹配。这表示为一个base58编码的字符串,应该限制在129个字节以下。

      需要注意的是,memcmp只会返回与提供的bytes完全匹配的结果。目前,它不支持与提供的bytes相比小于或大于的比较。

      继续使用我们的Token程序示例,我们可以修改查询,只返回由我们的钱包地址拥有的代币账户。观察代币账户时,我们可以看到存储在代币账户上的前两个字段都是公钥,而且每个公钥的长度为32个字节。鉴于owner是第二个字段,我们应该从offset为32字节的位置开始进行memcmp。从这里开始,我们将寻找owner字段与我们的钱包地址匹配的账户。

      Account Size

      我们可以通过以下实例来调用此查询:

      use solana_client::{
      rpc_client::RpcClient,
      rpc_filter::{RpcFilterType, Memcmp, MemcmpEncodedBytes, MemcmpEncoding},
      rpc_config::{RpcProgramAccountsConfig, RpcAccountInfoConfig},
      };
      use solana_sdk::{commitment_config::CommitmentConfig, program_pack::Pack};
      use spl_token::{state::{Mint, Account}};
      use solana_account_decoder::{UiAccountEncoding};

      fn main() {
      const MY_WALLET_ADDRESS: &str = "FriELggez2Dy3phZeHHAdpcoEXkKQVkv6tx3zDtCVP8T";

      let rpc_url = String::from("http://api.devnet.solana.com");
      let connection = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());

      let filters = Some(vec![
      RpcFilterType::Memcmp(Memcmp {
      offset: 32,
      bytes: MemcmpEncodedBytes::Base58(MY_WALLET_ADDRESS.to_string()),
      encoding: Some(MemcmpEncoding::Binary),
      }),
      RpcFilterType::DataSize(165),
      ]);

      let accounts = connection.get_program_accounts_with_config(
      &spl_token::ID,
      RpcProgramAccountsConfig {
      filters,
      account_config: RpcAccountInfoConfig {
      encoding: Some(UiAccountEncoding::Base64),
      commitment: Some(connection.commitment()),
      ..RpcAccountInfoConfig::default()
      },
      ..RpcProgramAccountsConfig::default()
      },
      ).unwrap();

      println!("Found {:?} token account(s) for wallet {MY_WALLET_ADDRESS}: ", accounts.len());

      for (i, account) in accounts.iter().enumerate() {
      println!("-- Token Account Address {:?}: {:?} --", i, account.0);

      let mint_token_account = Account::unpack_from_slice(account.1.data.as_slice()).unwrap();
      println!("Mint: {:?}", mint_token_account.mint);

      let mint_account_data = connection.get_account_data(&mint_token_account.mint).unwrap();
      let mint = Mint::unpack_from_slice(mint_account_data.as_slice()).unwrap();
      println!("Amount: {:?}", mint_token_account.amount as f64 /10usize.pow(mint.decimals as u32) as f64);
      }
      }

      /*
      // Output

      Found 2 token account(s) for wallet FriELggez2Dy3phZeHHAdpcoEXkKQVkv6tx3zDtCVP8T:
      -- Token Account Address 0: H12yCcKLHFJFfohkeKiN8v3zgaLnUMwRcnJTyB4igAsy --
      Mint: CKKDsBT6KiT4GDKs3e39Ue9tDkhuGUKM3cC2a7pmV9YK
      Amount: 1.0
      -- Token Account Address 1: Et3bNDxe2wP1yE5ao6mMvUByQUHg8nZTndpJNvfKLdCb --
      Mint: BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf
      Amount: 3.0
      */

      dataSlice

      除了上面提到的两个过滤器参数以外,getProgramAccounts的第三个最常见参数是dataSlice。与filters参数不同,dataSlice不会减少查询返回的账户数量。dataSlice将限制的是每个账户的数据量。

      memcmp类似,dataSlice接受两个参数:

      • offset: 开始返回账户数据的位置(以字节为单位)
      • length: 应该返回的字节数

      在处理大型数据集但实际上不关心账户数据本身时,dataSlice特别有用。例如,如果我们想找到特定代币发行的代币账户数量(即代币持有者数量),就可以使用dataSlice

      use solana_client::{
      rpc_client::RpcClient,
      rpc_filter::{RpcFilterType, Memcmp, MemcmpEncodedBytes, MemcmpEncoding},
      rpc_config::{RpcProgramAccountsConfig, RpcAccountInfoConfig},
      };
      use solana_sdk::{commitment_config::CommitmentConfig};
      use solana_account_decoder::{UiAccountEncoding, UiDataSliceConfig};

      pub fn main() {
      const MY_TOKEN_MINT_ADDRESS: &str = "BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf";

      let rpc_url = String::from("http://api.devnet.solana.com");
      let connection = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());

      let filters = Some(vec![
      RpcFilterType::Memcmp(Memcmp {
      offset: 0, // number of bytes
      bytes: MemcmpEncodedBytes::Base58(MY_TOKEN_MINT_ADDRESS.to_string()),
      encoding: Some(MemcmpEncoding::Binary),
      }),
      RpcFilterType::DataSize(165), // number of bytes
      ]);

      let accounts = connection.get_program_accounts_with_config(
      &spl_token::ID,
      RpcProgramAccountsConfig {
      filters,
      account_config: RpcAccountInfoConfig {
      data_slice: Some(UiDataSliceConfig {
      offset: 0, // number of bytes
      length: 0, // number of bytes
      }),
      encoding: Some(UiAccountEncoding::Base64),
      commitment: Some(connection.commitment()),
      ..RpcAccountInfoConfig::default()
      },
      ..RpcProgramAccountsConfig::default()
      },
      ).unwrap();

      println!("Found {:?} token account(s) for mint {MY_TOKEN_MINT_ADDRESS}: ", accounts.len());
      println!("{:#?}", accounts);
      }

      /*
      // Output (notice the empty <Buffer > at acccount.data)

      Found 3 token account(s) for mint BUGuuhPsHpk8YZrL2GctsCtXGneL1gmT5zYb7eMHZDWf:
      [
      (
      tofD3NzLfZ5pWG91JcnbfsAbfMcFF2SRRp3ChnjeTcL,
      Account {
      lamports: 2039280,
      data.len: 0,
      owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,
      executable: false,
      rent_epoch: 319,
      },
      ),
      (
      CMSC2GeWDsTPjfnhzCZHEqGRjKseBhrWaC2zNcfQQuGS,
      Account {
      lamports: 2039280,
      data.len: 0,
      owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,
      executable: false,
      rent_epoch: 318,
      },
      ),
      (
      Et3bNDxe2wP1yE5ao6mMvUByQUHg8nZTndpJNvfKLdCb,
      Account {
      lamports: 2039280,
      data.len: 0,
      owner: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA,
      executable: false,
      rent_epoch: 318,
      },
      ),
      ]
      */

      通过组合这三个参数(dataSlicedataSizememcmp),我们可以限制查询的范围,并高效地返回我们想要的数据。

      其他资料

      + \ No newline at end of file diff --git a/cookbook-zh/guides/index.html b/cookbook-zh/guides/index.html index 3f054036e..e98b1495f 100644 --- a/cookbook-zh/guides/index.html +++ b/cookbook-zh/guides/index.html @@ -5,13 +5,13 @@ 指南 | All in One Solana - + - + + \ No newline at end of file diff --git a/cookbook-zh/guides/retrying-transactions/index.html b/cookbook-zh/guides/retrying-transactions/index.html index e4ac07f2d..fce6b7196 100644 --- a/cookbook-zh/guides/retrying-transactions/index.html +++ b/cookbook-zh/guides/retrying-transactions/index.html @@ -5,13 +5,13 @@ 重试交易 | All in One Solana - +
      -

      重试交易

      在某些情况下,一个看似有效的交易可能在输入区块之前会被丢弃。这种情况最常发生在网络拥堵期间,当一个RPC节点无法将交易重新广播给区块链的领导节点时。对于最终用户来说,他们的交易可能会完全消失。虽然RPC节点配备了通用的重新广播算法,但应用程序开发人员也可以开发自己的自定义重新广播逻辑。

      info

      tip 事实表

      • RPC节点将尝试使用通用算法重新广播交易
      • 应用程序开发人员可以实现自定义的重新广播逻辑
      • 开发人员应该利用sendTransaction JSON-RPC方法中的maxRetries参数
      • 开发人员应该启用预检查,以便在提交交易之前引发错误
      • 在重新签署任何交易之前,非常重要的是确保初始交易的块哈希已过期

      交易的旅程

      客户端如何提交交易

      在Solana中,没有内存池(mempool)的概念。无论是通过编程还是由最终用户发起,所有的交易都会被高效地路由到领导节点,以便将它们处理成区块。有两种主要的方式可以将交易发送给领导节点:

      1. 通过RPC服务器和sendTransaction JSON-RPC 方法进行代理发送
      2. 通过TPU客户 端直接发送给领导节点

      绝大多数最终用户将通过RPC服务器提交交易。当客户端提交交易时,接收的RPC节点会尝试将交易广播给当前和下一个领导节点。在交易被领导节点处理之前,除了客户端和中继的RPC节点知道的内容外,没有关于交易的记录。在TPU客户端的情况下,重新广播和领导节点的转发完全由客户端软件处理。

      Transaction Journey

      RPC节点如何广播交易

      当RPC节点通过sendTransaction接收到一个交易后,它会将交易转换为UDP 数据包,然后将其转发给相关的领导。UDP允许验证节点之间快速通信,但不提供关于交易传递的任何保证。

      因为Solana的领导节点调度在每个纪元 (大约2天)之前就已知,所以RPC节点会直接将其交易广播给当前和下一个领导节点。这与其他流言协议(如以太坊)随机广播和广泛传播整个网络的交易的方式形成对比。默认情况下,RPC节点会每两秒尝试将交易转发给领导节点,直到交易被确认或交易的块哈希过期(在本文撰写时为150个区块或约1分钟19秒)。如果待重新广播的队列大小超过10,000 transactions 个交易,则新提交的交易将被丢弃。RPC运营商可以调整命令行参数 以更改此重试逻辑的默认行为。

      当RPC节点广播一个交易时,它会尝试将交易转发给领导节点的交易处理单元(TPU)。TPU将交易处理分为五个不同的阶段:

      TPU Overview

      Image Courtesy of Jito Labs

      在这五个阶段中,Fetch阶段负责接收交易。在Fetch阶段中,验证节点会根据三个端口对传入的交易进行分类:

      • tpu 处理常规交易,例如代币转账、NFT铸造和程序指令。
      • tpu_vote 专门处理投票交易。
      • tpu_forwards 将未处理的数据包转发给下一个领导节点,如果当前领导无法处理所有交易。

      如需了解更多关于TPU的信息,请参考Jito Labs出色的文章.

      交易如何被丢弃

      在交易的整个过程中,有几种情况下交易可能意外从网络中丢失。

      在交易被处理之前

      如果网络丢弃一个交易,通常是在交易被领导处理之前发生。UDP 数据包丢失 是可能发生这种情况的最简单原因。在网络负载高峰期,验证节点可能会被大量需要处理的交易压倒。虽然验证节点可以通过 tpu_forwards,端口转发多余的交易,但转发. 的数据量是有限的。此外,每个转发仅限于验证节点之间的单一跳跃。也就是说,通过tpu_forwards端口接收的交易不会被转发给其他验证节点。

      还有两个较少为人知的原因,可能导致交易在被处理之前被丢弃。第一种情况涉及通过RPC池提交的交易。偶尔,RPC池的一部分可能会领先于其他部分。当池中的节点需要共同工作时,这可能会导致问题。在这个例子中,交易的recentBlockhash 从池中的先进部分(后端A)查询。当交易提交到滞后的池中(后端B)时,节点将无法识别先进的块哈希并丢弃交易。如果开发人员在sendTransaction中启用了preflight checks, 可以在提交交易时检测到此问题。

      Dropped via RPC Pool

      网络分叉也可能暂时的导致交易丢失。如果验证在银行阶段重新播放其块的速度较慢,可能会创建一个少数派分叉。当客户端构建一个交易时,交易可能引用仅存在于少数派分叉上的recentBlockhash。在提交交易后,集群可能在交易被处理之前切换到其他分叉。在这种情况下,由于找不到块哈希,交易被丢弃。

      Dropped due to Minority Fork (Before Processed)

      在交易被处理后,但尚未最终确认之前

      如果一个交易引用了来自少数派分叉的recentBlockhash,该交易有可能还会进行处理。在这种情况下,交易将由少数派分叉上的领导节点进行处理。当这个领导试图与不认可少数派分叉的大多数验证节点达成共识时,它将无法与它们分享已处理的交易。在这种情况下,交易在最终确定之前将被丢弃。

      Dropped due to Minority Fork (After Processed)

      处理被丢弃的交易

      虽然RPC节点会尝试重新广播交易,但它们使用的算法是通用的,往往不适合特定应用的需求。为了应对网络拥堵的时候,应用程序开发人员应该自定义自己的重新广播逻辑。

      深入了解sendTransaction

      在提交交易方面,sendTransaction RPC方法是开发者可用的主要工具。sendTransaction仅负责将交易从客户端传递到RPC节点。如果节点接收到交易,sendTransaction将返回用于跟踪交易的交易ID。成功的响应并不表示该交易将由集群处理或最终确定。

      info

      Tips

      请求参数

      • transaction: string - 完全签名的交易,以编码字符串形式表示
      • (可选) configuration object: object
      • skipPreflight: boolean - 如果为 true,则跳过预检事务检查(默认为 false)
      • (可选) preflightCommitment: string - 用于针对银行插槽进行预检模拟的承诺 级别(默认为"finalized")
      • (可选) encoding: string - 用于交易数据的编码方式。可以选择 "base58"(较慢)或 "base64"(默认为 "base58")
      • (可选) maxRetries: usize - RPC节点重试将交易发送给领导者的最大次数。如果未提供此参数,RPC节点将重试交易,直到交易最终确定或块哈希过期为止

      响应

      • transaction id: string - 第一个嵌入在交易中的交易签名,以base-58编码的字符串形式表示。可以使用该交易ID与 getSignatureStatuses 一起使用,以轮询获取状态更新。

      自定义重播逻辑

      为了开发自己的重新广播逻辑,开发者应该利用sendTransactionmaxRetries参数。如果提供了maxRetries,它将覆盖RPC节点的默认重试逻辑,允许开发人员在合理范围内 手动控制重试过程。

      手动重试交易的常见模式涉及临时存储来自getLatestBlockhashlastValidBlockHeight。一旦存储了该值,应用程序可以轮询集群的blockheight, 并在适当的时间间隔内手动重试交易。在网络拥堵的时期,将maxRetries设置为0并通过自定义算法手动重新广播是有优势的。一些应用程序可能采用指数退避, 而其他应用程序(如Mango )选择在恒定间隔内持续重新提交 交易,直到发生超时。

      while (blockheight < lastValidBlockHeight) {
      connection.sendRawTransaction(rawTransaction, {
      skipPreflight: true,
      });
      await sleep(500);
      blockheight = await connection.getBlockHeight();
      }

      当通过getLatestBlockhash进行轮询时,应用程序应该指定其预期的承诺 级别。通过将承诺级别设置为confirmed(已投票)或finalized(在confirmed之后约30个块),应用程序可以避免从少数派分叉轮询块哈希。

      如果应用程序可以访问负载均衡器后面的RPC节点,还可以选择将其工作负载分配给特定节点。为数据密集型请求提供服务的RPC节点(例如getProgramAccounts)可能会滞后,并且可能不适合转发交易。对于处理时间敏感交易的应用程序,最好拥有专用节点仅处理sendTransaction操作。

      跳过预检的后果

      默认情况下,sendTransaction将在提交交易之前执行三个预检查。具体而言,sendTransaction将会:

      • 验证所有签名是否有效
      • 检查引用的块哈希是否在最近的150个块内
      • 针对预检查的preFlightCommitment,模拟交易与银行槽位之间的交互

      如果其中任何一个预检查失败,sendTransaction将在提交交易之前引发错误。预检查常常能够防止交易丢失,并使客户端能够优雅地处理错误。为了确保这些常见错误得到考虑,建议开发人员将skipPreflight设置为false。

      何时重新签署交易

      尽管尽力进行重新广播,但有时客户端可能需要重新签署交易。在重新签署任何交易之前,非常重要的是确保初始交易的块哈希已经过期。如果初始块哈希仍然有效,那么两个交易都有可能被网络接受。对于最终用户来说,这将看起来好像他们无意中发送了相同的交易两次。

      在Solana中,一旦所引用的块哈希早于从getLatestBlockhash接收到的lastValidBlockHeight,可以安全地丢弃已丢弃的交易。开发者应该通过查询 getEpochInfo 并将其与响应中的blockHeight进行比较来跟踪lastValidBlockHeight。一旦一个块哈希无效,客户端可以使用新查询的块哈希重新签署。

      致谢

      非常感谢 Trent Nelson、Jacob Creech, White Tiger、Le Yafo、Buffalu, 和 Jito Labs 的审查和反馈。

      - +

      重试交易

      在某些情况下,一个看似有效的交易可能在输入区块之前会被丢弃。这种情况最常发生在网络拥堵期间,当一个RPC节点无法将交易重新广播给区块链的领导节点时。对于最终用户来说,他们的交易可能会完全消失。虽然RPC节点配备了通用的重新广播算法,但应用程序开发人员也可以开发自己的自定义重新广播逻辑。

      info

      tip 事实表

      • RPC节点将尝试使用通用算法重新广播交易
      • 应用程序开发人员可以实现自定义的重新广播逻辑
      • 开发人员应该利用sendTransaction JSON-RPC方法中的maxRetries参数
      • 开发人员应该启用预检查,以便在提交交易之前引发错误
      • 在重新签署任何交易之前,非常重要的是确保初始交易的块哈希已过期

      交易的旅程

      客户端如何提交交易

      在Solana中,没有内存池(mempool)的概念。无论是通过编程还是由最终用户发起,所有的交易都会被高效地路由到领导节点,以便将它们处理成区块。有两种主要的方式可以将交易发送给领导节点:

      1. 通过RPC服务器和sendTransaction JSON-RPC 方法进行代理发送
      2. 通过TPU客户 端直接发送给领导节点

      绝大多数最终用户将通过RPC服务器提交交易。当客户端提交交易时,接收的RPC节点会尝试将交易广播给当前和下一个领导节点。在交易被领导节点处理之前,除了客户端和中继的RPC节点知道的内容外,没有关于交易的记录。在TPU客户端的情况下,重新广播和领导节点的转发完全由客户端软件处理。

      Transaction Journey

      RPC节点如何广播交易

      当RPC节点通过sendTransaction接收到一个交易后,它会将交易转换为UDP 数据包,然后将其转发给相关的领导。UDP允许验证节点之间快速通信,但不提供关于交易传递的任何保证。

      因为Solana的领导节点调度在每个纪元 (大约2天)之前就已知,所以RPC节点会直接将其交易广播给当前和下一个领导节点。这与其他流言协议(如以太坊)随机广播和广泛传播整个网络的交易的方式形成对比。默认情况下,RPC节点会每两秒尝试将交易转发给领导节点,直到交易被确认或交易的块哈希过期(在本文撰写时为150个区块或约1分钟19秒)。如果待重新广播的队列大小超过10,000 transactions 个交易,则新提交的交易将被丢弃。RPC运营商可以调整命令行参数 以更改此重试逻辑的默认行为。

      当RPC节点广播一个交易时,它会尝试将交易转发给领导节点的交易处理单元(TPU)。TPU将交易处理分为五个不同的阶段:

      TPU Overview

      Image Courtesy of Jito Labs

      在这五个阶段中,Fetch阶段负责接收交易。在Fetch阶段中,验证节点会根据三个端口对传入的交易进行分类:

      • tpu 处理常规交易,例如代币转账、NFT铸造和程序指令。
      • tpu_vote 专门处理投票交易。
      • tpu_forwards 将未处理的数据包转发给下一个领导节点,如果当前领导无法处理所有交易。

      如需了解更多关于TPU的信息,请参考Jito Labs出色的文章.

      交易如何被丢弃

      在交易的整个过程中,有几种情况下交易可能意外从网络中丢失。

      在交易被处理之前

      如果网络丢弃一个交易,通常是在交易被领导处理之前发生。UDP 数据包丢失 是可能发生这种情况的最简单原因。在网络负载高峰期,验证节点可能会被大量需要处理的交易压倒。虽然验证节点可以通过 tpu_forwards,端口转发多余的交易,但转发. 的数据量是有限的。此外,每个转发仅限于验证节点之间的单一跳跃。也就是说,通过tpu_forwards端口接收的交易不会被转发给其他验证节点。

      还有两个较少为人知的原因,可能导致交易在被处理之前被丢弃。第一种情况涉及通过RPC池提交的交易。偶尔,RPC池的一部分可能会领先于其他部分。当池中的节点需要共同工作时,这可能会导致问题。在这个例子中,交易的recentBlockhash 从池中的先进部分(后端A)查询。当交易提交到滞后的池中(后端B)时,节点将无法识别先进的块哈希并丢弃交易。如果开发人员在sendTransaction中启用了preflight checks, 可以在提交交易时检测到此问题。

      Dropped via RPC Pool

      网络分叉也可能暂时的导致交易丢失。如果验证在银行阶段重新播放其块的速度较慢,可能会创建一个少数派分叉。当客户端构建一个交易时,交易可能引用仅存在于少数派分叉上的recentBlockhash。在提交交易后,集群可能在交易被处理之前切换到其他分叉。在这种情况下,由于找不到块哈希,交易被丢弃。

      Dropped due to Minority Fork (Before Processed)

      在交易被处理后,但尚未最终确认之前

      如果一个交易引用了来自少数派分叉的recentBlockhash,该交易有可能还会进行处理。在这种情况下,交易将由少数派分叉上的领导节点进行处理。当这个领导试图与不认可少数派分叉的大多数验证节点达成共识时,它将无法与它们分享已处理的交易。在这种情况下,交易在最终确定之前将被丢弃。

      Dropped due to Minority Fork (After Processed)

      处理被丢弃的交易

      虽然RPC节点会尝试重新广播交易,但它们使用的算法是通用的,往往不适合特定应用的需求。为了应对网络拥堵的时候,应用程序开发人员应该自定义自己的重新广播逻辑。

      深入了解sendTransaction

      在提交交易方面,sendTransaction RPC方法是开发者可用的主要工具。sendTransaction仅负责将交易从客户端传递到RPC节点。如果节点接收到交易,sendTransaction将返回用于跟踪交易的交易ID。成功的响应并不表示该交易将由集群处理或最终确定。

      info

      Tips

      请求参数

      • transaction: string - 完全签名的交易,以编码字符串形式表示
      • (可选) configuration object: object
      • skipPreflight: boolean - 如果为 true,则跳过预检事务检查(默认为 false)
      • (可选) preflightCommitment: string - 用于针对银行插槽进行预检模拟的承诺 级别(默认为"finalized")
      • (可选) encoding: string - 用于交易数据的编码方式。可以选择 "base58"(较慢)或 "base64"(默认为 "base58")
      • (可选) maxRetries: usize - RPC节点重试将交易发送给领导者的最大次数。如果未提供此参数,RPC节点将重试交易,直到交易最终确定或块哈希过期为止

      响应

      • transaction id: string - 第一个嵌入在交易中的交易签名,以base-58编码的字符串形式表示。可以使用该交易ID与 getSignatureStatuses 一起使用,以轮询获取状态更新。

      自定义重播逻辑

      为了开发自己的重新广播逻辑,开发者应该利用sendTransactionmaxRetries参数。如果提供了maxRetries,它将覆盖RPC节点的默认重试逻辑,允许开发人员在合理范围内 手动控制重试过程。

      手动重试交易的常见模式涉及临时存储来自getLatestBlockhashlastValidBlockHeight。一旦存储了该值,应用程序可以轮询集群的blockheight, 并在适当的时间间隔内手动重试交易。在网络拥堵的时期,将maxRetries设置为0并通过自定义算法手动重新广播是有优势的。一些应用程序可能采用指数退避, 而其他应用程序(如Mango )选择在恒定间隔内持续重新提交 交易,直到发生超时。

      while (blockheight < lastValidBlockHeight) {
      connection.sendRawTransaction(rawTransaction, {
      skipPreflight: true,
      });
      await sleep(500);
      blockheight = await connection.getBlockHeight();
      }

      当通过getLatestBlockhash进行轮询时,应用程序应该指定其预期的承诺 级别。通过将承诺级别设置为confirmed(已投票)或finalized(在confirmed之后约30个块),应用程序可以避免从少数派分叉轮询块哈希。

      如果应用程序可以访问负载均衡器后面的RPC节点,还可以选择将其工作负载分配给特定节点。为数据密集型请求提供服务的RPC节点(例如getProgramAccounts)可能会滞后,并且可能不适合转发交易。对于处理时间敏感交易的应用程序,最好拥有专用节点仅处理sendTransaction操作。

      跳过预检的后果

      默认情况下,sendTransaction将在提交交易之前执行三个预检查。具体而言,sendTransaction将会:

      • 验证所有签名是否有效
      • 检查引用的块哈希是否在最近的150个块内
      • 针对预检查的preFlightCommitment,模拟交易与银行槽位之间的交互

      如果其中任何一个预检查失败,sendTransaction将在提交交易之前引发错误。预检查常常能够防止交易丢失,并使客户端能够优雅地处理错误。为了确保这些常见错误得到考虑,建议开发人员将skipPreflight设置为false。

      何时重新签署交易

      尽管尽力进行重新广播,但有时客户端可能需要重新签署交易。在重新签署任何交易之前,非常重要的是确保初始交易的块哈希已经过期。如果初始块哈希仍然有效,那么两个交易都有可能被网络接受。对于最终用户来说,这将看起来好像他们无意中发送了相同的交易两次。

      在Solana中,一旦所引用的块哈希早于从getLatestBlockhash接收到的lastValidBlockHeight,可以安全地丢弃已丢弃的交易。开发者应该通过查询 getEpochInfo 并将其与响应中的blockHeight进行比较来跟踪lastValidBlockHeight。一旦一个块哈希无效,客户端可以使用新查询的块哈希重新签署。

      致谢

      非常感谢 Trent Nelson、Jacob Creech, White Tiger、Le Yafo、Buffalu, 和 Jito Labs 的审查和反馈。

      + \ No newline at end of file diff --git a/cookbook-zh/guides/serialization/index.html b/cookbook-zh/guides/serialization/index.html index fdebd0af8..279823922 100644 --- a/cookbook-zh/guides/serialization/index.html +++ b/cookbook-zh/guides/serialization/index.html @@ -5,13 +5,13 @@ 序列数据 | All in One Solana - +
      -

      序列数据

      当我们谈论序列化时,我们指的是数据的序列化和反序列化。

      序列化在Solana程序和程序账户的生命周期中的几个点上起着作用:

      1. 将指令数据序列化到客户端上
      2. 在程序中反序列化指令数据
      3. 将账户数据序列化到程序中
      4. 在客户端上反序列化账户数据

      重要的是,上述操作都应该采用相同的序列化方法。下面的示例演示了使用Borsh进行序列化。

      本文档的其余部分中的示例摘录自Solana CLI 程序模板

      设置Borsh序列化

      为了使用Borsh进行序列化,需要在Rust程序、Rust客户端、节点和/或Python客户端中设置Borsh库。

      [package]
      name = "solana-cli-template-program-bpf"
      version = "0.1.0"
      edition = "2018"
      license = "WTFPL"

      # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

      [features]
      no-entrypoint = []

      [dependencies]
      borsh = "0.9.0"
      lazy_static = "1.4.0"
      num-derive = "0.3"
      num_enum = "0.5.1"
      num-integer = "0.1.44"
      num-traits = "0.2"
      sol-template-shared = {path = "../shared"}
      solana-program = "1.8.2"
      thiserror = "1.0"

      [dev-dependencies]
      solana-program-test = "1.8.2"
      solana-sdk = "1.8.2"

      [lib]
      crate-type = ["cdylib", "lib"]

      如何序列化客户端上的指令数据

      如果你要将出站指令数据序列化并发送给程序,它必须与程序反序列化入站指令数据的方式保持一致。

      在此模板中,指令数据块是一个包含序列化数组的数据块,例如:

      Instruction (Variant index)Serialized KeySerialized Value
      Initialize (0)not applicable for instructionnot applicable for instruction
      Mint (1)"foo""bar"
      Transfer (2)"foo"not applicable for instruction
      Burn (2)"foo"not applicable for instruction

      在下面的示例中,我们假设程序拥有的账户已经初始化完成。

      // Include borsh functionality

      import { serialize, deserialize, deserializeUnchecked } from "borsh";
      import { Buffer } from "buffer";

      // Get Solana
      import {
      Keypair,
      Connection,
      PublicKey,
      Transaction,
      TransactionInstruction,
      sendAndConfirmTransaction,
      } from "@solana/web3.js";

      // Flexible class that takes properties and imbues them
      // to the object instance
      class Assignable {
      constructor(properties) {
      Object.keys(properties).map((key) => {
      return (this[key] = properties[key]);
      });
      }
      }

      // Our instruction payload vocabulary
      class Payload extends Assignable {}

      // Borsh needs a schema describing the payload
      const payloadSchema = new Map([
      [
      Payload,
      {
      kind: "struct",
      fields: [
      ["id", "u8"],
      ["key", "string"],
      ["value", "string"],
      ],
      },
      ],
      ]);

      // Instruction variant indexes
      enum InstructionVariant {
      InitializeAccount = 0,
      MintKeypair,
      TransferKeypair,
      BurnKeypair,
      }

      /**
      * Mint a key value pair to account
      * @param {Connection} connection - Solana RPC connection
      * @param {PublicKey} progId - Sample Program public key
      * @param {PublicKey} account - Target program owned account for Mint
      * @param {Keypair} wallet - Wallet for signing and payment
      * @param {string} mintKey - The key being minted key
      * @param {string} mintValue - The value being minted
      * @return {Promise<Keypair>} - Keypair
      */

      export async function mintKV(
      connection: Connection,
      progId: PublicKey,
      account: PublicKey,
      wallet: Keypair,
      mintKey: string,
      mintValue: string
      ): Promise<string> {
      // Construct the payload
      const mint = new Payload({
      id: InstructionVariant.MintKeypair,
      key: mintKey, // 'ts key'
      value: mintValue, // 'ts first value'
      });

      // Serialize the payload
      const mintSerBuf = Buffer.from(serialize(payloadSchema, mint));
      // console.log(mintSerBuf)
      // => <Buffer 01 06 00 00 00 74 73 20 6b 65 79 0e 00 00 00 74 73 20 66 69 72 73 74 20 76 61 6c 75 65>
      // let mintPayloadCopy = deserialize(schema, Payload, mintSerBuf)
      // console.log(mintPayloadCopy)
      // => Payload { id: 1, key: 'ts key', value: 'ts first value' }

      // Create Solana Instruction
      const instruction = new TransactionInstruction({
      data: mintSerBuf,
      keys: [
      { pubkey: account, isSigner: false, isWritable: true },
      { pubkey: wallet.publicKey, isSigner: false, isWritable: false },
      ],
      programId: progId,
      });

      // Send Solana Transaction
      const transactionSignature = await sendAndConfirmTransaction(
      connection,
      new Transaction().add(instruction),
      [wallet],
      {
      commitment: "singleGossip",
      preflightCommitment: "singleGossip",
      }
      );
      console.log("Signature = ", transactionSignature);
      return transactionSignature;
      }

      如何在程序中反序列化指令数据

      Deserialize Instruction Data

      //! instruction Contains the main ProgramInstruction enum

      use {
      crate::error::SampleError, borsh::BorshDeserialize, solana_program::program_error::ProgramError,
      };

      #[derive(Debug, PartialEq)]
      /// All custom program instructions
      pub enum ProgramInstruction {
      InitializeAccount,
      MintToAccount { key: String, value: String },
      TransferBetweenAccounts { key: String },
      BurnFromAccount { key: String },
      MintToAccountWithFee { key: String, value: String },
      TransferBetweenAccountsWithFee { key: String },
      BurnFromAccountWithFee { key: String },
      }

      /// Generic Payload Deserialization
      #[derive(BorshDeserialize, Debug)]
      struct Payload {
      variant: u8,
      arg1: String,
      arg2: String,
      }

      impl ProgramInstruction {
      /// Unpack inbound buffer to associated Instruction
      /// The expected format for input is a Borsh serialized vector
      pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
      let payload = Payload::try_from_slice(input).unwrap();
      match payload.variant {
      0 => Ok(ProgramInstruction::InitializeAccount),
      1 => Ok(Self::MintToAccount {
      key: payload.arg1,
      value: payload.arg2,
      }),
      2 => Ok(Self::TransferBetweenAccounts { key: payload.arg1 }),
      3 => Ok(Self::BurnFromAccount { key: payload.arg1 }),
      4 => Ok(Self::MintToAccountWithFee {
      key: payload.arg1,
      value: payload.arg2,
      }),
      5 => Ok(Self::TransferBetweenAccountsWithFee { key: payload.arg1 }),
      6 => Ok(Self::BurnFromAccountWithFee { key: payload.arg1 }),
      _ => Err(SampleError::DeserializationFailure.into()),
      }
      }
      }

      如何在程序中序列化账户数据

      Account Data Serialization

      程序账户数据块(来自示例仓库)的布局如下:

      Byte 0Bytes 1-4Remaining Byte up to 1019
      Initialized flaglength of serialized BTreeMapBTreeMap (where key value pairs are stored)

      Pack

      关于 Pack trait

      可以更容易地隐藏账户数据序列化/反序列化的细节,使你的核心程序指令处理代码更简洁。因此,不需要将所有的序列化/反序列化逻辑放在程序处理代码中,而是将这些细节封装在以下三个函数中:

      1. unpack_unchecked - 允许你对账户进行反序列化,而无需检查它是否已被初始化。当实际处理初始化函数(变体索引为0)时,这非常有用。
      2. unpack - 调用你的Pack实现的unpack_from_slice函数,并检查账户是否已被初始化。
      3. pack - 调用您的Pack实现的pack_into_slice函数。

      下面是我们示例程序的Pack trait实现。随后是使用Borsh进行账户数据处理的示例。

      //! @brief account_state manages account data

      use crate::error::SampleError;
      use sol_template_shared::ACCOUNT_STATE_SPACE;
      use solana_program::{
      entrypoint::ProgramResult,
      program_error::ProgramError,
      program_pack::{IsInitialized, Pack, Sealed},
      };
      use std::collections::BTreeMap;

      /// Maintains global accumulator
      #[derive(Debug, Default, PartialEq)]
      pub struct ProgramAccountState {
      is_initialized: bool,
      btree_storage: BTreeMap<String, String>,
      }

      impl ProgramAccountState {
      /// Returns indicator if this account has been initialized
      pub fn set_initialized(&mut self) {
      self.is_initialized = true;
      }
      /// Adds a new key/value pair to the account
      pub fn add(&mut self, key: String, value: String) -> ProgramResult {
      match self.btree_storage.contains_key(&key) {
      true => Err(SampleError::KeyAlreadyExists.into()),
      false => {
      self.btree_storage.insert(key, value);
      Ok(())
      }
      }
      }
      /// Removes a key from account and returns the keys value
      pub fn remove(&mut self, key: &str) -> Result<String, SampleError> {
      match self.btree_storage.contains_key(key) {
      true => Ok(self.btree_storage.remove(key).unwrap()),
      false => Err(SampleError::KeyNotFoundInAccount),
      }
      }
      }

      impl Sealed for ProgramAccountState {}

      // Pack expects the implementation to satisfy whether the
      // account is initialzed.
      impl IsInitialized for ProgramAccountState {
      fn is_initialized(&self) -> bool {
      self.is_initialized
      }
      }

      impl Pack for ProgramAccountState {
      const LEN: usize = ACCOUNT_STATE_SPACE;

      /// Store 'state' of account to its data area
      fn pack_into_slice(&self, dst: &mut [u8]) {
      sol_template_shared::pack_into_slice(self.is_initialized, &self.btree_storage, dst);
      }

      /// Retrieve 'state' of account from account data area
      fn unpack_from_slice(src: &[u8]) -> Result<Self, ProgramError> {
      match sol_template_shared::unpack_from_slice(src) {
      Ok((is_initialized, btree_map)) => Ok(ProgramAccountState {
      is_initialized,
      btree_storage: btree_map,
      }),
      Err(_) => Err(ProgramError::InvalidAccountData),
      }
      }
      }

      序列化/反序列化

      为了完成底层的序列化和反序列化:

      1. sol_template_shared::pack_into_slice - 进行序列化的地方
      2. sol_template_shared::unpack_from_slice - 进行反序列化的地方

      请关注 在下面的示例中,我们在BTREE_LENGTH的数据布局中的BTREE_STORAGE之前有一个u32(4字节)的分区。这是因为在反序列化过程中,borsh会检查您正在反序列化的切片的长度是否与它实际读取的数据量一致,然后才进行对象的重组。下面演示的方法首先读取BTREE_LENGTH,以获取要从BTREE_STORAGE指针中slice的大小。

      use {
      arrayref::*,
      borsh::{BorshDeserialize, BorshSerialize},
      solana_program::program_memory::sol_memcpy,
      std::{collections::BTreeMap, error::Error},
      };

      /// Initialization flag size for account state
      pub const INITIALIZED_BYTES: usize = 1;
      /// Storage for the serialized size of the BTreeMap control
      pub const BTREE_LENGTH: usize = 4;
      /// Storage for the serialized BTreeMap container
      pub const BTREE_STORAGE: usize = 1019;
      /// Sum of all account state lengths
      pub const ACCOUNT_STATE_SPACE: usize = INITIALIZED_BYTES + BTREE_LENGTH + BTREE_STORAGE;

      /// Packs the initialized flag and data content into destination slice
      #[allow(clippy::ptr_offset_with_cast)]
      pub fn pack_into_slice(
      is_initialized: bool,
      btree_storage: &BTreeMap<String, String>,
      dst: &mut [u8],
      ) {
      let dst = array_mut_ref![dst, 0, ACCOUNT_STATE_SPACE];
      // Setup pointers to key areas of account state data
      let (is_initialized_dst, data_len_dst, data_dst) =
      mut_array_refs![dst, INITIALIZED_BYTES, BTREE_LENGTH, BTREE_STORAGE];
      // Set the initialized flag
      is_initialized_dst[0] = is_initialized as u8;
      // Store the core data length and serialized content
      let keyval_store_data = btree_storage.try_to_vec().unwrap();
      let data_len = keyval_store_data.len();
      if data_len < BTREE_STORAGE {
      data_len_dst[..].copy_from_slice(&(data_len as u32).to_le_bytes());
      sol_memcpy(data_dst, &keyval_store_data, data_len);
      } else {
      panic!();
      }
      }

      /// Unpacks the data from slice and return the initialized flag and data content
      #[allow(clippy::ptr_offset_with_cast)]
      pub fn unpack_from_slice(src: &[u8]) -> Result<(bool, BTreeMap<String, String>), Box<dyn Error>> {
      let src = array_ref![src, 0, ACCOUNT_STATE_SPACE];
      // Setup pointers to key areas of account state data
      let (is_initialized_src, data_len_src, data_src) =
      array_refs![src, INITIALIZED_BYTES, BTREE_LENGTH, BTREE_STORAGE];

      let is_initialized = match is_initialized_src {
      [0] => false,
      [1] => true,
      _ => {
      return Err(Box::<dyn Error>::from(format!(
      "unrecognized initialization flag \"{:?}\". in account",
      is_initialized_src
      )))
      }
      };
      // Get current size of content in data area
      let data_len = u32::from_le_bytes(*data_len_src) as usize;
      // If emptry, create a default
      if data_len == 0 {
      Ok((is_initialized, BTreeMap::<String, String>::new()))
      } else {
      let data_dser = BTreeMap::<String, String>::try_from_slice(&data_src[0..data_len]).unwrap();
      Ok((is_initialized, data_dser))
      }
      }

      用法

      以下将所有内容整合在一起,并演示了程序与ProgramAccountState的交互,其中ProgramAccountState封装了初始化标志以及底层的BTreeMap用于存储键值对。

      首先,当我们想要初始化一个全新的账户时:

      /// Initialize a new program account, which is the first in AccountInfo array
      fn initialize_account(accounts: &[AccountInfo]) -> ProgramResult {
      msg!("Initialize account");
      let account_info_iter = &mut accounts.iter();
      let program_account = next_account_info(account_info_iter)?;
      let mut account_data = program_account.data.borrow_mut();
      // Here we use unpack_unchecked as we have yet to initialize
      // Had we tried to use unpack it would fail because, well, chicken and egg
      let mut account_state = ProgramAccountState::unpack_unchecked(&account_data)?;
      // We double check that we haven't already initialized this accounts data
      // more than once. If we are good, we set the initialized flag
      if account_state.is_initialized() {
      return Err(SampleError::AlreadyInitializedState.into());
      } else {
      account_state.set_initialized();
      }
      // Finally, we store back to the accounts space
      ProgramAccountState::pack(account_state, &mut account_data).unwrap();
      Ok(())
      }

      现在,我们可以执行其他指令,下面的示例演示了从客户端发送指令来创建一个新的键值对:

      /// Mint a key/pair to the programs account, which is the first in accounts
      fn mint_keypair_to_account(accounts: &[AccountInfo], key: String, value: String) -> ProgramResult {
      msg!("Mint to account");
      let account_info_iter = &mut accounts.iter();
      let program_account = next_account_info(account_info_iter)?;
      let mut account_data = program_account.data.borrow_mut();
      // Unpacking an uninitialized account state will fail
      let mut account_state = ProgramAccountState::unpack(&account_data)?;
      // Add the key value pair to the underlying BTreeMap
      account_state.add(key, value)?;
      // Finally, serialize back to the accounts data
      ProgramAccountState::pack(account_state, &mut account_data)?;
      Ok(())
      }

      如何在客户端中反序列化账户数据

      客户端可以调用Solana来获取程序所拥有的账户,其中序列化的数据块是返回结果的一部分。进行反序列化需要了解数据块的布局。

      账户数据的布局在这里已经被描述了。

      use {
      arrayref::*,
      borsh::{BorshDeserialize, BorshSerialize},
      std::{collections::BTreeMap, error::Error},
      };

      #[allow(clippy::ptr_offset_with_cast)]
      pub fn unpack_from_slice(src: &[u8]) -> Result<(bool, BTreeMap<String, String>), Box<dyn Error>> {
      let src = array_ref![src, 0, ACCOUNT_STATE_SPACE];
      // Setup pointers to key areas of account state data
      let (is_initialized_src, data_len_src, data_src) =
      array_refs![src, INITIALIZED_BYTES, BTREE_LENGTH, BTREE_STORAGE];

      let is_initialized = match is_initialized_src {
      [0] => false,
      [1] => true,
      _ => {
      return Err(Box::<dyn Error>::from(format!(
      "unrecognized initialization flag \"{:?}\". in account",
      is_initialized_src
      )))
      }
      };
      // Get current size of content in data area
      let data_len = u32::from_le_bytes(*data_len_src) as usize;
      // If emptry, create a default
      if data_len == 0 {
      Ok((is_initialized, BTreeMap::<String, String>::new()))
      } else {
      let data_dser = BTreeMap::<String, String>::try_from_slice(&data_src[0..data_len]).unwrap();
      Ok((is_initialized, data_dser))
      }
      }

      Solana TS/JS 常用映射

      Borsh Specification中包含了大多数基本和复合数据类型的映射关系。

      在TS/JS和Python中,关键是创建一个具有适当定义的Borsh模式,以便序列化和反序列化可以生成或遍历相应的输入。

      首先,我们将演示在Typescript中对基本类型(数字、字符串)和复合类型(固定大小数组、Map)进行序列化,然后在Python中进行序列化,最后在Rust中进行等效的反序列化操作:

      fn main() {}

      #[cfg(test)]
      mod tests {
      use borsh::{BorshDeserialize, BorshSerialize};
      use std::collections::BTreeMap;

      #[test]
      fn primitives() {
      let prim = [
      255u8, 255, 255, 255, 255, 255, 255, 5, 0, 0, 0, 104, 101, 108, 108, 111, 5, 0, 0, 0,
      119, 111, 114, 108, 100, 1, 2, 3, 4, 5, 2, 0, 0, 0, 8, 0, 0, 0, 99, 111, 111, 107, 98,
      111, 111, 107, 6, 0, 0, 0, 114, 101, 99, 105, 112, 101, 6, 0, 0, 0, 114, 101, 99, 105,
      112, 101, 10, 0, 0, 0, 105, 110, 103, 114, 101, 100, 105, 101, 110, 116,
      ];
      #[derive(BorshDeserialize, BorshSerialize, Debug)]
      struct Primitive(
      u8,
      u16,
      u32,
      String,
      String,
      [u8; 5],
      BTreeMap<String, String>,
      );
      let x = Primitive::try_from_slice(&prim).unwrap();
      println!("{:?}", x);
      }
      }

      高级构造

      我们在之前的示例中展示了如何创建简单的负载(Payloads)。有时,Solana会使用某些特殊类型。本节将演示如何正确映射TS/JS和Rust之间的类型,以处理这些情况。

      COption

      #!/usr/bin/env node

      import { serialize, deserialize, deserializeUnchecked } from "borsh";
      import { Buffer } from "buffer";
      import { PublicKey, Struct } from "@solana/web3.js";

      /**
      * COption is meant to mirror the
      * `solana_program::options::COption`
      *
      * This type stores a u32 flag (0 | 1) indicating
      * the presence or not of a underlying PublicKey
      *
      * Similar to a Rust Option
      * @extends {Struct} Solana JS Struct class
      * @implements {encode}
      */
      class COption extends Struct {
      constructor(properties) {
      super(properties);
      }

      /**
      * Creates a COption from a PublicKey
      * @param {PublicKey?} akey
      * @returns {COption} COption
      */
      static fromPublicKey(akey?: PublicKey): COption {
      if (akey == undefined) {
      return new COption({
      noneOrSome: 0,
      pubKeyBuffer: new Uint8Array(32),
      });
      } else {
      return new COption({
      noneOrSome: 1,
      pubKeyBuffer: akey.toBytes(),
      });
      }
      }
      /**
      * @returns {Buffer} Serialized COption (this)
      */
      encode(): Buffer {
      return Buffer.from(serialize(COPTIONSCHEMA, this));
      }
      /**
      * Safe deserializes a borsh serialized buffer to a COption
      * @param {Buffer} data - Buffer containing borsh serialized data
      * @returns {COption} COption object
      */
      static decode(data): COption {
      return deserialize(COPTIONSCHEMA, this, data);
      }

      /**
      * Unsafe deserializes a borsh serialized buffer to a COption
      * @param {Buffer} data - Buffer containing borsh serialized data
      * @returns {COption} COption object
      */
      static decodeUnchecked(data): COption {
      return deserializeUnchecked(COPTIONSCHEMA, this, data);
      }
      }

      /**
      * Defines the layout of the COption object
      * for serializing/deserializing
      * @type {Map}
      */
      const COPTIONSCHEMA = new Map([
      [
      COption,
      {
      kind: "struct",
      fields: [
      ["noneOrSome", "u32"],
      ["pubKeyBuffer", [32]],
      ],
      },
      ],
      ]);

      /**
      * Entry point for script *
      */
      async function entry(indata?: PublicKey) {
      // If we get a PublicKey
      if (indata) {
      // Construct COption instance
      const coption = COption.fromPublicKey(indata);
      console.log("Testing COption with " + indata.toBase58());
      // Serialize it
      let copt_ser = coption.encode();
      console.log("copt_ser ", copt_ser);
      // Deserialize it
      const tdone = COption.decode(copt_ser);
      console.log(tdone);
      // Validate contains PublicKey
      if (tdone["noneOrSome"] == 1) {
      console.log("pubkey: " + new PublicKey(tdone["pubKeyBuffer"]).toBase58());
      }
      /*
      Output:
      Testing COption with A94wMjV54C8f8wn7zL8TxNCdNiGoq7XSN7vWGrtd4vwU
      copt_ser Buffer(36) [1, 0, 0, 0, 135, 202, 71, 214, 68, 105, 98, 176, 211, 130, 105, 2, 55, 187, 86, 186, 109, 176, 80, 208, 77, 100, 221, 101, 20, 203, 149, 166, 96, 171, 119, 35, buffer: ArrayBuffer(8192), byteLength: 36, byteOffset: 1064, length: 36]
      COption {noneOrSome: 1, pubKeyBuffer: Uint8Array(32)}
      pubkey: A94wMjV54C8f8wn7zL8TxNCdNiGoq7XSN7vWGrtd4vwU
      */
      } else {
      console.log("Testing COption with null");
      // Construct COption instance
      const coption = COption.fromPublicKey();
      // Serialize it
      const copt_ser = coption.encode();
      console.log(copt_ser);
      // Deserialize it
      const tdone1 = COption.decode(copt_ser);
      console.log(tdone1);
      // Validate does NOT contains PublicKey
      if (tdone1["noneOrSome"] == 1) {
      throw Error("Expected no public key");
      } else console.log("pubkey: null");
      /*
      Output:
      Testing COption with null
      Buffer(36)[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, buffer: ArrayBuffer(8192), byteLength: 36, byteOffset: 2272, length: 36]
      COption { noneOrSome: 0, pubKeyBuffer: Uint8Array(32) }
      pubkey: null
      */
      }
      }

      // Test with PublicKey
      entry(new PublicKey("A94wMjV54C8f8wn7zL8TxNCdNiGoq7XSN7vWGrtd4vwU"));
      console.log("");
      // Test without PublicKey
      entry();

      资料

      - +

      序列数据

      当我们谈论序列化时,我们指的是数据的序列化和反序列化。

      序列化在Solana程序和程序账户的生命周期中的几个点上起着作用:

      1. 将指令数据序列化到客户端上
      2. 在程序中反序列化指令数据
      3. 将账户数据序列化到程序中
      4. 在客户端上反序列化账户数据

      重要的是,上述操作都应该采用相同的序列化方法。下面的示例演示了使用Borsh进行序列化。

      本文档的其余部分中的示例摘录自Solana CLI 程序模板

      设置Borsh序列化

      为了使用Borsh进行序列化,需要在Rust程序、Rust客户端、节点和/或Python客户端中设置Borsh库。

      [package]
      name = "solana-cli-template-program-bpf"
      version = "0.1.0"
      edition = "2018"
      license = "WTFPL"

      # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

      [features]
      no-entrypoint = []

      [dependencies]
      borsh = "0.9.0"
      lazy_static = "1.4.0"
      num-derive = "0.3"
      num_enum = "0.5.1"
      num-integer = "0.1.44"
      num-traits = "0.2"
      sol-template-shared = {path = "../shared"}
      solana-program = "1.8.2"
      thiserror = "1.0"

      [dev-dependencies]
      solana-program-test = "1.8.2"
      solana-sdk = "1.8.2"

      [lib]
      crate-type = ["cdylib", "lib"]

      如何序列化客户端上的指令数据

      如果你要将出站指令数据序列化并发送给程序,它必须与程序反序列化入站指令数据的方式保持一致。

      在此模板中,指令数据块是一个包含序列化数组的数据块,例如:

      Instruction (Variant index)Serialized KeySerialized Value
      Initialize (0)not applicable for instructionnot applicable for instruction
      Mint (1)"foo""bar"
      Transfer (2)"foo"not applicable for instruction
      Burn (2)"foo"not applicable for instruction

      在下面的示例中,我们假设程序拥有的账户已经初始化完成。

      // Include borsh functionality

      import { serialize, deserialize, deserializeUnchecked } from "borsh";
      import { Buffer } from "buffer";

      // Get Solana
      import {
      Keypair,
      Connection,
      PublicKey,
      Transaction,
      TransactionInstruction,
      sendAndConfirmTransaction,
      } from "@solana/web3.js";

      // Flexible class that takes properties and imbues them
      // to the object instance
      class Assignable {
      constructor(properties) {
      Object.keys(properties).map((key) => {
      return (this[key] = properties[key]);
      });
      }
      }

      // Our instruction payload vocabulary
      class Payload extends Assignable {}

      // Borsh needs a schema describing the payload
      const payloadSchema = new Map([
      [
      Payload,
      {
      kind: "struct",
      fields: [
      ["id", "u8"],
      ["key", "string"],
      ["value", "string"],
      ],
      },
      ],
      ]);

      // Instruction variant indexes
      enum InstructionVariant {
      InitializeAccount = 0,
      MintKeypair,
      TransferKeypair,
      BurnKeypair,
      }

      /**
      * Mint a key value pair to account
      * @param {Connection} connection - Solana RPC connection
      * @param {PublicKey} progId - Sample Program public key
      * @param {PublicKey} account - Target program owned account for Mint
      * @param {Keypair} wallet - Wallet for signing and payment
      * @param {string} mintKey - The key being minted key
      * @param {string} mintValue - The value being minted
      * @return {Promise<Keypair>} - Keypair
      */

      export async function mintKV(
      connection: Connection,
      progId: PublicKey,
      account: PublicKey,
      wallet: Keypair,
      mintKey: string,
      mintValue: string
      ): Promise<string> {
      // Construct the payload
      const mint = new Payload({
      id: InstructionVariant.MintKeypair,
      key: mintKey, // 'ts key'
      value: mintValue, // 'ts first value'
      });

      // Serialize the payload
      const mintSerBuf = Buffer.from(serialize(payloadSchema, mint));
      // console.log(mintSerBuf)
      // => <Buffer 01 06 00 00 00 74 73 20 6b 65 79 0e 00 00 00 74 73 20 66 69 72 73 74 20 76 61 6c 75 65>
      // let mintPayloadCopy = deserialize(schema, Payload, mintSerBuf)
      // console.log(mintPayloadCopy)
      // => Payload { id: 1, key: 'ts key', value: 'ts first value' }

      // Create Solana Instruction
      const instruction = new TransactionInstruction({
      data: mintSerBuf,
      keys: [
      { pubkey: account, isSigner: false, isWritable: true },
      { pubkey: wallet.publicKey, isSigner: false, isWritable: false },
      ],
      programId: progId,
      });

      // Send Solana Transaction
      const transactionSignature = await sendAndConfirmTransaction(
      connection,
      new Transaction().add(instruction),
      [wallet],
      {
      commitment: "singleGossip",
      preflightCommitment: "singleGossip",
      }
      );
      console.log("Signature = ", transactionSignature);
      return transactionSignature;
      }

      如何在程序中反序列化指令数据

      Deserialize Instruction Data

      //! instruction Contains the main ProgramInstruction enum

      use {
      crate::error::SampleError, borsh::BorshDeserialize, solana_program::program_error::ProgramError,
      };

      #[derive(Debug, PartialEq)]
      /// All custom program instructions
      pub enum ProgramInstruction {
      InitializeAccount,
      MintToAccount { key: String, value: String },
      TransferBetweenAccounts { key: String },
      BurnFromAccount { key: String },
      MintToAccountWithFee { key: String, value: String },
      TransferBetweenAccountsWithFee { key: String },
      BurnFromAccountWithFee { key: String },
      }

      /// Generic Payload Deserialization
      #[derive(BorshDeserialize, Debug)]
      struct Payload {
      variant: u8,
      arg1: String,
      arg2: String,
      }

      impl ProgramInstruction {
      /// Unpack inbound buffer to associated Instruction
      /// The expected format for input is a Borsh serialized vector
      pub fn unpack(input: &[u8]) -> Result<Self, ProgramError> {
      let payload = Payload::try_from_slice(input).unwrap();
      match payload.variant {
      0 => Ok(ProgramInstruction::InitializeAccount),
      1 => Ok(Self::MintToAccount {
      key: payload.arg1,
      value: payload.arg2,
      }),
      2 => Ok(Self::TransferBetweenAccounts { key: payload.arg1 }),
      3 => Ok(Self::BurnFromAccount { key: payload.arg1 }),
      4 => Ok(Self::MintToAccountWithFee {
      key: payload.arg1,
      value: payload.arg2,
      }),
      5 => Ok(Self::TransferBetweenAccountsWithFee { key: payload.arg1 }),
      6 => Ok(Self::BurnFromAccountWithFee { key: payload.arg1 }),
      _ => Err(SampleError::DeserializationFailure.into()),
      }
      }
      }

      如何在程序中序列化账户数据

      Account Data Serialization

      程序账户数据块(来自示例仓库)的布局如下:

      Byte 0Bytes 1-4Remaining Byte up to 1019
      Initialized flaglength of serialized BTreeMapBTreeMap (where key value pairs are stored)

      Pack

      关于 Pack trait

      可以更容易地隐藏账户数据序列化/反序列化的细节,使你的核心程序指令处理代码更简洁。因此,不需要将所有的序列化/反序列化逻辑放在程序处理代码中,而是将这些细节封装在以下三个函数中:

      1. unpack_unchecked - 允许你对账户进行反序列化,而无需检查它是否已被初始化。当实际处理初始化函数(变体索引为0)时,这非常有用。
      2. unpack - 调用你的Pack实现的unpack_from_slice函数,并检查账户是否已被初始化。
      3. pack - 调用您的Pack实现的pack_into_slice函数。

      下面是我们示例程序的Pack trait实现。随后是使用Borsh进行账户数据处理的示例。

      //! @brief account_state manages account data

      use crate::error::SampleError;
      use sol_template_shared::ACCOUNT_STATE_SPACE;
      use solana_program::{
      entrypoint::ProgramResult,
      program_error::ProgramError,
      program_pack::{IsInitialized, Pack, Sealed},
      };
      use std::collections::BTreeMap;

      /// Maintains global accumulator
      #[derive(Debug, Default, PartialEq)]
      pub struct ProgramAccountState {
      is_initialized: bool,
      btree_storage: BTreeMap<String, String>,
      }

      impl ProgramAccountState {
      /// Returns indicator if this account has been initialized
      pub fn set_initialized(&mut self) {
      self.is_initialized = true;
      }
      /// Adds a new key/value pair to the account
      pub fn add(&mut self, key: String, value: String) -> ProgramResult {
      match self.btree_storage.contains_key(&key) {
      true => Err(SampleError::KeyAlreadyExists.into()),
      false => {
      self.btree_storage.insert(key, value);
      Ok(())
      }
      }
      }
      /// Removes a key from account and returns the keys value
      pub fn remove(&mut self, key: &str) -> Result<String, SampleError> {
      match self.btree_storage.contains_key(key) {
      true => Ok(self.btree_storage.remove(key).unwrap()),
      false => Err(SampleError::KeyNotFoundInAccount),
      }
      }
      }

      impl Sealed for ProgramAccountState {}

      // Pack expects the implementation to satisfy whether the
      // account is initialzed.
      impl IsInitialized for ProgramAccountState {
      fn is_initialized(&self) -> bool {
      self.is_initialized
      }
      }

      impl Pack for ProgramAccountState {
      const LEN: usize = ACCOUNT_STATE_SPACE;

      /// Store 'state' of account to its data area
      fn pack_into_slice(&self, dst: &mut [u8]) {
      sol_template_shared::pack_into_slice(self.is_initialized, &self.btree_storage, dst);
      }

      /// Retrieve 'state' of account from account data area
      fn unpack_from_slice(src: &[u8]) -> Result<Self, ProgramError> {
      match sol_template_shared::unpack_from_slice(src) {
      Ok((is_initialized, btree_map)) => Ok(ProgramAccountState {
      is_initialized,
      btree_storage: btree_map,
      }),
      Err(_) => Err(ProgramError::InvalidAccountData),
      }
      }
      }

      序列化/反序列化

      为了完成底层的序列化和反序列化:

      1. sol_template_shared::pack_into_slice - 进行序列化的地方
      2. sol_template_shared::unpack_from_slice - 进行反序列化的地方

      请关注 在下面的示例中,我们在BTREE_LENGTH的数据布局中的BTREE_STORAGE之前有一个u32(4字节)的分区。这是因为在反序列化过程中,borsh会检查您正在反序列化的切片的长度是否与它实际读取的数据量一致,然后才进行对象的重组。下面演示的方法首先读取BTREE_LENGTH,以获取要从BTREE_STORAGE指针中slice的大小。

      use {
      arrayref::*,
      borsh::{BorshDeserialize, BorshSerialize},
      solana_program::program_memory::sol_memcpy,
      std::{collections::BTreeMap, error::Error},
      };

      /// Initialization flag size for account state
      pub const INITIALIZED_BYTES: usize = 1;
      /// Storage for the serialized size of the BTreeMap control
      pub const BTREE_LENGTH: usize = 4;
      /// Storage for the serialized BTreeMap container
      pub const BTREE_STORAGE: usize = 1019;
      /// Sum of all account state lengths
      pub const ACCOUNT_STATE_SPACE: usize = INITIALIZED_BYTES + BTREE_LENGTH + BTREE_STORAGE;

      /// Packs the initialized flag and data content into destination slice
      #[allow(clippy::ptr_offset_with_cast)]
      pub fn pack_into_slice(
      is_initialized: bool,
      btree_storage: &BTreeMap<String, String>,
      dst: &mut [u8],
      ) {
      let dst = array_mut_ref![dst, 0, ACCOUNT_STATE_SPACE];
      // Setup pointers to key areas of account state data
      let (is_initialized_dst, data_len_dst, data_dst) =
      mut_array_refs![dst, INITIALIZED_BYTES, BTREE_LENGTH, BTREE_STORAGE];
      // Set the initialized flag
      is_initialized_dst[0] = is_initialized as u8;
      // Store the core data length and serialized content
      let keyval_store_data = btree_storage.try_to_vec().unwrap();
      let data_len = keyval_store_data.len();
      if data_len < BTREE_STORAGE {
      data_len_dst[..].copy_from_slice(&(data_len as u32).to_le_bytes());
      sol_memcpy(data_dst, &keyval_store_data, data_len);
      } else {
      panic!();
      }
      }

      /// Unpacks the data from slice and return the initialized flag and data content
      #[allow(clippy::ptr_offset_with_cast)]
      pub fn unpack_from_slice(src: &[u8]) -> Result<(bool, BTreeMap<String, String>), Box<dyn Error>> {
      let src = array_ref![src, 0, ACCOUNT_STATE_SPACE];
      // Setup pointers to key areas of account state data
      let (is_initialized_src, data_len_src, data_src) =
      array_refs![src, INITIALIZED_BYTES, BTREE_LENGTH, BTREE_STORAGE];

      let is_initialized = match is_initialized_src {
      [0] => false,
      [1] => true,
      _ => {
      return Err(Box::<dyn Error>::from(format!(
      "unrecognized initialization flag \"{:?}\". in account",
      is_initialized_src
      )))
      }
      };
      // Get current size of content in data area
      let data_len = u32::from_le_bytes(*data_len_src) as usize;
      // If emptry, create a default
      if data_len == 0 {
      Ok((is_initialized, BTreeMap::<String, String>::new()))
      } else {
      let data_dser = BTreeMap::<String, String>::try_from_slice(&data_src[0..data_len]).unwrap();
      Ok((is_initialized, data_dser))
      }
      }

      用法

      以下将所有内容整合在一起,并演示了程序与ProgramAccountState的交互,其中ProgramAccountState封装了初始化标志以及底层的BTreeMap用于存储键值对。

      首先,当我们想要初始化一个全新的账户时:

      /// Initialize a new program account, which is the first in AccountInfo array
      fn initialize_account(accounts: &[AccountInfo]) -> ProgramResult {
      msg!("Initialize account");
      let account_info_iter = &mut accounts.iter();
      let program_account = next_account_info(account_info_iter)?;
      let mut account_data = program_account.data.borrow_mut();
      // Here we use unpack_unchecked as we have yet to initialize
      // Had we tried to use unpack it would fail because, well, chicken and egg
      let mut account_state = ProgramAccountState::unpack_unchecked(&account_data)?;
      // We double check that we haven't already initialized this accounts data
      // more than once. If we are good, we set the initialized flag
      if account_state.is_initialized() {
      return Err(SampleError::AlreadyInitializedState.into());
      } else {
      account_state.set_initialized();
      }
      // Finally, we store back to the accounts space
      ProgramAccountState::pack(account_state, &mut account_data).unwrap();
      Ok(())
      }

      现在,我们可以执行其他指令,下面的示例演示了从客户端发送指令来创建一个新的键值对:

      /// Mint a key/pair to the programs account, which is the first in accounts
      fn mint_keypair_to_account(accounts: &[AccountInfo], key: String, value: String) -> ProgramResult {
      msg!("Mint to account");
      let account_info_iter = &mut accounts.iter();
      let program_account = next_account_info(account_info_iter)?;
      let mut account_data = program_account.data.borrow_mut();
      // Unpacking an uninitialized account state will fail
      let mut account_state = ProgramAccountState::unpack(&account_data)?;
      // Add the key value pair to the underlying BTreeMap
      account_state.add(key, value)?;
      // Finally, serialize back to the accounts data
      ProgramAccountState::pack(account_state, &mut account_data)?;
      Ok(())
      }

      如何在客户端中反序列化账户数据

      客户端可以调用Solana来获取程序所拥有的账户,其中序列化的数据块是返回结果的一部分。进行反序列化需要了解数据块的布局。

      账户数据的布局在这里已经被描述了。

      use {
      arrayref::*,
      borsh::{BorshDeserialize, BorshSerialize},
      std::{collections::BTreeMap, error::Error},
      };

      #[allow(clippy::ptr_offset_with_cast)]
      pub fn unpack_from_slice(src: &[u8]) -> Result<(bool, BTreeMap<String, String>), Box<dyn Error>> {
      let src = array_ref![src, 0, ACCOUNT_STATE_SPACE];
      // Setup pointers to key areas of account state data
      let (is_initialized_src, data_len_src, data_src) =
      array_refs![src, INITIALIZED_BYTES, BTREE_LENGTH, BTREE_STORAGE];

      let is_initialized = match is_initialized_src {
      [0] => false,
      [1] => true,
      _ => {
      return Err(Box::<dyn Error>::from(format!(
      "unrecognized initialization flag \"{:?}\". in account",
      is_initialized_src
      )))
      }
      };
      // Get current size of content in data area
      let data_len = u32::from_le_bytes(*data_len_src) as usize;
      // If emptry, create a default
      if data_len == 0 {
      Ok((is_initialized, BTreeMap::<String, String>::new()))
      } else {
      let data_dser = BTreeMap::<String, String>::try_from_slice(&data_src[0..data_len]).unwrap();
      Ok((is_initialized, data_dser))
      }
      }

      Solana TS/JS 常用映射

      Borsh Specification中包含了大多数基本和复合数据类型的映射关系。

      在TS/JS和Python中,关键是创建一个具有适当定义的Borsh模式,以便序列化和反序列化可以生成或遍历相应的输入。

      首先,我们将演示在Typescript中对基本类型(数字、字符串)和复合类型(固定大小数组、Map)进行序列化,然后在Python中进行序列化,最后在Rust中进行等效的反序列化操作:

      fn main() {}

      #[cfg(test)]
      mod tests {
      use borsh::{BorshDeserialize, BorshSerialize};
      use std::collections::BTreeMap;

      #[test]
      fn primitives() {
      let prim = [
      255u8, 255, 255, 255, 255, 255, 255, 5, 0, 0, 0, 104, 101, 108, 108, 111, 5, 0, 0, 0,
      119, 111, 114, 108, 100, 1, 2, 3, 4, 5, 2, 0, 0, 0, 8, 0, 0, 0, 99, 111, 111, 107, 98,
      111, 111, 107, 6, 0, 0, 0, 114, 101, 99, 105, 112, 101, 6, 0, 0, 0, 114, 101, 99, 105,
      112, 101, 10, 0, 0, 0, 105, 110, 103, 114, 101, 100, 105, 101, 110, 116,
      ];
      #[derive(BorshDeserialize, BorshSerialize, Debug)]
      struct Primitive(
      u8,
      u16,
      u32,
      String,
      String,
      [u8; 5],
      BTreeMap<String, String>,
      );
      let x = Primitive::try_from_slice(&prim).unwrap();
      println!("{:?}", x);
      }
      }

      高级构造

      我们在之前的示例中展示了如何创建简单的负载(Payloads)。有时,Solana会使用某些特殊类型。本节将演示如何正确映射TS/JS和Rust之间的类型,以处理这些情况。

      COption

      #!/usr/bin/env node

      import { serialize, deserialize, deserializeUnchecked } from "borsh";
      import { Buffer } from "buffer";
      import { PublicKey, Struct } from "@solana/web3.js";

      /**
      * COption is meant to mirror the
      * `solana_program::options::COption`
      *
      * This type stores a u32 flag (0 | 1) indicating
      * the presence or not of a underlying PublicKey
      *
      * Similar to a Rust Option
      * @extends {Struct} Solana JS Struct class
      * @implements {encode}
      */
      class COption extends Struct {
      constructor(properties) {
      super(properties);
      }

      /**
      * Creates a COption from a PublicKey
      * @param {PublicKey?} akey
      * @returns {COption} COption
      */
      static fromPublicKey(akey?: PublicKey): COption {
      if (akey == undefined) {
      return new COption({
      noneOrSome: 0,
      pubKeyBuffer: new Uint8Array(32),
      });
      } else {
      return new COption({
      noneOrSome: 1,
      pubKeyBuffer: akey.toBytes(),
      });
      }
      }
      /**
      * @returns {Buffer} Serialized COption (this)
      */
      encode(): Buffer {
      return Buffer.from(serialize(COPTIONSCHEMA, this));
      }
      /**
      * Safe deserializes a borsh serialized buffer to a COption
      * @param {Buffer} data - Buffer containing borsh serialized data
      * @returns {COption} COption object
      */
      static decode(data): COption {
      return deserialize(COPTIONSCHEMA, this, data);
      }

      /**
      * Unsafe deserializes a borsh serialized buffer to a COption
      * @param {Buffer} data - Buffer containing borsh serialized data
      * @returns {COption} COption object
      */
      static decodeUnchecked(data): COption {
      return deserializeUnchecked(COPTIONSCHEMA, this, data);
      }
      }

      /**
      * Defines the layout of the COption object
      * for serializing/deserializing
      * @type {Map}
      */
      const COPTIONSCHEMA = new Map([
      [
      COption,
      {
      kind: "struct",
      fields: [
      ["noneOrSome", "u32"],
      ["pubKeyBuffer", [32]],
      ],
      },
      ],
      ]);

      /**
      * Entry point for script *
      */
      async function entry(indata?: PublicKey) {
      // If we get a PublicKey
      if (indata) {
      // Construct COption instance
      const coption = COption.fromPublicKey(indata);
      console.log("Testing COption with " + indata.toBase58());
      // Serialize it
      let copt_ser = coption.encode();
      console.log("copt_ser ", copt_ser);
      // Deserialize it
      const tdone = COption.decode(copt_ser);
      console.log(tdone);
      // Validate contains PublicKey
      if (tdone["noneOrSome"] == 1) {
      console.log("pubkey: " + new PublicKey(tdone["pubKeyBuffer"]).toBase58());
      }
      /*
      Output:
      Testing COption with A94wMjV54C8f8wn7zL8TxNCdNiGoq7XSN7vWGrtd4vwU
      copt_ser Buffer(36) [1, 0, 0, 0, 135, 202, 71, 214, 68, 105, 98, 176, 211, 130, 105, 2, 55, 187, 86, 186, 109, 176, 80, 208, 77, 100, 221, 101, 20, 203, 149, 166, 96, 171, 119, 35, buffer: ArrayBuffer(8192), byteLength: 36, byteOffset: 1064, length: 36]
      COption {noneOrSome: 1, pubKeyBuffer: Uint8Array(32)}
      pubkey: A94wMjV54C8f8wn7zL8TxNCdNiGoq7XSN7vWGrtd4vwU
      */
      } else {
      console.log("Testing COption with null");
      // Construct COption instance
      const coption = COption.fromPublicKey();
      // Serialize it
      const copt_ser = coption.encode();
      console.log(copt_ser);
      // Deserialize it
      const tdone1 = COption.decode(copt_ser);
      console.log(tdone1);
      // Validate does NOT contains PublicKey
      if (tdone1["noneOrSome"] == 1) {
      throw Error("Expected no public key");
      } else console.log("pubkey: null");
      /*
      Output:
      Testing COption with null
      Buffer(36)[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, buffer: ArrayBuffer(8192), byteLength: 36, byteOffset: 2272, length: 36]
      COption { noneOrSome: 0, pubKeyBuffer: Uint8Array(32) }
      pubkey: null
      */
      }
      }

      // Test with PublicKey
      entry(new PublicKey("A94wMjV54C8f8wn7zL8TxNCdNiGoq7XSN7vWGrtd4vwU"));
      console.log("");
      // Test without PublicKey
      entry();

      资料

      + \ No newline at end of file diff --git a/cookbook-zh/guides/versioned-transactions/index.html b/cookbook-zh/guides/versioned-transactions/index.html index 80491d498..aaa3c5310 100644 --- a/cookbook-zh/guides/versioned-transactions/index.html +++ b/cookbook-zh/guides/versioned-transactions/index.html @@ -5,14 +5,14 @@ 版本化交易 (Versioned Transactions) | All in One Solana - +

      版本化交易 (Versioned Transactions)

      Solana最近发布了版本化交易。提议的更改如下:

      1. 引入一个新的程序,用于管理链上地址查找表。

      2. 添加一种新的交易格式,可以利用链上地址查找表。

      info

      tip 事实表 --传统交易存在一个主要问题:最大允许的大小为1232字节,因此原子交易中可以容纳的账户数量为35个地址。

      • 地址查找表(LUTs):一旦账户存储在该表中,可以使用1字节的u8索引,在交易消息中引用该表的地址。
      • 可以使用solana/web3.jscreateLookupTable()构建一个新的查找表,并确定其地址。
      • 一旦创建了LUT,可以进行扩展,即可以将账户追加到表中。
      • 版本化交易:需要修改传统交易的结构以整合LUTs。
      • 在引入版本化之前,交易在其头部的第一个字节中保留了一个未使用的最高位,可以用来显式声明交易的版本。

      我们将更详细地讨论上述引入的更改以及它们对开发人员的意义。然而,为了更好地理解这些更改,我们首先需要了解常规(或传统)交易的结构。

      传统交易(Legacy Transactions)

      Solana网络使用最大事务单元(MTU)大小为1280字节,遵循IPv6 MTU 的大小约束,以确保速度和可靠性。这样留下了1232字节的数据空间,用于存储序列化的交易等数据。

      一个交易由以下组成:

      1. 一个紧凑数组的签名,其中每个签名是一个64字节的ed25519签名。
      2. 一个(传统的)消息。

      Transaction Format

      info

      tip Compact-Array format

      A compact array is an array serialised to have the following components:

      1. An array length in a multi-byte encoding called Compact-u16
      2. Followed by each array item

      Compact array format

      传统消息

      传统消息包含以下组件:

      1. 一个头部(header)。
      2. 一个紧凑数组的账户地址,每个账户地址占用32字节。
      3. 一个最近的区块哈希(recent blockhash):
        • 一个32字节的SHA-256哈希,用于指示上次观察到的账本状态。如果一个区块哈希太旧,验证节点将拒绝它。
      4. 一个紧凑数组的指令

      Legacy Message

      头部

      消息头部是3字节长,包含3个u8整数:

      1. 所需签名数量:Solana运行时会将此数字与交易中紧凑数组签名的长度进行验证。
      2. 需要签名的只读账户地址数量。
      3. 不需要签名的只读账户地址数量。

      Message Header

      紧凑账户地址数组

      这个紧凑数组以紧凑的u16编码的账户地址数量开始,然后是:

      1. 需要签名的账户地址:首先列出请求读取和写入访问权限的地址,然后是请求只读访问权限的地址。
      2. 不需要签名的账户地址:与上述相同,首先列出请求读取和写入访问权限的地址,然后是请求只读访问权限的地址。

      Compact array of account addresses

      紧凑指令数组

      就像账户地址数组一样,这个紧凑指令数组以紧凑的u16编码的指令数量开始,然后是一个指令数组。数组中的每个指令具有以下组件:

      1. 程序ID:用于标识将处理该指令的链上程序。它表示为消息中账户地址紧凑数组的地址的u8索引。
      2. 账户地址索引的紧凑数组:指向紧凑账户地址数组中需要签名的一部分账户地址的u8索引。
      3. 不透明的u8数据的紧凑数组:一个通用的字节数组,与前面提到的程序ID相关。该数据数组指定了程序应执行的任何操作以及账户可能不包含的任何附加信息。

      Compact array of Instructions

      传统交易的问题

      上述交易模型存在的问题是什么?

      交易的最大大小以及因此能够在单个原子交易中容纳的账户数量。

      如前所述,交易的最大允许大小为1232字节。一个账户地址的大小为32字节。因此,考虑到一些用于头部、签名和其他元数据的空间,一个交易最多只能存储35个账户。

      Issue with legacy transactions

      这是一个问题,因为有几种情况下,开发人员需要在单个交易中包含数百个无需签名的账户。但是,传统交易模型目前无法实现这一点。目前使用的解决方案是在链上临时存储状态,并在稍后的交易中使用。但是,当多个程序需要组合在单个交易中时,这种解决方法就不适用了。每个程序都需要多个账户作为输入,因此我们陷入了与之前相同的问题。

      这就是引入 地址查找表(Address Lookup Tables,LUT)的原因。

      地址查找表(Address Lookeup Tables)

      地址查找表的理念是在链上使用表格(数组)的数据结构存储账户地址。一旦账户存储在该表中,可以在交易消息中引用该表的地址。为了指向表中的单个账户,需要使用一个字节的u8索引。

      LUTs

      这样做可以节省空间,因为地址不再需要存储在交易消息中。它们只需要以数组形式的表格中的索引进行引用。这使得有可能引用256个账户,因为账户使用u8索引进行引用。

      当初始化地址查找表或向表中添加新地址时,需要使地址查找表免除租金。地址可以通过链上缓冲区或直接通过Extension指令将其追加到表格中。此外,地址查找表还可以存储相关的元数据,后面是一个紧凑数组的账户。下面是一个典型地址查找表的结构:

      LUT Format

      地址查找表的一个重要缺点是,在交易处理过程中,由于地址查找需要额外的开销,通常会导致交易的成本较高。

      版本化交易: TransactionV0

      传统交易的结构需要修改以包含地址表查找。这些更改不应破坏Solana上的交易处理,也不应对被调用的程序的格式产生任何更改。

      为了确保上述情况,重要的是明确指出交易类型:legacy(传统)或versioned(版本化)。我们如何在交易中包含这些信息呢?

      在引入版本化之前,交易在其消息头部的num_required_signatures字段的第一个字节中留下了一个未使用的上位比特。现在,我们可以使用这个比特位来明确声明我们的交易版本。

      pub enum VersionedMessage {
      Legacy(Message),
      V0(v0::Message),
      }

      如果设置了第一个比特位,那么第一个字节中的剩余比特将用于编码版本号。Solana从“版本0”开始,这是开始使用地址查找表的版本。

      如果未设置第一个比特位,那么该交易将被视为“传统交易”,并且第一个字节的剩余部分将被视为编码传统消息的第一个字节。

      MessageV0

      新的MessageV0的结构基本上是相同的,只是有两个小但重要的变化:

      1. 消息头部:与传统版本相同,没有变化。
      2. 紧凑账户密钥数组:与传统版本相同,没有变化。我们将指向该数组元素的索引数组表示为索引数组A(您很快将看到为什么我们这样表示)。
      3. 最近的区块哈希:与传统版本相同,没有变化。
      4. 紧凑指令数组:与传统版本不同,发生了变化。
      5. 地址表查找的紧凑数组:在版本0中引入。

      Message v0

      在查看指令数组中的变化之前,我们首先讨论地址表查找的紧凑数组的结构。

      地址表查找的紧凑数组

      这个结构将地址查找表(LUT)引入到版本化交易中,从而使得在单个交易中加载更多的只读和可写账户成为可能。

      紧凑数组以紧凑的u16编码表示地址表查找的数量,后跟一个地址表查找的数组。每个查找的结构如下:

      1. 账户密钥:地址查找表的账户密钥。
      2. 可写索引:用于加载可写账户地址的紧凑索引数组。我们将此数组表示为索引数组B
      3. 只读索引:用于加载只读账户地址的紧凑索引数组。我们将此数组表示为索引数组C

      Compact array of LUTs

      现在让我们看看指令紧凑数组中做了哪些改变。

      紧凑指令数组

      如前所述,传统指令的紧凑数组存储了各个传统指令,而这些指令又分别存储了以下内容:

      1. 程序ID索引
      2. 账户地址索引的紧凑数组
      3. 不透明的8位数据的紧凑数组

      新指令中的变化不在于指令本身的结构,而是在于用于获取第1和第2项索引的数组。在传统交易中,使用了索引数组A的子集,而在版本化交易中,则使用了以下组合数组的子集:

      1. 索引数组A:存储在消息中的紧凑账户数组。
      2. 索引数组B:地址表查找中的可写索引。
      3. 索引数组C:地址表查找中的只读索引。

      New Compact array of Instructions

      RPC变更

      事务响应将需要一个新的版本字段:maxSupportedTransactionVersion,以向客户端指示需要遵循的事务结构以进行反序列化。

      以下方法需要进行更新以避免错误:

      • getTransaction
      • getBlock

      请求中需要添加以下参数:

      maxSupportedTransactionVersion: 0

      如果请求中没有显式添加maxSupportedTransactionVersion,事务版本将回退到legacy。任何包含版本化事务的区块,在存在传统事务的情况下将返回客户端错误。

      你可以通过向RPC端点发送JSON格式的请求来设置如下:

      curl http://localhost:8899 -X POST -H "Content-Type: application/json" -d \
      '{"jsonrpc": "2.0", "id":1, "method": "getBlock", "params": [430, {
      "encoding":"json",
      "maxSupportedTransactionVersion":0,
      "transactionDetails":"full",
      "rewards":false
      }]}'

      你还可以使用 @solana/web3.js 库执行相同操作。

      // connect to the `devnet` cluster and get the current `slot`
      const connection = new web3.Connection(web3.clusterApiUrl("devnet"));
      const slot = await connection.getSlot();

      // get the latest block (allowing for v0 transactions)
      const block = await connection.getBlock(slot, {
      maxSupportedTransactionVersion: 0,
      });

      // get a specific transaction (allowing for v0 transactions)
      const getTx = await connection.getTransaction(
      "3jpoANiFeVGisWRY5UP648xRXs3iQasCHABPWRWnoEjeA93nc79WrnGgpgazjq4K9m8g2NJoyKoWBV1Kx5VmtwHQ",
      {
      maxSupportedTransactionVersion: 0,
      },
      );

      其他资料

      参考资料

      - +-传统交易存在一个主要问题:最大允许的大小为1232字节,因此原子交易中可以容纳的账户数量为35个地址。

      • 地址查找表(LUTs):一旦账户存储在该表中,可以使用1字节的u8索引,在交易消息中引用该表的地址。
      • 可以使用solana/web3.jscreateLookupTable()构建一个新的查找表,并确定其地址。
      • 一旦创建了LUT,可以进行扩展,即可以将账户追加到表中。
      • 版本化交易:需要修改传统交易的结构以整合LUTs。
      • 在引入版本化之前,交易在其头部的第一个字节中保留了一个未使用的最高位,可以用来显式声明交易的版本。

      我们将更详细地讨论上述引入的更改以及它们对开发人员的意义。然而,为了更好地理解这些更改,我们首先需要了解常规(或传统)交易的结构。

      传统交易(Legacy Transactions)

      Solana网络使用最大事务单元(MTU)大小为1280字节,遵循IPv6 MTU 的大小约束,以确保速度和可靠性。这样留下了1232字节的数据空间,用于存储序列化的交易等数据。

      一个交易由以下组成:

      1. 一个紧凑数组的签名,其中每个签名是一个64字节的ed25519签名。
      2. 一个(传统的)消息。

      Transaction Format

      info

      tip Compact-Array format

      A compact array is an array serialised to have the following components:

      1. An array length in a multi-byte encoding called Compact-u16
      2. Followed by each array item

      Compact array format

      传统消息

      传统消息包含以下组件:

      1. 一个头部(header)。
      2. 一个紧凑数组的账户地址,每个账户地址占用32字节。
      3. 一个最近的区块哈希(recent blockhash):
        • 一个32字节的SHA-256哈希,用于指示上次观察到的账本状态。如果一个区块哈希太旧,验证节点将拒绝它。
      4. 一个紧凑数组的指令

      Legacy Message

      头部

      消息头部是3字节长,包含3个u8整数:

      1. 所需签名数量:Solana运行时会将此数字与交易中紧凑数组签名的长度进行验证。
      2. 需要签名的只读账户地址数量。
      3. 不需要签名的只读账户地址数量。

      Message Header

      紧凑账户地址数组

      这个紧凑数组以紧凑的u16编码的账户地址数量开始,然后是:

      1. 需要签名的账户地址:首先列出请求读取和写入访问权限的地址,然后是请求只读访问权限的地址。
      2. 不需要签名的账户地址:与上述相同,首先列出请求读取和写入访问权限的地址,然后是请求只读访问权限的地址。

      Compact array of account addresses

      紧凑指令数组

      就像账户地址数组一样,这个紧凑指令数组以紧凑的u16编码的指令数量开始,然后是一个指令数组。数组中的每个指令具有以下组件:

      1. 程序ID:用于标识将处理该指令的链上程序。它表示为消息中账户地址紧凑数组的地址的u8索引。
      2. 账户地址索引的紧凑数组:指向紧凑账户地址数组中需要签名的一部分账户地址的u8索引。
      3. 不透明的u8数据的紧凑数组:一个通用的字节数组,与前面提到的程序ID相关。该数据数组指定了程序应执行的任何操作以及账户可能不包含的任何附加信息。

      Compact array of Instructions

      传统交易的问题

      上述交易模型存在的问题是什么?

      交易的最大大小以及因此能够在单个原子交易中容纳的账户数量。

      如前所述,交易的最大允许大小为1232字节。一个账户地址的大小为32字节。因此,考虑到一些用于头部、签名和其他元数据的空间,一个交易最多只能存储35个账户。

      Issue with legacy transactions

      这是一个问题,因为有几种情况下,开发人员需要在单个交易中包含数百个无需签名的账户。但是,传统交易模型目前无法实现这一点。目前使用的解决方案是在链上临时存储状态,并在稍后的交易中使用。但是,当多个程序需要组合在单个交易中时,这种解决方法就不适用了。每个程序都需要多个账户作为输入,因此我们陷入了与之前相同的问题。

      这就是引入 地址查找表(Address Lookup Tables,LUT)的原因。

      地址查找表(Address Lookeup Tables)

      地址查找表的理念是在链上使用表格(数组)的数据结构存储账户地址。一旦账户存储在该表中,可以在交易消息中引用该表的地址。为了指向表中的单个账户,需要使用一个字节的u8索引。

      LUTs

      这样做可以节省空间,因为地址不再需要存储在交易消息中。它们只需要以数组形式的表格中的索引进行引用。这使得有可能引用256个账户,因为账户使用u8索引进行引用。

      当初始化地址查找表或向表中添加新地址时,需要使地址查找表免除租金。地址可以通过链上缓冲区或直接通过Extension指令将其追加到表格中。此外,地址查找表还可以存储相关的元数据,后面是一个紧凑数组的账户。下面是一个典型地址查找表的结构:

      LUT Format

      地址查找表的一个重要缺点是,在交易处理过程中,由于地址查找需要额外的开销,通常会导致交易的成本较高。

      版本化交易: TransactionV0

      传统交易的结构需要修改以包含地址表查找。这些更改不应破坏Solana上的交易处理,也不应对被调用的程序的格式产生任何更改。

      为了确保上述情况,重要的是明确指出交易类型:legacy(传统)或versioned(版本化)。我们如何在交易中包含这些信息呢?

      在引入版本化之前,交易在其消息头部的num_required_signatures字段的第一个字节中留下了一个未使用的上位比特。现在,我们可以使用这个比特位来明确声明我们的交易版本。

      pub enum VersionedMessage {
      Legacy(Message),
      V0(v0::Message),
      }

      如果设置了第一个比特位,那么第一个字节中的剩余比特将用于编码版本号。Solana从“版本0”开始,这是开始使用地址查找表的版本。

      如果未设置第一个比特位,那么该交易将被视为“传统交易”,并且第一个字节的剩余部分将被视为编码传统消息的第一个字节。

      MessageV0

      新的MessageV0的结构基本上是相同的,只是有两个小但重要的变化:

      1. 消息头部:与传统版本相同,没有变化。
      2. 紧凑账户密钥数组:与传统版本相同,没有变化。我们将指向该数组元素的索引数组表示为索引数组A(您很快将看到为什么我们这样表示)。
      3. 最近的区块哈希:与传统版本相同,没有变化。
      4. 紧凑指令数组:与传统版本不同,发生了变化。
      5. 地址表查找的紧凑数组:在版本0中引入。

      Message v0

      在查看指令数组中的变化之前,我们首先讨论地址表查找的紧凑数组的结构。

      地址表查找的紧凑数组

      这个结构将地址查找表(LUT)引入到版本化交易中,从而使得在单个交易中加载更多的只读和可写账户成为可能。

      紧凑数组以紧凑的u16编码表示地址表查找的数量,后跟一个地址表查找的数组。每个查找的结构如下:

      1. 账户密钥:地址查找表的账户密钥。
      2. 可写索引:用于加载可写账户地址的紧凑索引数组。我们将此数组表示为索引数组B
      3. 只读索引:用于加载只读账户地址的紧凑索引数组。我们将此数组表示为索引数组C

      Compact array of LUTs

      现在让我们看看指令紧凑数组中做了哪些改变。

      紧凑指令数组

      如前所述,传统指令的紧凑数组存储了各个传统指令,而这些指令又分别存储了以下内容:

      1. 程序ID索引
      2. 账户地址索引的紧凑数组
      3. 不透明的8位数据的紧凑数组

      新指令中的变化不在于指令本身的结构,而是在于用于获取第1和第2项索引的数组。在传统交易中,使用了索引数组A的子集,而在版本化交易中,则使用了以下组合数组的子集:

      1. 索引数组A:存储在消息中的紧凑账户数组。
      2. 索引数组B:地址表查找中的可写索引。
      3. 索引数组C:地址表查找中的只读索引。

      New Compact array of Instructions

      RPC变更

      事务响应将需要一个新的版本字段:maxSupportedTransactionVersion,以向客户端指示需要遵循的事务结构以进行反序列化。

      以下方法需要进行更新以避免错误:

      • getTransaction
      • getBlock

      请求中需要添加以下参数:

      maxSupportedTransactionVersion: 0

      如果请求中没有显式添加maxSupportedTransactionVersion,事务版本将回退到legacy。任何包含版本化事务的区块,在存在传统事务的情况下将返回客户端错误。

      你可以通过向RPC端点发送JSON格式的请求来设置如下:

      curl http://localhost:8899 -X POST -H "Content-Type: application/json" -d \
      '{"jsonrpc": "2.0", "id":1, "method": "getBlock", "params": [430, {
      "encoding":"json",
      "maxSupportedTransactionVersion":0,
      "transactionDetails":"full",
      "rewards":false
      }]}'

      你还可以使用 @solana/web3.js 库执行相同操作。

      // connect to the `devnet` cluster and get the current `slot`
      const connection = new web3.Connection(web3.clusterApiUrl("devnet"));
      const slot = await connection.getSlot();

      // get the latest block (allowing for v0 transactions)
      const block = await connection.getBlock(slot, {
      maxSupportedTransactionVersion: 0,
      });

      // get a specific transaction (allowing for v0 transactions)
      const getTx = await connection.getTransaction(
      "3jpoANiFeVGisWRY5UP648xRXs3iQasCHABPWRWnoEjeA93nc79WrnGgpgazjq4K9m8g2NJoyKoWBV1Kx5VmtwHQ",
      {
      maxSupportedTransactionVersion: 0,
      },
      );

      其他资料

      参考资料

      + \ No newline at end of file diff --git a/cookbook-zh/index.html b/cookbook-zh/index.html index 92dc2ec16..17c51e71d 100644 --- a/cookbook-zh/index.html +++ b/cookbook-zh/index.html @@ -5,7 +5,7 @@ Solana秘籍 | All in One Solana - + @@ -13,8 +13,8 @@

      Solana秘籍

      info

      《Solana 秘籍》中文取自:Solana Cookbook仓库里面已经有的中文版本。后期会根据官方的更新及时更新中文版本,由All in One Solana 社区维护。

      《Solana秘籍》力图为你提供在Solana公链上编写去中心化应用所需的核心概念、 参考。 每个概念和参考都会聚焦于Solana开发中的某个具体方面,同时提供额外的技术细节以及用例。

      贡献代码

      Solana秘籍的设计力图让新的Solana开发者也能容易的贡献代码。 即使你还不太了解如何做项目,贡献代码也是一个很好的学习过程!

      这里 -可以查看所有待解决的issue。

      info

      注意这里是中文版本的issue,如果你想查看英文版本的issue,请点击这里

      如果你觉得还有其他哪些建议,可以新建一个issue.

      如何阅读Solana秘籍

      Solana秘籍分为不同的章节。每个章节都有不同的目标。

      章节描述
      核心概念Solana的基础元素。开发者最好能了解这些内容。
      指南关于开发中所能用到的工具的简要介绍。
      参考常用的代码片段参考
      - +可以查看所有待解决的issue。

      info

      注意这里是中文版本的issue,如果你想查看英文版本的issue,请点击这里

      如果你觉得还有其他哪些建议,可以新建一个issue.

      如何阅读Solana秘籍

      Solana秘籍分为不同的章节。每个章节都有不同的目标。

      章节描述
      核心概念Solana的基础元素。开发者最好能了解这些内容。
      指南关于开发中所能用到的工具的简要介绍。
      参考常用的代码片段参考
      + \ No newline at end of file diff --git a/cookbook-zh/references/accounts/index.html b/cookbook-zh/references/accounts/index.html index eaa8bac46..871f57c14 100644 --- a/cookbook-zh/references/accounts/index.html +++ b/cookbook-zh/references/accounts/index.html @@ -5,15 +5,15 @@ 账户 | All in One Solana - +

      账户

      如何创建系统账户

      创建一个由系统程序 拥有的账户。Solana运行时将授予账户的所有者对其数据的写入权限或转移Lamports的访问权限。在创建账户时,我们需要预先分配一定大小的存储空间(space)和足够的Lamports来支付租金。 租金(Rent) 是在Solana上保持账户活跃所需支付的费用。

      const createAccountParams = {
      fromPubkey: fromPubkey.publicKey,
      newAccountPubkey: newAccountPubkey.publicKey,
      lamports: rentExemptionAmount,
      space,
      programId: SystemProgram.programId,
      };

      const createAccountTransaction = new Transaction().add(
      SystemProgram.createAccount(createAccountParams)
      );

      await sendAndConfirmTransaction(connection, createAccountTransaction, [
      fromPubkey,
      newAccountPubkey,
      ]);

      如何计算账户费用

      在Solana上保持账户活跃会产生一项存储费用,称为 租金/rent。通过存入至少两年租金的金额,你可以使账户完全免除租金收取。对于费用的计算,你需要考虑你打算在账户中存储的数据量。

      import { Connection, clusterApiUrl } from "@solana/web3.js";

      (async () => {
      const connection = new Connection(clusterApiUrl("devnet"), "confirmed");

      // length of data in the account to calculate rent for
      const dataLength = 1500;
      const rentExemptionAmount =
      await connection.getMinimumBalanceForRentExemption(dataLength);
      console.log({
      rentExemptionAmount,
      });
      })();

      如何使用种子创建账户

      你可以使用 createAccountWithSeed 方法来管理您的账户,而无需创建大量不同的密钥对。

      生成

      PublicKey.createWithSeed(basePubkey, seed, programId);

      创建

      const tx = new Transaction().add(
      SystemProgram.createAccountWithSeed({
      fromPubkey: feePayer.publicKey, // funder
      newAccountPubkey: derived,
      basePubkey: basePubkey,
      seed: seed,
      lamports: 1e8, // 0.1 SOL
      space: 0,
      programId: owner,
      })
      );

      console.log(
      `txhash: ${await sendAndConfirmTransaction(connection, tx, [feePayer, base])}`
      );

      转账

      const tx = new Transaction().add(
      SystemProgram.transfer({
      fromPubkey: derived,
      basePubkey: basePubkey,
      toPubkey: Keypair.generate().publicKey, // create a random receiver
      lamports: 0.01 * LAMPORTS_PER_SOL,
      seed: seed,
      programId: programId,
      })
      );
      console.log(
      `txhash: ${await sendAndConfirmTransaction(connection, tx, [feePayer, base])}`
      );
      info

      Only an account owned by system program can transfer via system program.

      贴士 只有由系统程序拥有的账户才能通过系统程序进行转账。

      如何创建PDA

      程序派生地址/Program derived address(PDA) 与普通地址相比具有以下区别:

      1. 不在ed25519曲线上
      2. 使用程序进行签名,而不是使用私钥
      info

      注意: PDA账户只能在程序上创建,地址可以在客户端创建。

      贴士 -尽管PDA是由程序ID派生的,但这并不意味着PDA归属于相同的程序。(举个例子,你可以将PDA初始化为代币账户,这是一个由代币程序拥有的账户)

      生成一个PDA

      findProgramAddress会在你的种子末尾添加一个额外的字节。它从255递减到0,并返回第一个不在ed25519曲线上的公钥。如果您传入相同的程序ID和种子,您将始终获得相同的结果。

      import { PublicKey } from "@solana/web3.js";

      (async () => {
      const programId = new PublicKey(
      "G1DCNUQTSGHehwdLCAmRyAG8hf51eCHrLNUqkgGKYASj"
      );

      let [pda, bump] = await PublicKey.findProgramAddress(
      [Buffer.from("test")],
      programId
      );
      console.log(`bump: ${bump}, pubkey: ${pda.toBase58()}`);
      // you will find the result is different from `createProgramAddress`.
      // It is expected because the real seed we used to calculate is ["test" + bump]
      })();

      创建一个PDA

      以下是一个创建由程序拥有的PDA账户的示例程序,以及一个使用客户端调用该程序的示例。

      下面是一个示例,展示了使用system_instruction::create_account创建一个具有预分配数据大小为space、预支付rent_lamports数量的lamports的PDA账户的单条指令。该指令使用PDA进行签名,并使用invoke_signed进行调用,与前面讨论的类似。

      invoke_signed(
      &system_instruction::create_account(
      &payer_account_info.key,
      &pda_account_info.key,
      rent_lamports,
      space.into(),
      program_id
      ),
      &[
      payer_account_info.clone(),
      pda_account_info.clone()
      ],
      &[&[&payer_account_info.key.as_ref(), &[bump]]]
      )?;

      如何使用PDA签名

      PDAs只能在程序内部进行签名。以下是使用PDA进行签名的程序示例,并使用客户端调用该程序的示例。

      以下示例展示了一个单个指令,用于从由种子escrow派生的 PDA 转账 SOL 到指定的账户。使用 invoke_signed 函数来使用 PDA 签名。

      invoke_signed(
      &system_instruction::transfer(
      &pda_account_info.key,
      &to_account_info.key,
      100_000_000, // 0.1 SOL
      ),
      &[
      pda_account_info.clone(),
      to_account_info.clone(),
      system_program_account_info.clone(),
      ],
      &[&[b"escrow", &[bump_seed]]],
      )?;

      如何获取程序账户

      返回所有由程序拥有的账户。请参考 指南部分 ,获取有关getProgramAccounts及其配置的更多信息。

      import { clusterApiUrl, Connection, PublicKey } from "@solana/web3.js";

      (async () => {
      const MY_PROGRAM_ID = new PublicKey(
      "6a2GdmttJdanBkoHt7f4Kon4hfadx4UTUgJeRkCaiL3U"
      );
      const connection = new Connection(clusterApiUrl("devnet"), "confirmed");

      const accounts = await connection.getProgramAccounts(MY_PROGRAM_ID);

      console.log(`Accounts for program ${MY_PROGRAM_ID}: `);
      console.log(accounts);

      /*
      // Output

      Accounts for program 6a2GdmttJdanBkoHt7f4Kon4hfadx4UTUgJeRkCaiL3U:
      [
      {
      account: {
      data: <Buffer 60 06 66 ca 2c 1d c7 85 04 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 fc>,
      executable: false,
      lamports: 1064880,
      owner: [PublicKey],
      rentEpoch: 228
      },
      pubkey: PublicKey {
      _bn: <BN: 82fc5b91154dc5c840cb464ba6a89212d0fd789367c0a1488fb1941d78f9727a>
      }
      },
      {
      account: {
      data: <Buffer 60 06 66 ca 2c 1d c7 85 03 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 fd>,
      executable: false,
      lamports: 1064880,
      owner: [PublicKey],
      rentEpoch: 229
      },
      pubkey: PublicKey {
      _bn: <BN: 404dc1fe368cf194f20cf3c681a071c61893ced98f65cda12ba5a147e984e669>
      }
      }
      ]
      */
      })();

      如何关闭账户

      你可以通过移除账户中的所有 SOL(以擦除所有存储数据的方式)来关闭一个账户。(你可以参考rent来了解更多信息。)

      let dest_starting_lamports = dest_account_info.lamports();
      **dest_account_info.lamports.borrow_mut() = dest_starting_lamports
      .checked_add(source_account_info.lamports())
      .unwrap();
      **source_account_info.lamports.borrow_mut() = 0;

      let mut source_data = source_account_info.data.borrow_mut();
      source_data.fill(0);

      如何获取账户余额

      console.log(`${(await connection.getBalance(wallet)) / LAMPORTS_PER_SOL} SOL`);
      info

      如果你想获取代币余额,你需要知道代币账户的地址。如果像了解更多信息,请参考Token References。

      - +尽管PDA是由程序ID派生的,但这并不意味着PDA归属于相同的程序。(举个例子,你可以将PDA初始化为代币账户,这是一个由代币程序拥有的账户)

      生成一个PDA

      findProgramAddress会在你的种子末尾添加一个额外的字节。它从255递减到0,并返回第一个不在ed25519曲线上的公钥。如果您传入相同的程序ID和种子,您将始终获得相同的结果。

      import { PublicKey } from "@solana/web3.js";

      (async () => {
      const programId = new PublicKey(
      "G1DCNUQTSGHehwdLCAmRyAG8hf51eCHrLNUqkgGKYASj"
      );

      let [pda, bump] = await PublicKey.findProgramAddress(
      [Buffer.from("test")],
      programId
      );
      console.log(`bump: ${bump}, pubkey: ${pda.toBase58()}`);
      // you will find the result is different from `createProgramAddress`.
      // It is expected because the real seed we used to calculate is ["test" + bump]
      })();

      创建一个PDA

      以下是一个创建由程序拥有的PDA账户的示例程序,以及一个使用客户端调用该程序的示例。

      下面是一个示例,展示了使用system_instruction::create_account创建一个具有预分配数据大小为space、预支付rent_lamports数量的lamports的PDA账户的单条指令。该指令使用PDA进行签名,并使用invoke_signed进行调用,与前面讨论的类似。

      invoke_signed(
      &system_instruction::create_account(
      &payer_account_info.key,
      &pda_account_info.key,
      rent_lamports,
      space.into(),
      program_id
      ),
      &[
      payer_account_info.clone(),
      pda_account_info.clone()
      ],
      &[&[&payer_account_info.key.as_ref(), &[bump]]]
      )?;

      如何使用PDA签名

      PDAs只能在程序内部进行签名。以下是使用PDA进行签名的程序示例,并使用客户端调用该程序的示例。

      以下示例展示了一个单个指令,用于从由种子escrow派生的 PDA 转账 SOL 到指定的账户。使用 invoke_signed 函数来使用 PDA 签名。

      invoke_signed(
      &system_instruction::transfer(
      &pda_account_info.key,
      &to_account_info.key,
      100_000_000, // 0.1 SOL
      ),
      &[
      pda_account_info.clone(),
      to_account_info.clone(),
      system_program_account_info.clone(),
      ],
      &[&[b"escrow", &[bump_seed]]],
      )?;

      如何获取程序账户

      返回所有由程序拥有的账户。请参考 指南部分 ,获取有关getProgramAccounts及其配置的更多信息。

      import { clusterApiUrl, Connection, PublicKey } from "@solana/web3.js";

      (async () => {
      const MY_PROGRAM_ID = new PublicKey(
      "6a2GdmttJdanBkoHt7f4Kon4hfadx4UTUgJeRkCaiL3U"
      );
      const connection = new Connection(clusterApiUrl("devnet"), "confirmed");

      const accounts = await connection.getProgramAccounts(MY_PROGRAM_ID);

      console.log(`Accounts for program ${MY_PROGRAM_ID}: `);
      console.log(accounts);

      /*
      // Output

      Accounts for program 6a2GdmttJdanBkoHt7f4Kon4hfadx4UTUgJeRkCaiL3U:
      [
      {
      account: {
      data: <Buffer 60 06 66 ca 2c 1d c7 85 04 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 fc>,
      executable: false,
      lamports: 1064880,
      owner: [PublicKey],
      rentEpoch: 228
      },
      pubkey: PublicKey {
      _bn: <BN: 82fc5b91154dc5c840cb464ba6a89212d0fd789367c0a1488fb1941d78f9727a>
      }
      },
      {
      account: {
      data: <Buffer 60 06 66 ca 2c 1d c7 85 03 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 fd>,
      executable: false,
      lamports: 1064880,
      owner: [PublicKey],
      rentEpoch: 229
      },
      pubkey: PublicKey {
      _bn: <BN: 404dc1fe368cf194f20cf3c681a071c61893ced98f65cda12ba5a147e984e669>
      }
      }
      ]
      */
      })();

      如何关闭账户

      你可以通过移除账户中的所有 SOL(以擦除所有存储数据的方式)来关闭一个账户。(你可以参考rent来了解更多信息。)

      let dest_starting_lamports = dest_account_info.lamports();
      **dest_account_info.lamports.borrow_mut() = dest_starting_lamports
      .checked_add(source_account_info.lamports())
      .unwrap();
      **source_account_info.lamports.borrow_mut() = 0;

      let mut source_data = source_account_info.data.borrow_mut();
      source_data.fill(0);

      如何获取账户余额

      console.log(`${(await connection.getBalance(wallet)) / LAMPORTS_PER_SOL} SOL`);
      info

      如果你想获取代币余额,你需要知道代币账户的地址。如果像了解更多信息,请参考Token References。

      + \ No newline at end of file diff --git a/cookbook-zh/references/basic-transactions/index.html b/cookbook-zh/references/basic-transactions/index.html index 3f173205f..f2d1637f4 100644 --- a/cookbook-zh/references/basic-transactions/index.html +++ b/cookbook-zh/references/basic-transactions/index.html @@ -5,14 +5,14 @@ 发送交易 | All in One Solana - +

      发送交易

      如何发送SOL

      要发送SOL,你需要与SystemProgram 交互。

      const transferTransaction = new Transaction().add(
      SystemProgram.transfer({
      fromPubkey: fromKeypair.publicKey,
      toPubkey: toKeypair.publicKey,
      lamports: lamportsToSend,
      })
      );

      await sendAndConfirmTransaction(connection, transferTransaction, [fromKeypair]);

      如何发送SPL-代币

      使用 Token Program 来转移SPL代币。为了发送SPL代币,你需要知道它的SPL代币账户地址。你可以使用以下示例来获取地址并发送代币。

      // Add token transfer instructions to transaction
      const transaction = new web3.Transaction().add(
      splToken.Token.createTransferInstruction(
      splToken.TOKEN_PROGRAM_ID,
      fromTokenAccount.address,
      toTokenAccount.address,
      fromWallet.publicKey,
      [],
      1
      )
      );

      // Sign transaction, broadcast, and confirm
      await web3.sendAndConfirmTransaction(connection, transaction, [fromWallet]);

      如何计算交易成本

      交易所需的签名数量用于计算交易成本。只要你不是创建账户,这将是最终的交易成本。如果想了解创建账户的成本,请参考 计算租金豁免

      下面的两个示例展示了目前可用于计算估计交易成本的两种方法。

      第一个示例使用了Transaction类上的新方法getEstimatedFee,而第二个示例使用了Connection类上的getFeeForMessage来替代getFeeCalculatorForBlockhash

      getEstimatedFee

      const recentBlockhash = await connection.getLatestBlockhash();

      const transaction = new Transaction({
      recentBlockhash: recentBlockhash.blockhash,
      }).add(
      SystemProgram.transfer({
      fromPubkey: payer.publicKey,
      toPubkey: payee.publicKey,
      lamports: 10,
      })
      );

      const fees = await transaction.getEstimatedFee(connection);
      console.log(`Estimated SOL transfer cost: ${fees} lamports`);
      // Estimated SOL transfer cost: 5000 lamports

      getFeeForMessage

      const message = new Message(messageParams);

      const fees = await connection.getFeeForMessage(message);
      console.log(`Estimated SOL transfer cost: ${fees.value} lamports`);
      // Estimated SOL transfer cost: 5000 lamports

      如何向交易添加备注

      任何交易都可以利用 备注程序 (memo program). -添加消息。目前,备注程序的programID必须手动添加为MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr

      const transferTransaction = new Transaction().add(
      SystemProgram.transfer({
      fromPubkey: fromKeypair.publicKey,
      toPubkey: toKeypair.publicKey,
      lamports: lamportsToSend,
      })
      );

      await transferTransaction.add(
      new TransactionInstruction({
      keys: [{ pubkey: fromKeypair.publicKey, isSigner: true, isWritable: true }],
      data: Buffer.from("Data to send in transaction", "utf-8"),
      programId: new PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),
      })
      );

      await sendAndConfirmTransaction(connection, transferTransaction, [fromKeypair]);

      如何更改交易的计算预算、费用和优先级

      交易(TX)的优先级是通过支付优先级费用(Prioritization Fee)来实现的,此外还需要支付基本费用(Base Fee)。默认情况下,计算预算是200,000个计算单元(Compute Units,CU)与指令数的乘积,最大为1.4M CU。基本费用是5,000个Lamport。一个微型Lamport等于0.000001个Lamport。

      要更改单个交易的总计算预算或优先级费用,可以通过添加ComputeBudgetProgram的指令来实现。

      使用ComputeBudgetProgram.setComputeUnitPrice({ microLamports: number })可以在基本费用(5,000个Lamport)之上添加优先级费用。microLamports参数提供的值将与计算预算的CU数相乘,以确定优先级费用(以Lamport为单位)。例如,如果您的计算预算为1M CU,然后添加1个microLamport/CU,优先级费用将为1个Lamport(1M * 0.000001)。总费用将为5001个Lamport。

      使用ComputeBudgetProgram.setComputeUnitLimit({ units: number })来设置新的计算预算。提供的值将替换默认值。交易应该请求执行所需的最小数量的CU,以最大化吞吐量或最小化费用。

      const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({
      units: 1000000
      });

      const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({
      microLamports: 1
      });

      const transaction = new Transaction()
      .add(modifyComputeUnits)
      .add(addPriorityFee)
      .add(
      SystemProgram.transfer({
      fromPubkey: payer.publicKey,
      toPubkey: toAccount,
      lamports: 10000000,
      })
      );

      程序日志示例 ( Explorer ):

      // cli
      [ 1] Program ComputeBudget111111111111111111111111111111 invoke [1]
      [ 2] Program ComputeBudget111111111111111111111111111111 success
      [ 3]
      [ 4] Program ComputeBudget111111111111111111111111111111 invoke [1]
      [ 5] Program ComputeBudget111111111111111111111111111111 success
      - +添加消息。目前,备注程序的programID必须手动添加为MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr

      const transferTransaction = new Transaction().add(
      SystemProgram.transfer({
      fromPubkey: fromKeypair.publicKey,
      toPubkey: toKeypair.publicKey,
      lamports: lamportsToSend,
      })
      );

      await transferTransaction.add(
      new TransactionInstruction({
      keys: [{ pubkey: fromKeypair.publicKey, isSigner: true, isWritable: true }],
      data: Buffer.from("Data to send in transaction", "utf-8"),
      programId: new PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),
      })
      );

      await sendAndConfirmTransaction(connection, transferTransaction, [fromKeypair]);

      如何更改交易的计算预算、费用和优先级

      交易(TX)的优先级是通过支付优先级费用(Prioritization Fee)来实现的,此外还需要支付基本费用(Base Fee)。默认情况下,计算预算是200,000个计算单元(Compute Units,CU)与指令数的乘积,最大为1.4M CU。基本费用是5,000个Lamport。一个微型Lamport等于0.000001个Lamport。

      要更改单个交易的总计算预算或优先级费用,可以通过添加ComputeBudgetProgram的指令来实现。

      使用ComputeBudgetProgram.setComputeUnitPrice({ microLamports: number })可以在基本费用(5,000个Lamport)之上添加优先级费用。microLamports参数提供的值将与计算预算的CU数相乘,以确定优先级费用(以Lamport为单位)。例如,如果您的计算预算为1M CU,然后添加1个microLamport/CU,优先级费用将为1个Lamport(1M * 0.000001)。总费用将为5001个Lamport。

      使用ComputeBudgetProgram.setComputeUnitLimit({ units: number })来设置新的计算预算。提供的值将替换默认值。交易应该请求执行所需的最小数量的CU,以最大化吞吐量或最小化费用。

      const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({
      units: 1000000
      });

      const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({
      microLamports: 1
      });

      const transaction = new Transaction()
      .add(modifyComputeUnits)
      .add(addPriorityFee)
      .add(
      SystemProgram.transfer({
      fromPubkey: payer.publicKey,
      toPubkey: toAccount,
      lamports: 10000000,
      })
      );

      程序日志示例 ( Explorer ):

      // cli
      [ 1] Program ComputeBudget111111111111111111111111111111 invoke [1]
      [ 2] Program ComputeBudget111111111111111111111111111111 success
      [ 3]
      [ 4] Program ComputeBudget111111111111111111111111111111 invoke [1]
      [ 5] Program ComputeBudget111111111111111111111111111111 success
      + \ No newline at end of file diff --git a/cookbook-zh/references/gaming/auto-approve/index.html b/cookbook-zh/references/gaming/auto-approve/index.html index a62b9197a..90265af01 100644 --- a/cookbook-zh/references/gaming/auto-approve/index.html +++ b/cookbook-zh/references/gaming/auto-approve/index.html @@ -5,7 +5,7 @@ auto-approve | All in One Solana - + @@ -13,8 +13,8 @@

      auto-approve

      WIP - This is a work in progress

      How to auto approve transaction for fast game play and great ux

      To have a fluid game play for on-chain games it is beneficial to have an auto approve wallet.

      1. Solflare wallet offers auto-approve functionality with burner wallets, but this limits your players to only one wallet.

      Burner Auto Approve Wallets

      1. Another way to do it is to create a key pair in your game and let the player transfer some sol to that wallet and then use it to pay for transaction fees. Only problem with this is that you need to handle the security for this wallet and the players would need to have access to their seed phrase.

      Example Source Code
      Example Game

      1. You can pay the fees yourself, by creating and signing the transactions in the backend and interact with it via an API. For that you send parameters to your backend and sign the transaction there and send a confirmation to the client as soon as it is done.

      2. There is a protocol called @gumisfunn and they released a feature called session keys. Session Keys are ephemeral keys with fine-grained program/instruction scoping for tiered access in your @solana programs. They allow users to interact with apps under particular parameters like duration, max tokens, amount of posts or any other function specific to an app. -Link

      - +Link

    2. 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

      XDBO+s{QgOdUPGip7 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�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

  • Full C# Source Code

  • public async void MoveRight()
    {
    PublicKey.TryFindProgramAddress(new[]
    {
    Encoding.UTF8.GetBytes("level1")
    },
    ProgramId, out gameDataAccount, out var bump);

    MoveRightAccounts account = new MoveRightAccounts();
    account.GameDataAccount = gameDataAccount;
    TransactionInstruction moveRightInstruction = TinyAdventureProgram.MoveRight(account, ProgramId);

    var walletHolderService = ServiceFactory.Resolve<WalletHolderService>();
    var result = await walletHolderService.BaseWallet.ActiveRpcClient.GetRecentBlockHashAsync(Commitment.Confirmed);

    Transaction transaction = new Transaction();
    transaction.FeePayer = walletHolderService.BaseWallet.Account.PublicKey;
    transaction.RecentBlockHash = result.Result.Value.Blockhash;
    transaction.Signatures = new List<SignaturePubKeyPair>();
    transaction.Instructions = new List<TransactionInstruction>();
    transaction.Instructions.Add(moveRightInstruction);

    Transaction signedTransaction = await walletHolderService.BaseWallet.SignTransaction(transaction);

    RequestResult<string> signature = await walletHolderService.BaseWallet.ActiveRpcClient.SendTransactionAsync(
    Convert.ToBase64String(signedTransaction.Serialize()),
    true, Commitment.Confirmed);
    }
    + \ No newline at end of file diff --git a/cookbook-zh/references/gaming/saving-game-state/index.html b/cookbook-zh/references/gaming/saving-game-state/index.html index e3b0ff597..390dc921f 100644 --- a/cookbook-zh/references/gaming/saving-game-state/index.html +++ b/cookbook-zh/references/gaming/saving-game-state/index.html @@ -5,7 +5,7 @@ save game state | All in One Solana - + @@ -13,8 +13,8 @@

    How to save game state

    You can use Solana block chain to save the state of your game in program accounts. These are accounts that are owned by your program and they are derived from the program Id and some seeds. These can be thought of as data base entries. We can for example create a PlayerData account and use the players public key as a seed. This means every player can have one player account per wallet. These accounts can be up to 10Kb by default. If you need a bigger account look into Manage big accounts This can be done in a program like this:

    pub fn init_player(ctx: Context<InitPlayer>) -> Result<()> {
    ctx.accounts.player.energy = MAX_ENERGY;
    ctx.accounts.player.health = MAX_HEALTH;
    ctx.accounts.player.last_login = Clock::get()?.unix_timestamp;
    Ok(())
    }

    #[derive(Accounts)]
    pub struct InitPlayer <'info> {
    #[account(
    init,
    payer = signer,
    space = 1000,
    seeds = [b"player".as_ref(), signer.key().as_ref()],
    bump,
    )]
    pub player: Account<'info, PlayerData>,
    #[account(mut)]
    pub signer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    #[account]
    pub struct PlayerData {
    pub name: String,
    pub level: u8,
    pub xp: u64,
    pub health: u64,
    pub log: u64,
    pub energy: u64,
    pub last_login: i64
    }

    You can then interact with this player data via transaction instructions. Lets say we want the player to get experience for killing a monster for example:

        pub fn kill_enemy(mut ctx: Context<KillEnemy>, enemyId: u8) -> Result<()> {
    let account = &mut ctx.accounts;

    ... handle energy

    if ctx.accounts.player.energy == 0 {
    return err!(ErrorCode::NotEnoughEnergy);
    }

    ... get enemy values by id and calculate battle

    ctx.accounts.player.xp = ctx.accounts.player.xp + 1;
    ctx.accounts.player.energy = ctx.accounts.player.energy - 1;

    ... handle level up

    msg!("You killed enemy and got 1 xp. You have {} xp and {} energy left.", ctx.accounts.player.xp, ctx.accounts.player.energy);
    Ok(())
    }

    This is how this would look like from a js client:

    const wallet = useAnchorWallet();
    const provider = new AnchorProvider(connection, wallet, {});
    setProvider(provider);
    const program = new Program(IDL, PROGRAM_ID, provider);

    const [pda] = PublicKey.findProgramAddressSync(
    [Buffer.from("player", "utf8"),
    publicKey.toBuffer()],
    new PublicKey(PROGRAM_ID)
    );

    try {
    const transaction = program.methods
    .initPlayer()
    .accounts({
    player: pda,
    signer: publicKey,
    systemProgram: SystemProgram.programId,
    })
    .transaction();

    const tx = await transaction;
    const txSig = await sendTransaction(tx, connection);
    await connection.confirmTransaction(txSig, "confirmed");

    How to actually build this energy system you can learn here: -Building an Energy system

    - +Building an Energy system

    + \ No newline at end of file diff --git a/cookbook-zh/references/gaming/store-sol-in-pda/index.html b/cookbook-zh/references/gaming/store-sol-in-pda/index.html index 317613ebd..4fe489519 100644 --- a/cookbook-zh/references/gaming/store-sol-in-pda/index.html +++ b/cookbook-zh/references/gaming/store-sol-in-pda/index.html @@ -5,15 +5,15 @@ Storing SOL in PDA | All in One Solana - +

    Storing SOL in PDAs for Game Rewards

    Video Walkthrough:

    Live Version. (use devnet) -

    Tiny Adventure Anchor Program - Part Two

    In this tutorial, we will rebuild the Tiny Adventure game and introduce a chest with a reward of 0.1 SOL. The chest will "spawn" at a specific position, and when the player reaches that position, they will receive the reward. The goal of this program is to demonstrate how to store SOL within a program account and distribute it to players.

    The Tiny Adventure Two Program consists of 3 instructions:

    • initialize_level_one - This instruction initializes two on-chain accounts: one for recording the player's position and another for holding the SOL reward that represents the “reward chest”.
    • reset_level_and_spawn_chest - This instruction resets the player's position to zero and "respawns" a reward chest by transferring SOL from the user invoking the instruction to the reward chest account.
    • move_right - This instruction allows the player to move their position to the right and collect the SOL in the reward chest once they reach a specific position.

    In the following sections, we will guide you through building the program step by step. You can find the complete source code, which can be deployed directly from your browser using the Solana Playground, at this link: Open In Playground.

    Getting Started

    To start building the Tiny Adventure game, follow these steps:

    Visit the Solana Playground and create a new Anchor project. If you're new to Solana Playground, you'll also need to create a Playground Wallet.

    After creating a new project, replace the default starter code with the code below:

    use anchor_lang::prelude::*;
    use anchor_lang::solana_program::native_token::LAMPORTS_PER_SOL;
    use anchor_lang::system_program;

    declare_id!("11111111111111111111111111111111");

    #[program]
    mod tiny_adventure_two {
    use super::*;
    }

    fn print_player(player_position: u8) {
    if player_position == 0 {
    msg!("A Journey Begins!");
    msg!("o.........💎");
    } else if player_position == 1 {
    msg!("..o.......💎");
    } else if player_position == 2 {
    msg!("....o.....💎");
    } else if player_position == 3 {
    msg!("........\\o/💎");
    msg!("..........\\o/");
    msg!("You have reached the end! Super!");
    }
    }

    In this game, the player starts at position 0 and can only move right. To visualize the player's progress throughout the game, we'll use message logs to represent their journey towards the reward chest!

    Defining the Chest Vault Account

    Add the CHEST_REWARD constant at the beginning of the program. The CHEST_REWARD represents the amount of lamports that will be put into the chest and given out as rewards. Lamports are the smallest fractions of a SOL, with 1 billion lamports being equal to 1 SOL.

    To store the SOL reward, we will define a new ChestVaultAccount struct. This is an empty struct because we will be directly updating the lamports in the account. The account will hold the SOL reward and does not need to store any additional data.

    use anchor_lang::prelude::*;
    use anchor_lang::solana_program::native_token::LAMPORTS_PER_SOL;
    use anchor_lang::system_program;

    declare_id!("11111111111111111111111111111111");

    #[program]
    mod tiny_adventure_two {
    use super::*;

    // The amount of lamports that will be put into chests and given out as rewards.
    const CHEST_REWARD: u64 = LAMPORTS_PER_SOL / 10; // 0.1 SOL
    }

    ...

    // Define the Chest Vault Account structure
    #[account]
    pub struct ChestVaultAccount {}

    Defining the Game Data Account

    To keep track of the player's position within the game, we need to define a structure for the on-chain account that will store the player's position.

    The GameDataAccount struct contains a single field, player_position, which stores the player's current position as an unsigned 8-bit integer.


    use anchor_lang::prelude::*;
    use anchor_lang::solana_program::native_token::LAMPORTS_PER_SOL;
    use anchor_lang::system_program;

    declare_id!("11111111111111111111111111111111");

    #[program]
    mod tiny_adventure_two {
    use super::*;
    ...

    }

    ...

    // Define the Game Data Account structure
    #[account]
    pub struct GameDataAccount {
    player_position: u8,
    }

    With the GameDataAccount struct defined, you can now use it to store and update the player's position as they interact with the game. As the player moves right and progresses through the game, their position will be updated within the GameDataAccount, allowing you to track their progress towards the chest containing the SOL reward.

    Initialize Level One Instruction

    With the GameDataAccount and ChestVaultAccount defined, let's implement the initialize_level_one instruction. This instruction initializes both the GameDataAccount and ChestVaultAccount, sets the player's position to 0, and displays the starting message.

    The initialize_level_one instruction requires 4 accounts:

    • new_game_data_account - the GameDataAccount we are initializing to store the player’s position
    • chest_vault - the ChestVaultAccount we are initializing to store the SOL reward
    • signer - the player paying for the initialization of the accounts
    • system_program - a required account when creating a new account
    #[program]
    pub mod tiny_adventure_two {
    use super::*;

    pub fn initialize_level_one(_ctx: Context<InitializeLevelOne>) -> Result<()> {
    msg!("A Journey Begins!");
    msg!("o.......💎");
    Ok(())
    }

    ...
    }

    // Specify the accounts required by the initialize_level_one instruction
    #[derive(Accounts)]
    pub struct InitializeLevelOne<'info> {
    #[account(
    init_if_needed,
    seeds = [b"level1"],
    bump,
    payer = signer,
    space = 8 + 1
    )]
    pub new_game_data_account: Account<'info, GameDataAccount>,
    #[account(
    init_if_needed,
    seeds = [b"chestVault"],
    bump,
    payer = signer,
    space = 8
    )]
    pub chest_vault: Account<'info, ChestVaultAccount>,
    #[account(mut)]
    pub signer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    ...

    Both the GameDataAccount and ChestVaultAccount are created using a Program Derived Address (PDA) as the address of the account, allowing us to deterministically locate the address later. The init_if_needed constraint ensures that the accounts are only initialized if they don't already exist. Since the PDAs for both accounts in this instruction use a single fixed seed, our program can only create one of each type of account. In effect, the instruction would only ever need to be invoked one time.

    It's worth noting that the current implementation does not have any restrictions on who can modify the GameDataAccount, effectively turning the game into a multiplayer experience where everyone can control the player's movement.

    Alternatively, you can use the signer's address as an extra seed in the initialize instruction, allowing each player to create their own GameDataAccount.

    Reset Level and Spawn Chest Instruction

    Next, let's implement the reset_level_and_spawn_chest instruction, which resets the player's position to the start and fills up the chest with a reward of 0.1 SOL.

    The reset_level_and_spawn_chest instruction requires 4 accounts:

    • new_game_data_account - the GameDataAccount storing the player's position
    • chest_vault - the ChestVaultAccount storing the SOL reward
    • signer - the player providing the SOL reward for the chest
    • system_program - the program we'll be invoking to transfer SOL using a cross-program invocation (CPI), more on this shortly
    #[program]
    pub mod tiny_adventure_two {
    use super::*;
    ...

    pub fn reset_level_and_spawn_chest(ctx: Context<SpawnChest>) -> Result<()> {
    ctx.accounts.game_data_account.player_position = 0;

    let cpi_context = CpiContext::new(
    ctx.accounts.system_program.to_account_info(),
    system_program::Transfer {
    from: ctx.accounts.payer.to_account_info().clone(),
    to: ctx.accounts.chest_vault.to_account_info().clone(),
    },
    );
    system_program::transfer(cpi_context, CHEST_REWARD)?;

    msg!("Level Reset and Chest Spawned at position 3");

    Ok(())
    }

    ...
    }

    // Specify the accounts required by the reset_level_and_spawn_chest instruction
    #[derive(Accounts)]
    pub struct SpawnChest<'info> {
    #[account(mut)]
    pub payer: Signer<'info>,
    #[account(mut, seeds = [b"chestVault"], bump)]
    pub chest_vault: Account<'info, ChestVaultAccount>,
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    pub system_program: Program<'info, System>,
    }

    ...

    This instruction includes a cross-program invocation (CPI) to transfer SOL from the payer to the ChestVaultAccount. A cross-program invocation is when one program invokes an instruction on another program. In this case, we use a CPI to invoke the Transfer instruction from the system_program to transfer SOL from the payer to the ChestVaultAccount.

    Cross-program invocations are a key concept in the Solana programming model, enabling programs to directly interact with instructions from other programs. For a deeper dive into of CPIs, feel free to explore the CPI lessons available in the Solana Course.

    Move Right Instruction

    Finally, let's implement the move_right instruction which includes the logic for collecting the chest reward. When a player reaches position 3 and inputs the correct “password”, the reward is transferred from the ChestVaultAccount to the player's account. If an incorrect password is entered, a custom Anchor Error is returned. If the player is already at position 3, a message will be logged. Otherwise, the position will be incremented by 1 to represent moving to the right.

    The main purpose of this "password" functionality is to demonstrate how to incorporate parameters into an instruction and the implementation of custom Anchor Errors for improved error handling. In this example, the correct password will be "gib".

    The move_right instruction requires 3 accounts:

    • new_game_data_account - the GameDataAccount storing the player's position
    • chest_vault - the ChestVaultAccount storing the SOL reward
    • player_wallet - the wallet of the player invoking the instruction and the potential recipient of SOL reward
    #[program]
    pub mod tiny_adventure_two {
    use super::*;
    ...

    // Instruction to move right
    pub fn move_right(ctx: Context<MoveRight>, password: String) -> Result<()> {
    let game_data_account = &mut ctx.accounts.game_data_account;
    if game_data_account.player_position == 3 {
    msg!("You have reached the end! Super!");
    } else if game_data_account.player_position == 2 {
    if password != "gib" {
    return err!(MyError::WrongPassword);
    }

    game_data_account.player_position = game_data_account.player_position + 1;

    msg!(
    "You made it! Here is your reward {0} lamports",
    CHEST_REWARD
    );

    **ctx
    .accounts
    .chest_vault
    .to_account_info()
    .try_borrow_mut_lamports()? -= CHEST_REWARD;
    **ctx
    .accounts
    .player
    .to_account_info()
    .try_borrow_mut_lamports()? += CHEST_REWARD;
    } else {
    game_data_account.player_position = game_data_account.player_position + 1;
    print_player(game_data_account.player_position);
    }
    Ok(())
    }

    ...
    }

    // Specify the accounts required by the move_right instruction
    #[derive(Accounts)]
    pub struct MoveRight<'info> {
    #[account(mut, seeds = [b"chestVault"], bump)]
    pub chest_vault: Account<'info, ChestVaultAccount>,
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    #[account(mut)]
    pub player: Signer<'info>,
    }

    // Custom Anchor Error
    #[error_code]
    pub enum MyError {
    #[msg("Password was wrong")]
    WrongPassword,
    }

    ...

    To transfer lamports from the reward chest to the player account, we can't use a Cross-Program Invocation (CPI) as we did previously, since the ChestVaultAccount isn't owned by the system program. Instead, we directly modify the lamports within the accounts by using try_borrow_mut_lamports. Keep in mind that the account you deduct lamports from must be a signer, and the runtime always makes sure that the total account balances stay equal after a transaction.

    Note that Program Derived Accounts (PDAs) offer two main features:

    1. Provide a deterministic way to find an account's address
    2. Allow the program from which a PDA is derived to "sign" for them

    This is the reason we are able to deduct lamports from the ChestVaultAccount without explicitly requiring an extra signer for the instruction.

    Build and Deploy

    Great job! You've now completed part two of the Tiny Adventure program! Your final program should look like this:

    use anchor_lang::prelude::*;
    use anchor_lang::solana_program::native_token::LAMPORTS_PER_SOL;
    use anchor_lang::system_program;

    // This is your program's public key and it will update
    // automatically when you build the project.
    declare_id!("7gZTdZg86YsYbs92Rhv63kZUAkoww1kLexJg8sNpgVQ3");

    #[program]
    mod tiny_adventure_two {
    use super::*;

    // The amount of lamports that will be put into chests and given out as rewards.
    const CHEST_REWARD: u64 = LAMPORTS_PER_SOL / 10; // 0.1 SOL

    pub fn initialize_level_one(_ctx: Context<InitializeLevelOne>) -> Result<()> {
    // Usually in your production code you would not print lots of text because it cost compute units.
    msg!("A Journey Begins!");
    msg!("o.......💎");
    Ok(())
    }

    pub fn reset_level_and_spawn_chest(ctx: Context<SpawnChest>) -> Result<()> {
    ctx.accounts.game_data_account.player_position = 0;

    let cpi_context = CpiContext::new(
    ctx.accounts.system_program.to_account_info(),
    system_program::Transfer {
    from: ctx.accounts.payer.to_account_info().clone(),
    to: ctx.accounts.chest_vault.to_account_info().clone(),
    },
    );
    system_program::transfer(cpi_context, CHEST_REWARD)?;

    msg!("Level Reset and Chest Spawned at position 3");

    Ok(())
    }

    pub fn move_right(ctx: Context<MoveRight>, password: String) -> Result<()> {
    let game_data_account = &mut ctx.accounts.game_data_account;
    if game_data_account.player_position == 3 {
    msg!("You have reached the end! Super!");
    } else if game_data_account.player_position == 2 {
    if password != "gib" {
    return err!(MyError::WrongPassword);
    }

    game_data_account.player_position = game_data_account.player_position + 1;

    msg!(
    "You made it! Here is your reward {0} lamports",
    CHEST_REWARD
    );

    **ctx
    .accounts
    .chest_vault
    .to_account_info()
    .try_borrow_mut_lamports()? -= CHEST_REWARD;
    **ctx
    .accounts
    .player
    .to_account_info()
    .try_borrow_mut_lamports()? += CHEST_REWARD;
    } else {
    game_data_account.player_position = game_data_account.player_position + 1;
    print_player(game_data_account.player_position);
    }
    Ok(())
    }
    }

    fn print_player(player_position: u8) {
    if player_position == 0 {
    msg!("A Journey Begins!");
    msg!("o.........💎");
    } else if player_position == 1 {
    msg!("..o.......💎");
    } else if player_position == 2 {
    msg!("....o.....💎");
    } else if player_position == 3 {
    msg!("........\\o/💎");
    msg!("..........\\o/");
    msg!("You have reached the end! Super!");
    }
    }

    #[derive(Accounts)]
    pub struct InitializeLevelOne<'info> {
    // We must specify the space in order to initialize an account.
    // First 8 bytes are default account discriminator,
    // next 1 byte come from NewAccount.data being type u8.
    // (u8 = 8 bits unsigned integer = 8 bytes)
    // You can also use the signer as seed [signer.key().as_ref()],
    #[account(
    init_if_needed,
    seeds = [b"level1"],
    bump,
    payer = signer,
    space = 8 + 1
    )]
    pub new_game_data_account: Account<'info, GameDataAccount>,
    // This is the PDA in which we will deposit the reward SOL and
    // from where we send it back to the first player reaching the chest.
    #[account(
    init_if_needed,
    seeds = [b"chestVault"],
    bump,
    payer = signer,
    space = 8
    )]
    pub chest_vault: Account<'info, ChestVaultAccount>,
    #[account(mut)]
    pub signer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    #[derive(Accounts)]
    pub struct SpawnChest<'info> {
    #[account(mut)]
    pub payer: Signer<'info>,
    #[account(mut, seeds = [b"chestVault"], bump)]
    pub chest_vault: Account<'info, ChestVaultAccount>,
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    pub system_program: Program<'info, System>,
    }

    #[derive(Accounts)]
    pub struct MoveRight<'info> {
    #[account(mut, seeds = [b"chestVault"], bump)]
    pub chest_vault: Account<'info, ChestVaultAccount>,
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    #[account(mut)]
    pub player: Signer<'info>,
    }

    #[account]
    pub struct GameDataAccount {
    player_position: u8,
    }

    #[account]
    pub struct ChestVaultAccount {}

    #[error_code]
    pub enum MyError {
    #[msg("Password was wrong")]
    WrongPassword,
    }

    Now that the program is complete, let's build and deploy it using the Solana Playground!

    If you're new to the Solana Playground, start by creating a Playground Wallet and make sure you're connected to a Devnet endpoint. Next, run solana airdrop 2 until you have 6 SOL. Once you have enough SOL, build and deploy the program.

    Get Started with the Client

    In this section, we'll walk through a simple client-side implementation for interacting with the game. We will break down the code and provide detailed explanations for each step. To get started, navigate to the client.ts file in Solana Playground, remove the placeholder code, and add the code snippets from the following sections.

    First, let's derive the PDAs (Program Derived Addresses) for the GameDataAccount and ChestVaultAccount. A PDA is a unique address in the format of a public key, derived using the program's ID and additional seeds.

    // The PDA adress everyone will be able to control the character if the interact with your program
    const [globalLevel1GameDataAccount, bump] =
    await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("level1", "utf8")],
    //[pg.wallet.publicKey.toBuffer()], <- You could also add the player wallet as a seed, then you would have one instance per player. Need to also change the seed in the rust part
    pg.program.programId
    );

    // This is where the program will save the sol reward for the chests and from which the reward will be payed out again
    const [chestVaultAccount, chestBump] =
    await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("chestVault", "utf8")],
    pg.program.programId
    );

    Next, we'll call the initializeLevelOne instruction to set up the GameDataAccount and ChestVaultAccount.

    // Initialize level
    let txHash = await pg.program.methods
    .initializeLevelOne()
    .accounts({
    chestVault: chestVaultAccount,
    newGameDataAccount: globalLevel1GameDataAccount,
    signer: pg.wallet.publicKey,
    systemProgram: web3.SystemProgram.programId,
    })
    .signers([pg.wallet.keypair])
    .rpc();

    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
    await pg.connection.confirmTransaction(txHash);

    let balance = await pg.connection.getBalance(pg.wallet.publicKey);
    console.log(
    `My balance before spawning a chest: ${balance / web3.LAMPORTS_PER_SOL} SOL`
    );

    After that, we'll use the resetLevelAndSpawnChest instruction to set the player's position to 0 and fill the ChestVaultAccount with 0.1 SOL.

    // Set the player position back to 0 and pay to fill up the chest with sol
    txHash = await pg.program.methods
    .resetLevelAndSpawnChest()
    .accounts({
    chestVault: chestVaultAccount,
    gameDataAccount: globalLevel1GameDataAccount,
    payer: pg.wallet.publicKey,
    systemProgram: web3.SystemProgram.programId,
    })
    .signers([pg.wallet.keypair])
    .rpc();

    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
    await pg.connection.confirmTransaction(txHash);

    console.log("Level reset and chest spawned 💎");
    console.log("o........💎");

    Now we can interact with the game by calling the moveRight instruction. In this example, we'll loop through this instruction until the player reaches the position to collect the reward from the ChestVaultAccount.


    // Here we move to the right three times and collect the chest at the end of the level
    for (let i = 0; i < 3; i++) {
    txHash = await pg.program.methods
    .moveRight("gib")
    .accounts({
    chestVault: chestVaultAccount,
    gameDataAccount: globalLevel1GameDataAccount,
    player: pg.wallet.publicKey,
    })
    .signers([pg.wallet.keypair])
    .rpc();

    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
    await pg.connection.confirmTransaction(txHash);
    let balance = await pg.connection.getBalance(pg.wallet.publicKey);
    console.log(`My balance: ${balance / web3.LAMPORTS_PER_SOL} SOL`);

    let gameDateAccount = await pg.program.account.gameDataAccount.fetch(
    globalLevel1GameDataAccount
    );

    console.log("Player position is:", gameDateAccount.playerPosition.toString());

    switch (gameDateAccount.playerPosition) {
    case 0:
    console.log("A journey begins...");
    console.log("o........💎");
    break;
    case 1:
    console.log("....o....💎");
    break;
    case 2:
    console.log("......o..💎");
    break;
    case 3:
    console.log(".........\\o/💎");
    console.log("...........\\o/");
    break;
    }
    }

    Finally, press the "Run" button in the Solana Playground to execute the client. When you input anything other than "gib" as the password for the moveRight instruction, you should encounter the following error message upon reaching the position to claim the chest reward:

    Error Code: WrongPassword. Error Number: 6000. Error Message: Password was wrong.

    However, if you enter the correct password, the output should resemble the following:

    Running client...
    client.ts:
    Use 'solana confirm -v CX8VWV5Jp1kXDkZrTdeeyibgZg3B3cXAzchzCfNHvJoqARSGHeEU5injypxFwiKFcHPcWFG9BeNSrqZAdENtL2t' to see the logs
    My balance before spawning a chest: 6.396630254 SOL
    Use 'solana confirm -v 3HwAS1RK7beL3mGoNdFYWteJXF3NdJXiEskJrHtuJ6Tu9ow67Zo3yScQBEPQyish33hP8WyuVanmq93wEFJ2LQcx' to see the logs
    Level reset and chest spawned 💎
    o........💎
    Use 'solana confirm -v 43KnGrx5VQYd8LctsNaNqN1hg69vE6wiiTbdxTC1uM3Hasnq7ZdM9zWx4JS39AKNz2FpQr9a3ZnEA7XscEzmXQ5U' to see the logs
    My balance: 6.296620254 SOL
    Player position is: 1
    ....o....💎
    Use 'solana confirm -v AGxYWDw49d4y5dLon5M42eu1qG8g2Yf7FeTr3Dpbf1uFXnMeUzp4XWmHyQP1YRNpT8acz4aTJU9f2FQpL6BSAkY' to see the logs
    My balance: 6.296615254 SOL
    Player position is: 2
    ......o..💎
    Use 'solana confirm -v 5pjAU5NrS4u91QLWZTvo9aXBtR3c6g981UGSxrWDoDW5MehXnx5LnAxu4jKLp1p75RKpVSgMBgg2zHX3WDyci7AK' to see the logs
    My balance: 6.396610254 SOL
    Player position is: 3
    .........\o/💎
    ...........\o/

    Well done! You have successfully created, deployed, and interacted with Tiny Adventure Two from the client side. You've incorporated a new feature that allows players to collect rewards by reaching the chest at the end of the level. Moreover, you've learned how to transfer SOL within an Anchor program using cross-program invocations and by directly modifying lamports in accounts.

    Feel free to continue building independently and enhance the game with additional features like new levels or alternative rewards!

    - +

    Tiny Adventure Anchor Program - Part Two

    In this tutorial, we will rebuild the Tiny Adventure game and introduce a chest with a reward of 0.1 SOL. The chest will "spawn" at a specific position, and when the player reaches that position, they will receive the reward. The goal of this program is to demonstrate how to store SOL within a program account and distribute it to players.

    The Tiny Adventure Two Program consists of 3 instructions:

    • initialize_level_one - This instruction initializes two on-chain accounts: one for recording the player's position and another for holding the SOL reward that represents the “reward chest”.
    • reset_level_and_spawn_chest - This instruction resets the player's position to zero and "respawns" a reward chest by transferring SOL from the user invoking the instruction to the reward chest account.
    • move_right - This instruction allows the player to move their position to the right and collect the SOL in the reward chest once they reach a specific position.

    In the following sections, we will guide you through building the program step by step. You can find the complete source code, which can be deployed directly from your browser using the Solana Playground, at this link: Open In Playground.

    Getting Started

    To start building the Tiny Adventure game, follow these steps:

    Visit the Solana Playground and create a new Anchor project. If you're new to Solana Playground, you'll also need to create a Playground Wallet.

    After creating a new project, replace the default starter code with the code below:

    use anchor_lang::prelude::*;
    use anchor_lang::solana_program::native_token::LAMPORTS_PER_SOL;
    use anchor_lang::system_program;

    declare_id!("11111111111111111111111111111111");

    #[program]
    mod tiny_adventure_two {
    use super::*;
    }

    fn print_player(player_position: u8) {
    if player_position == 0 {
    msg!("A Journey Begins!");
    msg!("o.........💎");
    } else if player_position == 1 {
    msg!("..o.......💎");
    } else if player_position == 2 {
    msg!("....o.....💎");
    } else if player_position == 3 {
    msg!("........\\o/💎");
    msg!("..........\\o/");
    msg!("You have reached the end! Super!");
    }
    }

    In this game, the player starts at position 0 and can only move right. To visualize the player's progress throughout the game, we'll use message logs to represent their journey towards the reward chest!

    Defining the Chest Vault Account

    Add the CHEST_REWARD constant at the beginning of the program. The CHEST_REWARD represents the amount of lamports that will be put into the chest and given out as rewards. Lamports are the smallest fractions of a SOL, with 1 billion lamports being equal to 1 SOL.

    To store the SOL reward, we will define a new ChestVaultAccount struct. This is an empty struct because we will be directly updating the lamports in the account. The account will hold the SOL reward and does not need to store any additional data.

    use anchor_lang::prelude::*;
    use anchor_lang::solana_program::native_token::LAMPORTS_PER_SOL;
    use anchor_lang::system_program;

    declare_id!("11111111111111111111111111111111");

    #[program]
    mod tiny_adventure_two {
    use super::*;

    // The amount of lamports that will be put into chests and given out as rewards.
    const CHEST_REWARD: u64 = LAMPORTS_PER_SOL / 10; // 0.1 SOL
    }

    ...

    // Define the Chest Vault Account structure
    #[account]
    pub struct ChestVaultAccount {}

    Defining the Game Data Account

    To keep track of the player's position within the game, we need to define a structure for the on-chain account that will store the player's position.

    The GameDataAccount struct contains a single field, player_position, which stores the player's current position as an unsigned 8-bit integer.


    use anchor_lang::prelude::*;
    use anchor_lang::solana_program::native_token::LAMPORTS_PER_SOL;
    use anchor_lang::system_program;

    declare_id!("11111111111111111111111111111111");

    #[program]
    mod tiny_adventure_two {
    use super::*;
    ...

    }

    ...

    // Define the Game Data Account structure
    #[account]
    pub struct GameDataAccount {
    player_position: u8,
    }

    With the GameDataAccount struct defined, you can now use it to store and update the player's position as they interact with the game. As the player moves right and progresses through the game, their position will be updated within the GameDataAccount, allowing you to track their progress towards the chest containing the SOL reward.

    Initialize Level One Instruction

    With the GameDataAccount and ChestVaultAccount defined, let's implement the initialize_level_one instruction. This instruction initializes both the GameDataAccount and ChestVaultAccount, sets the player's position to 0, and displays the starting message.

    The initialize_level_one instruction requires 4 accounts:

    • new_game_data_account - the GameDataAccount we are initializing to store the player’s position
    • chest_vault - the ChestVaultAccount we are initializing to store the SOL reward
    • signer - the player paying for the initialization of the accounts
    • system_program - a required account when creating a new account
    #[program]
    pub mod tiny_adventure_two {
    use super::*;

    pub fn initialize_level_one(_ctx: Context<InitializeLevelOne>) -> Result<()> {
    msg!("A Journey Begins!");
    msg!("o.......💎");
    Ok(())
    }

    ...
    }

    // Specify the accounts required by the initialize_level_one instruction
    #[derive(Accounts)]
    pub struct InitializeLevelOne<'info> {
    #[account(
    init_if_needed,
    seeds = [b"level1"],
    bump,
    payer = signer,
    space = 8 + 1
    )]
    pub new_game_data_account: Account<'info, GameDataAccount>,
    #[account(
    init_if_needed,
    seeds = [b"chestVault"],
    bump,
    payer = signer,
    space = 8
    )]
    pub chest_vault: Account<'info, ChestVaultAccount>,
    #[account(mut)]
    pub signer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    ...

    Both the GameDataAccount and ChestVaultAccount are created using a Program Derived Address (PDA) as the address of the account, allowing us to deterministically locate the address later. The init_if_needed constraint ensures that the accounts are only initialized if they don't already exist. Since the PDAs for both accounts in this instruction use a single fixed seed, our program can only create one of each type of account. In effect, the instruction would only ever need to be invoked one time.

    It's worth noting that the current implementation does not have any restrictions on who can modify the GameDataAccount, effectively turning the game into a multiplayer experience where everyone can control the player's movement.

    Alternatively, you can use the signer's address as an extra seed in the initialize instruction, allowing each player to create their own GameDataAccount.

    Reset Level and Spawn Chest Instruction

    Next, let's implement the reset_level_and_spawn_chest instruction, which resets the player's position to the start and fills up the chest with a reward of 0.1 SOL.

    The reset_level_and_spawn_chest instruction requires 4 accounts:

    • new_game_data_account - the GameDataAccount storing the player's position
    • chest_vault - the ChestVaultAccount storing the SOL reward
    • signer - the player providing the SOL reward for the chest
    • system_program - the program we'll be invoking to transfer SOL using a cross-program invocation (CPI), more on this shortly
    #[program]
    pub mod tiny_adventure_two {
    use super::*;
    ...

    pub fn reset_level_and_spawn_chest(ctx: Context<SpawnChest>) -> Result<()> {
    ctx.accounts.game_data_account.player_position = 0;

    let cpi_context = CpiContext::new(
    ctx.accounts.system_program.to_account_info(),
    system_program::Transfer {
    from: ctx.accounts.payer.to_account_info().clone(),
    to: ctx.accounts.chest_vault.to_account_info().clone(),
    },
    );
    system_program::transfer(cpi_context, CHEST_REWARD)?;

    msg!("Level Reset and Chest Spawned at position 3");

    Ok(())
    }

    ...
    }

    // Specify the accounts required by the reset_level_and_spawn_chest instruction
    #[derive(Accounts)]
    pub struct SpawnChest<'info> {
    #[account(mut)]
    pub payer: Signer<'info>,
    #[account(mut, seeds = [b"chestVault"], bump)]
    pub chest_vault: Account<'info, ChestVaultAccount>,
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    pub system_program: Program<'info, System>,
    }

    ...

    This instruction includes a cross-program invocation (CPI) to transfer SOL from the payer to the ChestVaultAccount. A cross-program invocation is when one program invokes an instruction on another program. In this case, we use a CPI to invoke the Transfer instruction from the system_program to transfer SOL from the payer to the ChestVaultAccount.

    Cross-program invocations are a key concept in the Solana programming model, enabling programs to directly interact with instructions from other programs. For a deeper dive into of CPIs, feel free to explore the CPI lessons available in the Solana Course.

    Move Right Instruction

    Finally, let's implement the move_right instruction which includes the logic for collecting the chest reward. When a player reaches position 3 and inputs the correct “password”, the reward is transferred from the ChestVaultAccount to the player's account. If an incorrect password is entered, a custom Anchor Error is returned. If the player is already at position 3, a message will be logged. Otherwise, the position will be incremented by 1 to represent moving to the right.

    The main purpose of this "password" functionality is to demonstrate how to incorporate parameters into an instruction and the implementation of custom Anchor Errors for improved error handling. In this example, the correct password will be "gib".

    The move_right instruction requires 3 accounts:

    • new_game_data_account - the GameDataAccount storing the player's position
    • chest_vault - the ChestVaultAccount storing the SOL reward
    • player_wallet - the wallet of the player invoking the instruction and the potential recipient of SOL reward
    #[program]
    pub mod tiny_adventure_two {
    use super::*;
    ...

    // Instruction to move right
    pub fn move_right(ctx: Context<MoveRight>, password: String) -> Result<()> {
    let game_data_account = &mut ctx.accounts.game_data_account;
    if game_data_account.player_position == 3 {
    msg!("You have reached the end! Super!");
    } else if game_data_account.player_position == 2 {
    if password != "gib" {
    return err!(MyError::WrongPassword);
    }

    game_data_account.player_position = game_data_account.player_position + 1;

    msg!(
    "You made it! Here is your reward {0} lamports",
    CHEST_REWARD
    );

    **ctx
    .accounts
    .chest_vault
    .to_account_info()
    .try_borrow_mut_lamports()? -= CHEST_REWARD;
    **ctx
    .accounts
    .player
    .to_account_info()
    .try_borrow_mut_lamports()? += CHEST_REWARD;
    } else {
    game_data_account.player_position = game_data_account.player_position + 1;
    print_player(game_data_account.player_position);
    }
    Ok(())
    }

    ...
    }

    // Specify the accounts required by the move_right instruction
    #[derive(Accounts)]
    pub struct MoveRight<'info> {
    #[account(mut, seeds = [b"chestVault"], bump)]
    pub chest_vault: Account<'info, ChestVaultAccount>,
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    #[account(mut)]
    pub player: Signer<'info>,
    }

    // Custom Anchor Error
    #[error_code]
    pub enum MyError {
    #[msg("Password was wrong")]
    WrongPassword,
    }

    ...

    To transfer lamports from the reward chest to the player account, we can't use a Cross-Program Invocation (CPI) as we did previously, since the ChestVaultAccount isn't owned by the system program. Instead, we directly modify the lamports within the accounts by using try_borrow_mut_lamports. Keep in mind that the account you deduct lamports from must be a signer, and the runtime always makes sure that the total account balances stay equal after a transaction.

    Note that Program Derived Accounts (PDAs) offer two main features:

    1. Provide a deterministic way to find an account's address
    2. Allow the program from which a PDA is derived to "sign" for them

    This is the reason we are able to deduct lamports from the ChestVaultAccount without explicitly requiring an extra signer for the instruction.

    Build and Deploy

    Great job! You've now completed part two of the Tiny Adventure program! Your final program should look like this:

    use anchor_lang::prelude::*;
    use anchor_lang::solana_program::native_token::LAMPORTS_PER_SOL;
    use anchor_lang::system_program;

    // This is your program's public key and it will update
    // automatically when you build the project.
    declare_id!("7gZTdZg86YsYbs92Rhv63kZUAkoww1kLexJg8sNpgVQ3");

    #[program]
    mod tiny_adventure_two {
    use super::*;

    // The amount of lamports that will be put into chests and given out as rewards.
    const CHEST_REWARD: u64 = LAMPORTS_PER_SOL / 10; // 0.1 SOL

    pub fn initialize_level_one(_ctx: Context<InitializeLevelOne>) -> Result<()> {
    // Usually in your production code you would not print lots of text because it cost compute units.
    msg!("A Journey Begins!");
    msg!("o.......💎");
    Ok(())
    }

    pub fn reset_level_and_spawn_chest(ctx: Context<SpawnChest>) -> Result<()> {
    ctx.accounts.game_data_account.player_position = 0;

    let cpi_context = CpiContext::new(
    ctx.accounts.system_program.to_account_info(),
    system_program::Transfer {
    from: ctx.accounts.payer.to_account_info().clone(),
    to: ctx.accounts.chest_vault.to_account_info().clone(),
    },
    );
    system_program::transfer(cpi_context, CHEST_REWARD)?;

    msg!("Level Reset and Chest Spawned at position 3");

    Ok(())
    }

    pub fn move_right(ctx: Context<MoveRight>, password: String) -> Result<()> {
    let game_data_account = &mut ctx.accounts.game_data_account;
    if game_data_account.player_position == 3 {
    msg!("You have reached the end! Super!");
    } else if game_data_account.player_position == 2 {
    if password != "gib" {
    return err!(MyError::WrongPassword);
    }

    game_data_account.player_position = game_data_account.player_position + 1;

    msg!(
    "You made it! Here is your reward {0} lamports",
    CHEST_REWARD
    );

    **ctx
    .accounts
    .chest_vault
    .to_account_info()
    .try_borrow_mut_lamports()? -= CHEST_REWARD;
    **ctx
    .accounts
    .player
    .to_account_info()
    .try_borrow_mut_lamports()? += CHEST_REWARD;
    } else {
    game_data_account.player_position = game_data_account.player_position + 1;
    print_player(game_data_account.player_position);
    }
    Ok(())
    }
    }

    fn print_player(player_position: u8) {
    if player_position == 0 {
    msg!("A Journey Begins!");
    msg!("o.........💎");
    } else if player_position == 1 {
    msg!("..o.......💎");
    } else if player_position == 2 {
    msg!("....o.....💎");
    } else if player_position == 3 {
    msg!("........\\o/💎");
    msg!("..........\\o/");
    msg!("You have reached the end! Super!");
    }
    }

    #[derive(Accounts)]
    pub struct InitializeLevelOne<'info> {
    // We must specify the space in order to initialize an account.
    // First 8 bytes are default account discriminator,
    // next 1 byte come from NewAccount.data being type u8.
    // (u8 = 8 bits unsigned integer = 8 bytes)
    // You can also use the signer as seed [signer.key().as_ref()],
    #[account(
    init_if_needed,
    seeds = [b"level1"],
    bump,
    payer = signer,
    space = 8 + 1
    )]
    pub new_game_data_account: Account<'info, GameDataAccount>,
    // This is the PDA in which we will deposit the reward SOL and
    // from where we send it back to the first player reaching the chest.
    #[account(
    init_if_needed,
    seeds = [b"chestVault"],
    bump,
    payer = signer,
    space = 8
    )]
    pub chest_vault: Account<'info, ChestVaultAccount>,
    #[account(mut)]
    pub signer: Signer<'info>,
    pub system_program: Program<'info, System>,
    }

    #[derive(Accounts)]
    pub struct SpawnChest<'info> {
    #[account(mut)]
    pub payer: Signer<'info>,
    #[account(mut, seeds = [b"chestVault"], bump)]
    pub chest_vault: Account<'info, ChestVaultAccount>,
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    pub system_program: Program<'info, System>,
    }

    #[derive(Accounts)]
    pub struct MoveRight<'info> {
    #[account(mut, seeds = [b"chestVault"], bump)]
    pub chest_vault: Account<'info, ChestVaultAccount>,
    #[account(mut)]
    pub game_data_account: Account<'info, GameDataAccount>,
    #[account(mut)]
    pub player: Signer<'info>,
    }

    #[account]
    pub struct GameDataAccount {
    player_position: u8,
    }

    #[account]
    pub struct ChestVaultAccount {}

    #[error_code]
    pub enum MyError {
    #[msg("Password was wrong")]
    WrongPassword,
    }

    Now that the program is complete, let's build and deploy it using the Solana Playground!

    If you're new to the Solana Playground, start by creating a Playground Wallet and make sure you're connected to a Devnet endpoint. Next, run solana airdrop 2 until you have 6 SOL. Once you have enough SOL, build and deploy the program.

    Get Started with the Client

    In this section, we'll walk through a simple client-side implementation for interacting with the game. We will break down the code and provide detailed explanations for each step. To get started, navigate to the client.ts file in Solana Playground, remove the placeholder code, and add the code snippets from the following sections.

    First, let's derive the PDAs (Program Derived Addresses) for the GameDataAccount and ChestVaultAccount. A PDA is a unique address in the format of a public key, derived using the program's ID and additional seeds.

    // The PDA adress everyone will be able to control the character if the interact with your program
    const [globalLevel1GameDataAccount, bump] =
    await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("level1", "utf8")],
    //[pg.wallet.publicKey.toBuffer()], <- You could also add the player wallet as a seed, then you would have one instance per player. Need to also change the seed in the rust part
    pg.program.programId
    );

    // This is where the program will save the sol reward for the chests and from which the reward will be payed out again
    const [chestVaultAccount, chestBump] =
    await anchor.web3.PublicKey.findProgramAddress(
    [Buffer.from("chestVault", "utf8")],
    pg.program.programId
    );

    Next, we'll call the initializeLevelOne instruction to set up the GameDataAccount and ChestVaultAccount.

    // Initialize level
    let txHash = await pg.program.methods
    .initializeLevelOne()
    .accounts({
    chestVault: chestVaultAccount,
    newGameDataAccount: globalLevel1GameDataAccount,
    signer: pg.wallet.publicKey,
    systemProgram: web3.SystemProgram.programId,
    })
    .signers([pg.wallet.keypair])
    .rpc();

    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
    await pg.connection.confirmTransaction(txHash);

    let balance = await pg.connection.getBalance(pg.wallet.publicKey);
    console.log(
    `My balance before spawning a chest: ${balance / web3.LAMPORTS_PER_SOL} SOL`
    );

    After that, we'll use the resetLevelAndSpawnChest instruction to set the player's position to 0 and fill the ChestVaultAccount with 0.1 SOL.

    // Set the player position back to 0 and pay to fill up the chest with sol
    txHash = await pg.program.methods
    .resetLevelAndSpawnChest()
    .accounts({
    chestVault: chestVaultAccount,
    gameDataAccount: globalLevel1GameDataAccount,
    payer: pg.wallet.publicKey,
    systemProgram: web3.SystemProgram.programId,
    })
    .signers([pg.wallet.keypair])
    .rpc();

    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
    await pg.connection.confirmTransaction(txHash);

    console.log("Level reset and chest spawned 💎");
    console.log("o........💎");

    Now we can interact with the game by calling the moveRight instruction. In this example, we'll loop through this instruction until the player reaches the position to collect the reward from the ChestVaultAccount.


    // Here we move to the right three times and collect the chest at the end of the level
    for (let i = 0; i < 3; i++) {
    txHash = await pg.program.methods
    .moveRight("gib")
    .accounts({
    chestVault: chestVaultAccount,
    gameDataAccount: globalLevel1GameDataAccount,
    player: pg.wallet.publicKey,
    })
    .signers([pg.wallet.keypair])
    .rpc();

    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);
    await pg.connection.confirmTransaction(txHash);
    let balance = await pg.connection.getBalance(pg.wallet.publicKey);
    console.log(`My balance: ${balance / web3.LAMPORTS_PER_SOL} SOL`);

    let gameDateAccount = await pg.program.account.gameDataAccount.fetch(
    globalLevel1GameDataAccount
    );

    console.log("Player position is:", gameDateAccount.playerPosition.toString());

    switch (gameDateAccount.playerPosition) {
    case 0:
    console.log("A journey begins...");
    console.log("o........💎");
    break;
    case 1:
    console.log("....o....💎");
    break;
    case 2:
    console.log("......o..💎");
    break;
    case 3:
    console.log(".........\\o/💎");
    console.log("...........\\o/");
    break;
    }
    }

    Finally, press the "Run" button in the Solana Playground to execute the client. When you input anything other than "gib" as the password for the moveRight instruction, you should encounter the following error message upon reaching the position to claim the chest reward:

    Error Code: WrongPassword. Error Number: 6000. Error Message: Password was wrong.

    However, if you enter the correct password, the output should resemble the following:

    Running client...
    client.ts:
    Use 'solana confirm -v CX8VWV5Jp1kXDkZrTdeeyibgZg3B3cXAzchzCfNHvJoqARSGHeEU5injypxFwiKFcHPcWFG9BeNSrqZAdENtL2t' to see the logs
    My balance before spawning a chest: 6.396630254 SOL
    Use 'solana confirm -v 3HwAS1RK7beL3mGoNdFYWteJXF3NdJXiEskJrHtuJ6Tu9ow67Zo3yScQBEPQyish33hP8WyuVanmq93wEFJ2LQcx' to see the logs
    Level reset and chest spawned 💎
    o........💎
    Use 'solana confirm -v 43KnGrx5VQYd8LctsNaNqN1hg69vE6wiiTbdxTC1uM3Hasnq7ZdM9zWx4JS39AKNz2FpQr9a3ZnEA7XscEzmXQ5U' to see the logs
    My balance: 6.296620254 SOL
    Player position is: 1
    ....o....💎
    Use 'solana confirm -v AGxYWDw49d4y5dLon5M42eu1qG8g2Yf7FeTr3Dpbf1uFXnMeUzp4XWmHyQP1YRNpT8acz4aTJU9f2FQpL6BSAkY' to see the logs
    My balance: 6.296615254 SOL
    Player position is: 2
    ......o..💎
    Use 'solana confirm -v 5pjAU5NrS4u91QLWZTvo9aXBtR3c6g981UGSxrWDoDW5MehXnx5LnAxu4jKLp1p75RKpVSgMBgg2zHX3WDyci7AK' to see the logs
    My balance: 6.396610254 SOL
    Player position is: 3
    .........\o/💎
    ...........\o/

    Well done! You have successfully created, deployed, and interacted with Tiny Adventure Two from the client side. You've incorporated a new feature that allows players to collect rewards by reaching the chest at the end of the level. Moreover, you've learned how to transfer SOL within an Anchor program using cross-program invocations and by directly modifying lamports in accounts.

    Feel free to continue building independently and enhance the game with additional features like new levels or alternative rewards!

    + \ No newline at end of file diff --git a/cookbook-zh/references/index.html b/cookbook-zh/references/index.html index 81125b9b2..78e07fdc0 100644 --- a/cookbook-zh/references/index.html +++ b/cookbook-zh/references/index.html @@ -5,13 +5,13 @@ 参考 | All in One Solana - + - + + \ No newline at end of file diff --git a/cookbook-zh/references/keypairs-and-wallets/index.html b/cookbook-zh/references/keypairs-and-wallets/index.html index 59b40d6f9..7004e1274 100644 --- a/cookbook-zh/references/keypairs-and-wallets/index.html +++ b/cookbook-zh/references/keypairs-and-wallets/index.html @@ -5,14 +5,14 @@ 密钥对和钱包 | All in One Solana - +

    密钥对和钱包

    如何生成新的密钥对

    对于使用Solana库执行各种操作,许多操作都需要一个密钥对或钱包。如果你正在连接到一个钱包,那么你不必担心。然而,如果你需要一个密钥对,你会需要生成一个。

    let keypair = Keypair.generate();

    如何从密钥恢复密钥对

    如果你已经有了密钥,你可以通过这个密钥获取密钥对,以测试你的dApp。

    1. 从字节中:
    const keypair = Keypair.fromSecretKey(
    Uint8Array.from([
    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,
    ])
    );
    1. 从Base58字符串:
    const keypair = Keypair.fromSecretKey(
    bs58.decode(
    "5MaiiCavjCmn9Hs1o3eznqDEhRwxo7pXiAYez7keQUviUkauRiTMD8DrESdrNjN8zd9mTmVhRvBJeg5vhyvgrAhG"
    )
    );

    如何验证密钥对

    如果你有了个密钥对,你可以验证密钥对的私钥是否与给定的公钥匹配。

    const publicKey = new PublicKey("24PNhTaNtomHhoy3fTRaMhAFCRj4uHqhZEEoWrKDbR5p");
    const keypair = Keypair.fromSecretKey(
    Uint8Array.from([
    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,
    ])
    );
    console.log(keypair.publicKey.toBase58() === publicKey.toBase58());
    // true

    如何检查一个公钥是否有关联的私钥

    在某些特殊情况下(例如,派生自程序的地址(PDA)),公钥可能没有关联的私钥。你可以通过查看公钥是否位于ed25519曲线上来检查这一点。只有位于曲线上的公钥才可以由具有钱包的用户控制。

    const key = new PublicKey("5oNDL3swdJJF1g9DzJiZ4ynHXgszjAEpUkxVYejchzrY");
    console.log(PublicKey.isOnCurve(key.toBytes()));

    如何生成助记词

    如果你正在创建一个钱包,你需要生成一个助记词,以便用户可以将其保存为备份。

    const mnemonic = bip39.generateMnemonic();

    如何通过助记词恢复密钥对

    许多钱包扩展使用助记词来表示其密钥。你可以将助记词转换为密钥对以进行本地测试。

    1. BIP39 - 创建单个钱包的步骤如下:
    const mnemonic =
    "pill tomorrow foster begin walnut borrow virtual kick shift mutual shoe scatter";
    const seed = bip39.mnemonicToSeedSync(mnemonic, ""); // (mnemonic, password)
    const keypair = Keypair.fromSeed(seed.slice(0, 32));
    1. BIP44 (多个钱包,也叫HD钱包)

    你可以从一个单一种子生成多个钱包,也被称为“分层确定性钱包”或HD钱包。

    const mnemonic =
    "neither lonely flavor argue grass remind eye tag avocado spot unusual intact";
    const seed = bip39.mnemonicToSeedSync(mnemonic, ""); // (mnemonic, password)
    for (let i = 0; i < 10; i++) {
    const path = `m/44'/501'/${i}'/0'`;
    const keypair = Keypair.fromSeed(derivePath(path, seed.toString("hex")).key);
    console.log(`${path} => ${keypair.publicKey.toBase58()}`);
    }

    如何生成自定义地址(vanity address)

    自定义公钥或地址(Vanity Address)是以特定字符开头的密钥。例如,一个人可能希望公钥以 "elv1s" 或 "cook" 开头,这样可以帮助他人记住密钥所属的人,使密钥更容易识别。

    注意: 自定义地址中字符的数量越多,生成时间将会更长。

    caution

    警告 -在此任务中,您应该使用命令行界面(CLI)。Python和TypeScript的示例仅用于说明,速度比CLI慢得多。

    let keypair = Keypair.generate();
    while (!keypair.publicKey.toBase58().startsWith("elv1s")) {
    keypair = Keypair.generate();
    }

    如何使用钱包来签名和验证消息

    密钥对的主要功能是对消息进行签名并验证签名的有效性。通过验证签名,接收方可以确保数据是由特定私钥的所有者签名的。

    为此,我们将导入TweetNaCl 密码库,并按照以下步骤进行操作:

    const message = "The quick brown fox jumps over the lazy dog";
    const messageBytes = decodeUTF8(message);

    const signature = nacl.sign.detached(messageBytes, keypair.secretKey);
    const result = nacl.sign.detached.verify(
    messageBytes,
    signature,
    keypair.publicKey.toBytes()
    );

    console.log(result);

    如何连接到钱包

    Solana的钱包适配器 库使客户端管理钱包连接变得简单。

    反应

    运行以下命令来安装所需的依赖项:

    yarn add @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/wallet-adapter-base @solana/wallet-adapter-wallets

    React的钱包适配器库允许我们通过钩子和上下文提供程序来持久化和访问钱包连接状态,主要包括useWallet、WalletProvideruseConnection和ConnectionProviderWalletProviderConnectionProvider必须包装React应用程。

    此外,我们可以使用useWalletModal来提示用户进行连接,通过切换连接模态框的可见性,并将应用程序包装在@solana/wallet-adapter-react-ui中的WalletModalProvider中。连接模态框将处理连接流程,因此我们只需监听钱包连接的状态。当useWallet的响应具有非空的wallet属性时,我们知道钱包已连接。反之,如果该属性为空,我们知道钱包已断开连接。

    const { wallet } = useWallet();
    const { setVisible } = useWalletModal();

    const onRequestConnectWallet = () => {
    setVisible(true);
    };

    // Prompt the user to connect their wallet
    if (!wallet) {
    return <button onClick={onRequestConnectWallet}>Connect Wallet</button>;
    }

    // Displays the connected wallet address
    return (
    <main>
    <p>Wallet successfully connected!</p>
    <p>{wallet.publicKey.toBase58()}</p>
    </main>
    );w

    Vue

    运行以下命令来安装所需的依赖项:

    npm install solana-wallets-vue @solana/wallet-adapter-wallets

    Solana的Vue钱包 插件允许我们初始化钱包存储,并创建一个名为$wallet的全局属性,可以在任何组件中访问。你可以在此处 查看可以从useWallet()获取的所有属性和方法。我们还导入并渲染WalletMultiButton组件,以允许用户选择钱包并连接到它。

    <script setup>
    import { WalletMultiButton } from "solana-wallets-vue";
    </script>

    <template>
    <wallet-multi-button></wallet-multi-button>
    </template>

    Svelte

    运行以下命令来安装所需的依赖项:

    npm install @svelte-on-solana/wallet-adapter-core @svelte-on-solana/wallet-adapter-ui @solana/wallet-adapter-base @solana/wallet-adapter-wallets @solana/web3.js

    Svelte Wallet Adapter 包允许我们在使用Svelte模板或SvelteKit创建的项目中,在所有JS、TS或/和Svelte文件之间添加一个可访问的Svelte Store($walletStore)。使用 此处 的存储库引用,您可以在SSR或SPA中使用适配器。UI包含一个<WalletMultiButton />组件,允许用户选择一个钱包并连接到它。

    <script>
    import { walletStore } from "@svelte-on-solana/wallet-adapter-core";
    import { WalletMultiButton } from "@svelte-on-solana/wallet-adapter-ui";
    </script>

    {#if $walletStore?.connected} Wallet with public key {$walletStore.publicKey}
    successfully connected! {:else}
    <WalletMultiButton />
    {/if}
    - +在此任务中,您应该使用命令行界面(CLI)。Python和TypeScript的示例仅用于说明,速度比CLI慢得多。

    let keypair = Keypair.generate();
    while (!keypair.publicKey.toBase58().startsWith("elv1s")) {
    keypair = Keypair.generate();
    }

    如何使用钱包来签名和验证消息

    密钥对的主要功能是对消息进行签名并验证签名的有效性。通过验证签名,接收方可以确保数据是由特定私钥的所有者签名的。

    为此,我们将导入TweetNaCl 密码库,并按照以下步骤进行操作:

    const message = "The quick brown fox jumps over the lazy dog";
    const messageBytes = decodeUTF8(message);

    const signature = nacl.sign.detached(messageBytes, keypair.secretKey);
    const result = nacl.sign.detached.verify(
    messageBytes,
    signature,
    keypair.publicKey.toBytes()
    );

    console.log(result);

    如何连接到钱包

    Solana的钱包适配器 库使客户端管理钱包连接变得简单。

    反应

    运行以下命令来安装所需的依赖项:

    yarn add @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/wallet-adapter-base @solana/wallet-adapter-wallets

    React的钱包适配器库允许我们通过钩子和上下文提供程序来持久化和访问钱包连接状态,主要包括useWallet、WalletProvideruseConnection和ConnectionProviderWalletProviderConnectionProvider必须包装React应用程。

    此外,我们可以使用useWalletModal来提示用户进行连接,通过切换连接模态框的可见性,并将应用程序包装在@solana/wallet-adapter-react-ui中的WalletModalProvider中。连接模态框将处理连接流程,因此我们只需监听钱包连接的状态。当useWallet的响应具有非空的wallet属性时,我们知道钱包已连接。反之,如果该属性为空,我们知道钱包已断开连接。

    const { wallet } = useWallet();
    const { setVisible } = useWalletModal();

    const onRequestConnectWallet = () => {
    setVisible(true);
    };

    // Prompt the user to connect their wallet
    if (!wallet) {
    return <button onClick={onRequestConnectWallet}>Connect Wallet</button>;
    }

    // Displays the connected wallet address
    return (
    <main>
    <p>Wallet successfully connected!</p>
    <p>{wallet.publicKey.toBase58()}</p>
    </main>
    );w

    Vue

    运行以下命令来安装所需的依赖项:

    npm install solana-wallets-vue @solana/wallet-adapter-wallets

    Solana的Vue钱包 插件允许我们初始化钱包存储,并创建一个名为$wallet的全局属性,可以在任何组件中访问。你可以在此处 查看可以从useWallet()获取的所有属性和方法。我们还导入并渲染WalletMultiButton组件,以允许用户选择钱包并连接到它。

    <script setup>
    import { WalletMultiButton } from "solana-wallets-vue";
    </script>

    <template>
    <wallet-multi-button></wallet-multi-button>
    </template>

    Svelte

    运行以下命令来安装所需的依赖项:

    npm install @svelte-on-solana/wallet-adapter-core @svelte-on-solana/wallet-adapter-ui @solana/wallet-adapter-base @solana/wallet-adapter-wallets @solana/web3.js

    Svelte Wallet Adapter 包允许我们在使用Svelte模板或SvelteKit创建的项目中,在所有JS、TS或/和Svelte文件之间添加一个可访问的Svelte Store($walletStore)。使用 此处 的存储库引用,您可以在SSR或SPA中使用适配器。UI包含一个<WalletMultiButton />组件,允许用户选择一个钱包并连接到它。

    <script>
    import { walletStore } from "@svelte-on-solana/wallet-adapter-core";
    import { WalletMultiButton } from "@svelte-on-solana/wallet-adapter-ui";
    </script>

    {#if $walletStore?.connected} Wallet with public key {$walletStore.publicKey}
    successfully connected! {:else}
    <WalletMultiButton />
    {/if}
    + \ No newline at end of file diff --git a/cookbook-zh/references/local-development/index.html b/cookbook-zh/references/local-development/index.html index 844ba47ee..b715e8a90 100644 --- a/cookbook-zh/references/local-development/index.html +++ b/cookbook-zh/references/local-development/index.html @@ -5,15 +5,15 @@ 本地开发 | All in One Solana - +

    本地开发

    开启本地验证器

    在本地测试验证器比在开发网络(devnet)上进行测试更可靠,并且可以帮助你在开发网络上运行之前进行测试。

    你可以通过安装 solana工具套件 并运行以下命令来设置本地测试验证器:

    solana-test-validator

    使用本地测试验证器的好处包括:

    • 无RPC速率限制
    • 无空投限制
    • 直接在链上部署程序(--bpf-program ...
    • 从公共集群克隆账户,包括程序(--clone ...
    • 可配置的事务历史保留(--limit-ledger-size ...
    • 可配置的纪元长度(--slots-per-epoch ...
    • 跳转到任意槽位(--warp-slot ...

    连接到不同环境

    当你进行Solana开发时,你需要连接到特定的RPC API端点。Solana有三个公共的开发环境:

    const connection = new Connection(clusterApiUrl("mainnet-beta"), "confirmed");

    最后,你还可以连接到私有集群,无论是本地的还是远程运行的,使用以下方式:

    const connection = new Connection("http://127.0.0.1:8899", "confirmed");

    订阅事件

    Websockets提供了一种发布/订阅接口,你可以在其中监听特定的事件。与在固定时间间隔内对典型的HTTP端点进行轮询以获取频繁的更新不同,你可以仅在事件发生时才接收这些更新。

    Solana的web3连接 在底层生成一个websocket端点,并在创建新的Connection实例时注册一个websocket客户端(请参阅 此处) 的源代码)。

    Connection类提供了发布/订阅方法,它们都以on开头,类似于事件发射器。当您调用这些监听器方法时,它会在该Connection实例的websocket客户端中注册一个新的订阅。下面我们使用的示例发布/订阅方法是onAccountChange。 回调函数将通过参数提供更新的状态数据(例如,查看AAccountChangeCallback 作为示例)。

    // Establish new connect to devnet - websocket client connected to devnet will also be registered here
    const connection = new Connection(clusterApiUrl("devnet"), "confirmed");

    // Create a test wallet to listen to
    const wallet = Keypair.generate();

    // Register a callback to listen to the wallet (ws subscription)
    connection.onAccountChange(
    wallet.publicKey(),
    (updatedAccountInfo, context) =>
    console.log("Updated account info: ", updatedAccountInfo),
    "confirmed"
    );

    获取测试用的SOL

    你在本地工作时,为了发送交易,你需要一些 SOL。在非主网环境中,你可以向你的地址空投 SOL,获取SOL。

    const airdropSignature = await connection.requestAirdrop(
    keypair.publicKey,
    LAMPORTS_PER_SOL
    );

    await connection.confirmTransaction(airdropSignature);

    使用主网 (Mainnet) 账户和程序

    本地测试通常依赖于仅在主网上可用的程序和账户。Solana CLI 提供了以下两个功能:

    下载程序和账户 -将程序和账户加载到本地验证器中

    如何从主网加载账户

    可以将SRM代币的铸造(mint)账户下载到文件中:

    solana account -u m --output json-compact --output-file SRM_token.json SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt

    然后,通过在启动验证器时传递该账户文件和目标地址(在本地集群上)你可以将其加载到本地网络:

    solana-test-validator --account SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt SRM_token.json --reset

    如何从主网加载程序

    同样地,我们可以下载Serum Dex v3程序:

    solana program dump -u m 9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin serum_dex_v3.so

    然后,在启动验证器时,通过传递程序的文件和目标地址(在本地集群上)来将其加载到本地网络:

    solana-test-validator --bpf-program 9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin serum_dex_v3.so --reset
    - +
    将程序和账户加载到本地验证器中

    如何从主网加载账户

    可以将SRM代币的铸造(mint)账户下载到文件中:

    solana account -u m --output json-compact --output-file SRM_token.json SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt

    然后,通过在启动验证器时传递该账户文件和目标地址(在本地集群上)你可以将其加载到本地网络:

    solana-test-validator --account SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt SRM_token.json --reset

    如何从主网加载程序

    同样地,我们可以下载Serum Dex v3程序:

    solana program dump -u m 9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin serum_dex_v3.so

    然后,在启动验证器时,通过传递程序的文件和目标地址(在本地集群上)来将其加载到本地网络:

    solana-test-validator --bpf-program 9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin serum_dex_v3.so --reset
    + \ No newline at end of file diff --git a/cookbook-zh/references/name-service/index.html b/cookbook-zh/references/name-service/index.html index 1654a632e..9465fe038 100644 --- a/cookbook-zh/references/name-service/index.html +++ b/cookbook-zh/references/name-service/index.html @@ -5,13 +5,13 @@ 命名服务 | All in One Solana - +
    -

    命名服务

    名称注册表

    名称注册表存储与域名有关的信息。它由两部分组成:

    • 头部 (Header)
    • 数据 (Data)

    域名的数据始终以头部为前缀。以下是头部在 JavaScript 中的结构:

    export class NameRegistryState {
    parentName: PublicKey;
    owner: PublicKey;
    class: PublicKey;
    data: Buffer | undefined;

    static HEADER_LEN = 96;

    static schema: Schema = new Map([
    [
    NameRegistryState,
    {
    kind: "struct",
    fields: [
    ["parentName", [32]],
    ["owner", [32]],
    ["class", [32]],
    ],
    },
    ],
    ]);
    constructor(obj: {
    parentName: Uint8Array;
    owner: Uint8Array;
    class: Uint8Array;
    }) {
    this.parentName = new PublicKey(obj.parentName);
    this.owner = new PublicKey(obj.owner);
    this.class = new PublicKey(obj.class);
    }
    }

    解析SOL域名

    .SOL 域名是独特的、易于理解的域名,可以转换为公钥。许多钱包使用它们作为发送代币或 SOL 的另一种选项。你可以使用以下方法将 .SOL 域名转换为对应的公钥:

    const domain = "levi.sol";
    const hashedName = await getHashedName(domain.replace(".sol", ""));
    const nameAccountKey = await getNameAccountKey(
    hashedName,
    undefined,
    new PublicKey("58PwtjSDuFHuUkYjH9BYnnQKHfwo9reZhC2zMJv9JPkx") // SOL TLD Authority
    );
    const owner = await NameRegistryState.retrieve(
    new Connection(clusterApiUrl("mainnet-beta")),
    nameAccountKey
    );
    console.log(owner.registry.owner.toBase58());
    // JUskoxS2PTiaBpxfGaAPgf3cUNhdeYFGMKdL6mZKKfR

    反向查找

    这可以用于从公钥解析域名。

    // Public key of bonfida.sol
    const domainKey = new PublicKey("Crf8hzfthWGbGbLTVCiqRqV5MVnbpHB1L9KQMd6gsinb");

    const domainName = await performReverseLookup(connection, domainKey); // bonfida

    子域名查找

    为了解析一个子域名,你需要:

    1. 域名的密钥
    2. 域名的密钥
    3. 检索账户信息
    const parentDomain = "bonfida";
    const subDomain = "demo";

    // Step 1
    const hashedParentDomain = await getHashedName(parentDomain);
    const parentDomainKey = await getNameAccountKey(
    hashedParentDomain,
    undefined,
    SOL_TLD_AUTHORITY
    );

    // Step 2
    const subDomainKey = await getDNSRecordAddress(parentDomainKey, subDomain);

    // Step 3
    const registry = await NameRegistryState.retrieve(connection, subDomainKey);

    查找由公钥拥有的所有域名

    你可以通过使用带有memcmp过滤器的getProgramAccounts请求来检索钱包的所有域名。

    export async function findOwnedNameAccountsForUser(
    connection: Connection,
    userAccount: PublicKey
    ): Promise<PublicKey[]> {
    const filters = [
    {
    memcmp: {
    offset: 32,
    bytes: userAccount.toBase58(),
    },
    },
    ];
    const accounts = await connection.getProgramAccounts(NAME_PROGRAM_ID, {
    filters,
    });
    return accounts.map((a) => a.publicKey);
    }

    解析一个Twitter用户名

    Twitter用户名可以在 [Solana名称服务上注册](https://naming.bonfida.org/#/twitter-registration 并可以像.SOL域名一样使用。

    // Pubkey of the wallet you want to retrieve the Twitter handle
    const pubkey = new PublicKey("FidaeBkZkvDqi1GXNEwB8uWmj9Ngx2HXSS5nyGRuVFcZ");

    const [handle, registryKey] = await getHandleAndRegistryKey(connection, pubkey);

    Twitter用户名的反向查找

    为了找到与Twitter用户名相关联的SOL地址,你可以进行反向查找。

    const handle = "bonfida";

    const registry = await getTwitterRegistry(connection, handle);
    - +

    命名服务

    名称注册表

    名称注册表存储与域名有关的信息。它由两部分组成:

    • 头部 (Header)
    • 数据 (Data)

    域名的数据始终以头部为前缀。以下是头部在 JavaScript 中的结构:

    export class NameRegistryState {
    parentName: PublicKey;
    owner: PublicKey;
    class: PublicKey;
    data: Buffer | undefined;

    static HEADER_LEN = 96;

    static schema: Schema = new Map([
    [
    NameRegistryState,
    {
    kind: "struct",
    fields: [
    ["parentName", [32]],
    ["owner", [32]],
    ["class", [32]],
    ],
    },
    ],
    ]);
    constructor(obj: {
    parentName: Uint8Array;
    owner: Uint8Array;
    class: Uint8Array;
    }) {
    this.parentName = new PublicKey(obj.parentName);
    this.owner = new PublicKey(obj.owner);
    this.class = new PublicKey(obj.class);
    }
    }

    解析SOL域名

    .SOL 域名是独特的、易于理解的域名,可以转换为公钥。许多钱包使用它们作为发送代币或 SOL 的另一种选项。你可以使用以下方法将 .SOL 域名转换为对应的公钥:

    const domain = "levi.sol";
    const hashedName = await getHashedName(domain.replace(".sol", ""));
    const nameAccountKey = await getNameAccountKey(
    hashedName,
    undefined,
    new PublicKey("58PwtjSDuFHuUkYjH9BYnnQKHfwo9reZhC2zMJv9JPkx") // SOL TLD Authority
    );
    const owner = await NameRegistryState.retrieve(
    new Connection(clusterApiUrl("mainnet-beta")),
    nameAccountKey
    );
    console.log(owner.registry.owner.toBase58());
    // JUskoxS2PTiaBpxfGaAPgf3cUNhdeYFGMKdL6mZKKfR

    反向查找

    这可以用于从公钥解析域名。

    // Public key of bonfida.sol
    const domainKey = new PublicKey("Crf8hzfthWGbGbLTVCiqRqV5MVnbpHB1L9KQMd6gsinb");

    const domainName = await performReverseLookup(connection, domainKey); // bonfida

    子域名查找

    为了解析一个子域名,你需要:

    1. 域名的密钥
    2. 域名的密钥
    3. 检索账户信息
    const parentDomain = "bonfida";
    const subDomain = "demo";

    // Step 1
    const hashedParentDomain = await getHashedName(parentDomain);
    const parentDomainKey = await getNameAccountKey(
    hashedParentDomain,
    undefined,
    SOL_TLD_AUTHORITY
    );

    // Step 2
    const subDomainKey = await getDNSRecordAddress(parentDomainKey, subDomain);

    // Step 3
    const registry = await NameRegistryState.retrieve(connection, subDomainKey);

    查找由公钥拥有的所有域名

    你可以通过使用带有memcmp过滤器的getProgramAccounts请求来检索钱包的所有域名。

    export async function findOwnedNameAccountsForUser(
    connection: Connection,
    userAccount: PublicKey
    ): Promise<PublicKey[]> {
    const filters = [
    {
    memcmp: {
    offset: 32,
    bytes: userAccount.toBase58(),
    },
    },
    ];
    const accounts = await connection.getProgramAccounts(NAME_PROGRAM_ID, {
    filters,
    });
    return accounts.map((a) => a.publicKey);
    }

    解析一个Twitter用户名

    Twitter用户名可以在 [Solana名称服务上注册](https://naming.bonfida.org/#/twitter-registration 并可以像.SOL域名一样使用。

    // Pubkey of the wallet you want to retrieve the Twitter handle
    const pubkey = new PublicKey("FidaeBkZkvDqi1GXNEwB8uWmj9Ngx2HXSS5nyGRuVFcZ");

    const [handle, registryKey] = await getHandleAndRegistryKey(connection, pubkey);

    Twitter用户名的反向查找

    为了找到与Twitter用户名相关联的SOL地址,你可以进行反向查找。

    const handle = "bonfida";

    const registry = await getTwitterRegistry(connection, handle);
    + \ No newline at end of file diff --git a/cookbook-zh/references/nfts/index.html b/cookbook-zh/references/nfts/index.html index 7345a8762..eb102ac3f 100644 --- a/cookbook-zh/references/nfts/index.html +++ b/cookbook-zh/references/nfts/index.html @@ -5,14 +5,14 @@ 非同质化代币 (NFTs) | All in One Solana - +

    非同质化代币 (NFTs)

    如何创建一个NFT

    要创建一个 NFT,你需要:

    1. 将图像上传到像 Arweave 这样的 IPFS 网络上。
    2. 将 JSON 元数据上传到像 Arweave 这样的 IPFS 网络上。
    3. 调用 Metaplex 创建一个用于该 NFT 的账户。

    上传到 Arweave

    // 1. Upload image to Arweave
    const data = fs.readFileSync("./code/nfts/arweave-upload/lowres-dog.png");

    const transaction = await arweave.createTransaction({
    data: data,
    });

    transaction.addTag("Content-Type", "image/png");

    const wallet = JSON.parse(fs.readFileSync("wallet.json", "utf-8"))
    await arweave.transactions.sign(transaction, wallet);

    const response = await arweave.transactions.post(transaction);
    console.log(response);

    const id = transaction.id;
    const imageUrl = id ? `https://arweave.net/${id}` : undefined;

    // 2. Upload metadata to Arweave

    const metadataRequest = JSON.stringify(metadata);

    const metadataTransaction = await arweave.createTransaction({
    data: metadataRequest,
    });

    metadataTransaction.addTag("Content-Type", "application/json");

    await arweave.transactions.sign(metadataTransaction, wallet);

    await arweave.transactions.post(metadataTransaction);

    铸造(Mint)该 NFT

    如果你已经上传了图像和元数据,您可以使用以下代码铸造(Mint)该 NFT。

    const mintNFTResponse = await metaplex.nfts().create({
    uri: "https://ffaaqinzhkt4ukhbohixfliubnvpjgyedi3f2iccrq4efh3s.arweave.net/KUAIIbk6p8oo4XHRcq0U__C2r0mwQaNl0gQow4Qp9yk",
    maxSupply: 1,
    });
    info

    tip 注意 -你不能使用与你钱包不同的创作者信息来铸造(Mint) NFT。如果遇到创作者的问题,请确保你的元数据中将你列为创作者。

    如何获取 NFT 元数据

    Metaplex 的 NFT 元数据存储在 Arweave 上。为了获取 Arweave 的元数据,您需要获取 Metaplex PDA(程序派生账户)并对账户数据进行解码。

    const connection = new Connection(clusterApiUrl("mainnet-beta"));
    const keypair = Keypair.generate();

    const metaplex = new Metaplex(connection);
    metaplex.use(keypairIdentity(keypair));

    const mintAddress = new PublicKey(
    "Ay1U9DWphDgc7hq58Yj1yHabt91zTzvV2YJbAWkPNbaK"
    );

    const nft = await metaplex.nfts().findByMint({ mintAddress });

    console.log(nft.json);

    如何获取NFT的所有者

    如果你拥有 NFT 的铸币密钥,你可以通过查看该铸币密钥对应的最大代币账户来找到其当前所有者。

    请记住,NFT 的供应量为 1,它们是不可分割的,这意味着在任何时刻只有一个代币账户持有该代币,而其他所有与该铸币密钥相关的代币账户的余额都为 0。

    一旦确定了最大代币账户,我们可以获取它的所有者。

    const connection = new Connection("https://api.mainnet-beta.solana.com");
    const tokenMint = "9ARngHhVaCtH5JFieRdSS5Y8cdZk2TMF4tfGSWFB9iSK";
    const largestAccounts = await connection.getTokenLargestAccounts(
    new PublicKey(tokenMint)
    );
    const largestAccountInfo = await connection.getParsedAccountInfo(
    largestAccounts.value[0].address
    );
    console.log(largestAccountInfo.value.data.parsed.info.owner);

    如何获取 NFT 的铸币地址

    如果你知道Candy Machine的公钥,你可以使用以下代码获取从该Candy Machine生成的所有 NFT 铸币地址的列表。请注意,我们可以使用以下的 memcmp 过滤器,因为在 v1 版本中,第一个创作者的地址总是Candy Machine的地址。

    Candy Machine V1

    const getMintAddresses = async (firstCreatorAddress: PublicKey) => {
    const metadataAccounts = await connection.getProgramAccounts(
    TOKEN_METADATA_PROGRAM,
    {
    // The mint address is located at byte 33 and lasts for 32 bytes.
    dataSlice: { offset: 33, length: 32 },

    filters: [
    // Only get Metadata accounts.
    { dataSize: MAX_METADATA_LEN },

    // Filter using the first creator.
    {
    memcmp: {
    offset: CREATOR_ARRAY_START,
    bytes: firstCreatorAddress.toBase58(),
    },
    },
    ],
    }
    );

    return metadataAccounts.map((metadataAccountInfo) =>
    bs58.encode(metadataAccountInfo.account.data)
    );
    };

    getMintAddresses(candyMachineId);

    Candy Machine V2

    如果你正在使用Candy Machine v2,你首先需要访问其 "Candy Machine Creator" 地址,该地址是一个简单的 PDA,使用candy_machine和Candy Machine v2 地址作为种子生成。一旦你获得了创建者地址,你可以像对待 v1 版本一样使用它。

    const getCandyMachineCreator = async (
    candyMachine: PublicKey
    ): Promise<[PublicKey, number]> =>
    PublicKey.findProgramAddress(
    [Buffer.from("candy_machine"), candyMachine.toBuffer()],
    CANDY_MACHINE_V2_PROGRAM
    );

    const candyMachineCreator = await getCandyMachineCreator(candyMachineId);
    getMintAddresses(candyMachineCreator[0]);

    如何从钱包获取所有 NFT?

    当从钱包获取所有 NFT 时,你需要获取所有的代币账户,然后解析出其中的 NFT。你可以使用 Metaplex JS 库中的 findDataByOwner 方法来完成这个过程。

    const connection = new Connection(clusterApiUrl("mainnet-beta"), "confirmed");
    const keypair = Keypair.generate();

    const metaplex = new Metaplex(connection);
    metaplex.use(keypairIdentity(keypair));

    const owner = new PublicKey("2R4bHmSBHkHAskerTHE6GE1Fxbn31kaD5gHqpsPySVd7");
    const allNFTs = await metaplex.nfts().findAllByOwner({ owner });

    console.log(allNFTs);

    Candy Machine v2

    Metaplex JS SDK 现在支持通过代码创建和更新Candy Machine v2。它使开发者能够与糖果机v2 程序进行交互,创建、更新和删除Candy Machine,并从中铸造(Mint) NFT。

    如何创建Candy Machine

    const { candyMachine } = await metaplex.candyMachinesV2().create({
    sellerFeeBasisPoints: 5, // 0.05% royalties
    price: sol(0.0001), // 0.0001 SOL
    itemsAvailable: toBigNumber(5), // 5 items available
    });

    /**
    * #1 Candy Machine ID - HSZxtWx6vgGWGsWu9SouXkHA2bAKCMtMZyMKzF2dvhrR
    */

    如何删除Candy Machine

    // creating a candy machine
    const { candyMachine } = await metaplex.candyMachinesV2().create({
    sellerFeeBasisPoints: 5, // 0.05% royalties
    price: sol(0.0001), // 0.0001 SOL
    itemsAvailable: toBigNumber(5), // 5 items available
    });

    console.log(`Candy Machine ID - ${candyMachine.address.toString()}`);

    // deleting the candy machine
    const { response } = await metaplex.candyMachinesV2().delete({
    candyMachine,
    });

    如何通过权限查找Candy Machine

    要查找所有权限为特定公钥的 Candy Machine,我们需要使用 findAllBy 函数,并将 type 参数设置为 authority

    const candyMachines = await metaplex.candyMachinesV2().findAllBy({
    type: "authority",
    publicKey: authority,
    });

    candyMachines.map((candyMachine, index) => {
    console.log(`#${index + 1} Candy Machine ID - ${candyMachine.address}`);
    });

    /**
    * #1 Candy Machine ID - HSZxtWx6vgGWGsWu9SouXkHA2bAKCMtMZyMKzF2dvhrR
    */

    如何通过钱包地址查找Candy Machine

    要通过钱包地址获取 Candy Machine 对象,我们需要使用 findAllBy 函数,并将 type 参数设置为 wallet。你可以从浏览器的 "Anchor data" 选项卡中获取 Candy Machine 的钱包地址。

    const candyMachines = await metaplex.candyMachinesV2().findAllBy({
    type: "wallet",
    publicKey: wallet,
    });

    candyMachines.map((candyMachine, index) => {
    console.log(`#${index + 1} Candy Machine ID - ${candyMachine.address}`);
    });

    如何通过Candy Machine的地址查找它

    要通过Candy Machine的地址查找Candy Machine,我们需要使用findByAddress 函数。

    const candyMachine = await metaplex.candyMachinesV2().findByAddress({
    address: candyMachineId,
    });

    如何从Candy Machine找到铸造(mint)的 NFT

    const candyMachine = await metaplex.candyMachinesV2().findMintedNfts({
    candyMachine: candyMachineId,
    });

    如何将物品插入到Candy Machine

    await metaplex.candyMachines().insertItems({
    candyMachineId,
    items: [
    { name: "My NFT #1", uri: "https://example.com/nft1" },
    { name: "My NFT #2", uri: "https://example.com/nft2" },
    { name: "My NFT #3", uri: "https://example.com/nft3" },
    ],
    });

    如何从Candy Machine铸造(Mint)一个 NFT

    默认情况下,铸造的 NFT 的所有者是metaplex.identity().publicKey。如果你希望将 NFT 铸造到其他钱包中,可以将新的钱包公钥与newOwner参数一起传递。

    // by default, the owner of the minted nft would be `metaplex.identity().publicKey`. if you want to mint the nft to some other wallet, pass that public key along with the `newOwner` parameter
    const candyMachine = await metaplex.candyMachinesV2().mint({
    candyMachine: candyMachineId,
    // newOwner: new PublicKey("some-other-public-key");
    });
    - +你不能使用与你钱包不同的创作者信息来铸造(Mint) NFT。如果遇到创作者的问题,请确保你的元数据中将你列为创作者。

    如何获取 NFT 元数据

    Metaplex 的 NFT 元数据存储在 Arweave 上。为了获取 Arweave 的元数据,您需要获取 Metaplex PDA(程序派生账户)并对账户数据进行解码。

    const connection = new Connection(clusterApiUrl("mainnet-beta"));
    const keypair = Keypair.generate();

    const metaplex = new Metaplex(connection);
    metaplex.use(keypairIdentity(keypair));

    const mintAddress = new PublicKey(
    "Ay1U9DWphDgc7hq58Yj1yHabt91zTzvV2YJbAWkPNbaK"
    );

    const nft = await metaplex.nfts().findByMint({ mintAddress });

    console.log(nft.json);

    如何获取NFT的所有者

    如果你拥有 NFT 的铸币密钥,你可以通过查看该铸币密钥对应的最大代币账户来找到其当前所有者。

    请记住,NFT 的供应量为 1,它们是不可分割的,这意味着在任何时刻只有一个代币账户持有该代币,而其他所有与该铸币密钥相关的代币账户的余额都为 0。

    一旦确定了最大代币账户,我们可以获取它的所有者。

    const connection = new Connection("https://api.mainnet-beta.solana.com");
    const tokenMint = "9ARngHhVaCtH5JFieRdSS5Y8cdZk2TMF4tfGSWFB9iSK";
    const largestAccounts = await connection.getTokenLargestAccounts(
    new PublicKey(tokenMint)
    );
    const largestAccountInfo = await connection.getParsedAccountInfo(
    largestAccounts.value[0].address
    );
    console.log(largestAccountInfo.value.data.parsed.info.owner);

    如何获取 NFT 的铸币地址

    如果你知道Candy Machine的公钥,你可以使用以下代码获取从该Candy Machine生成的所有 NFT 铸币地址的列表。请注意,我们可以使用以下的 memcmp 过滤器,因为在 v1 版本中,第一个创作者的地址总是Candy Machine的地址。

    Candy Machine V1

    const getMintAddresses = async (firstCreatorAddress: PublicKey) => {
    const metadataAccounts = await connection.getProgramAccounts(
    TOKEN_METADATA_PROGRAM,
    {
    // The mint address is located at byte 33 and lasts for 32 bytes.
    dataSlice: { offset: 33, length: 32 },

    filters: [
    // Only get Metadata accounts.
    { dataSize: MAX_METADATA_LEN },

    // Filter using the first creator.
    {
    memcmp: {
    offset: CREATOR_ARRAY_START,
    bytes: firstCreatorAddress.toBase58(),
    },
    },
    ],
    }
    );

    return metadataAccounts.map((metadataAccountInfo) =>
    bs58.encode(metadataAccountInfo.account.data)
    );
    };

    getMintAddresses(candyMachineId);

    Candy Machine V2

    如果你正在使用Candy Machine v2,你首先需要访问其 "Candy Machine Creator" 地址,该地址是一个简单的 PDA,使用candy_machine和Candy Machine v2 地址作为种子生成。一旦你获得了创建者地址,你可以像对待 v1 版本一样使用它。

    const getCandyMachineCreator = async (
    candyMachine: PublicKey
    ): Promise<[PublicKey, number]> =>
    PublicKey.findProgramAddress(
    [Buffer.from("candy_machine"), candyMachine.toBuffer()],
    CANDY_MACHINE_V2_PROGRAM
    );

    const candyMachineCreator = await getCandyMachineCreator(candyMachineId);
    getMintAddresses(candyMachineCreator[0]);

    如何从钱包获取所有 NFT?

    当从钱包获取所有 NFT 时,你需要获取所有的代币账户,然后解析出其中的 NFT。你可以使用 Metaplex JS 库中的 findDataByOwner 方法来完成这个过程。

    const connection = new Connection(clusterApiUrl("mainnet-beta"), "confirmed");
    const keypair = Keypair.generate();

    const metaplex = new Metaplex(connection);
    metaplex.use(keypairIdentity(keypair));

    const owner = new PublicKey("2R4bHmSBHkHAskerTHE6GE1Fxbn31kaD5gHqpsPySVd7");
    const allNFTs = await metaplex.nfts().findAllByOwner({ owner });

    console.log(allNFTs);

    Candy Machine v2

    Metaplex JS SDK 现在支持通过代码创建和更新Candy Machine v2。它使开发者能够与糖果机v2 程序进行交互,创建、更新和删除Candy Machine,并从中铸造(Mint) NFT。

    如何创建Candy Machine

    const { candyMachine } = await metaplex.candyMachinesV2().create({
    sellerFeeBasisPoints: 5, // 0.05% royalties
    price: sol(0.0001), // 0.0001 SOL
    itemsAvailable: toBigNumber(5), // 5 items available
    });

    /**
    * #1 Candy Machine ID - HSZxtWx6vgGWGsWu9SouXkHA2bAKCMtMZyMKzF2dvhrR
    */

    如何删除Candy Machine

    // creating a candy machine
    const { candyMachine } = await metaplex.candyMachinesV2().create({
    sellerFeeBasisPoints: 5, // 0.05% royalties
    price: sol(0.0001), // 0.0001 SOL
    itemsAvailable: toBigNumber(5), // 5 items available
    });

    console.log(`Candy Machine ID - ${candyMachine.address.toString()}`);

    // deleting the candy machine
    const { response } = await metaplex.candyMachinesV2().delete({
    candyMachine,
    });

    如何通过权限查找Candy Machine

    要查找所有权限为特定公钥的 Candy Machine,我们需要使用 findAllBy 函数,并将 type 参数设置为 authority

    const candyMachines = await metaplex.candyMachinesV2().findAllBy({
    type: "authority",
    publicKey: authority,
    });

    candyMachines.map((candyMachine, index) => {
    console.log(`#${index + 1} Candy Machine ID - ${candyMachine.address}`);
    });

    /**
    * #1 Candy Machine ID - HSZxtWx6vgGWGsWu9SouXkHA2bAKCMtMZyMKzF2dvhrR
    */

    如何通过钱包地址查找Candy Machine

    要通过钱包地址获取 Candy Machine 对象,我们需要使用 findAllBy 函数,并将 type 参数设置为 wallet。你可以从浏览器的 "Anchor data" 选项卡中获取 Candy Machine 的钱包地址。

    const candyMachines = await metaplex.candyMachinesV2().findAllBy({
    type: "wallet",
    publicKey: wallet,
    });

    candyMachines.map((candyMachine, index) => {
    console.log(`#${index + 1} Candy Machine ID - ${candyMachine.address}`);
    });

    如何通过Candy Machine的地址查找它

    要通过Candy Machine的地址查找Candy Machine,我们需要使用findByAddress 函数。

    const candyMachine = await metaplex.candyMachinesV2().findByAddress({
    address: candyMachineId,
    });

    如何从Candy Machine找到铸造(mint)的 NFT

    const candyMachine = await metaplex.candyMachinesV2().findMintedNfts({
    candyMachine: candyMachineId,
    });

    如何将物品插入到Candy Machine

    await metaplex.candyMachines().insertItems({
    candyMachineId,
    items: [
    { name: "My NFT #1", uri: "https://example.com/nft1" },
    { name: "My NFT #2", uri: "https://example.com/nft2" },
    { name: "My NFT #3", uri: "https://example.com/nft3" },
    ],
    });

    如何从Candy Machine铸造(Mint)一个 NFT

    默认情况下,铸造的 NFT 的所有者是metaplex.identity().publicKey。如果你希望将 NFT 铸造到其他钱包中,可以将新的钱包公钥与newOwner参数一起传递。

    // by default, the owner of the minted nft would be `metaplex.identity().publicKey`. if you want to mint the nft to some other wallet, pass that public key along with the `newOwner` parameter
    const candyMachine = await metaplex.candyMachinesV2().mint({
    candyMachine: candyMachineId,
    // newOwner: new PublicKey("some-other-public-key");
    });
    + \ No newline at end of file diff --git a/cookbook-zh/references/offline-transactions/index.html b/cookbook-zh/references/offline-transactions/index.html index 313305a9a..14ec01065 100644 --- a/cookbook-zh/references/offline-transactions/index.html +++ b/cookbook-zh/references/offline-transactions/index.html @@ -5,13 +5,13 @@ 发送离线交易 | All in One Solana - +
    -

    发送离线交易

    签署交易

    要创建离线交易,你需要签署交易,然后任何人都可以在网络上广播它。

    // there are two ways you can recover the tx
    // 3.a Recover Tranasction (use populate then addSignauture)
    {
    let recoverTx = Transaction.populate(Message.from(realDataNeedToSign));
    recoverTx.addSignature(feePayer.publicKey, Buffer.from(feePayerSignature));
    recoverTx.addSignature(alice.publicKey, Buffer.from(aliceSignature));

    // 4. Send transaction
    console.log(
    `txhash: ${await connection.sendRawTransaction(recoverTx.serialize())}`
    );
    }

    // or

    // 3.b. Recover Tranasction (use populate with signature)
    {
    let recoverTx = Transaction.populate(Message.from(realDataNeedToSign), [
    bs58.encode(feePayerSignature),
    bs58.encode(aliceSignature),
    ]);

    // 4. Send transaction
    console.log(
    `txhash: ${await connection.sendRawTransaction(recoverTx.serialize())}`
    );
    }

    部分签署交易

    当一个交易需要多个签名时,你可以部分签署它。其他签署者随后可以签署并在网络上广播该交易。

    以下是一些有用的情况示例:

    • 用支付作为交换发送 SPL 代币
    • 签署交易以便以后验证其真实性
    • 在需要你签名的自定义程序中调用交易

    在这个例子中,Bob给Alice发送了一个 SPL 代币,回报Alice的付款:

    // 1. Add an instruction to send the token from Bob to Alice
    transaction.add(
    createTransferCheckedInstruction(
    bobTokenAddress, // source
    tokenAddress, // mint
    aliceTokenAccount.address, // destination
    bobKeypair.publicKey, // owner of source account
    1 * 10 ** tokenMint.decimals, // amount to transfer
    tokenMint.decimals // decimals of token
    )
    );

    // 2. Bob partially signs the transaction
    transaction.partialSign(bobKeypair);

    // 3. Serialize the transaction without requiring all signatures
    const serializedTransaction = transaction.serialize({
    requireAllSignatures: false,
    });

    // 4. Alice can deserialize the transaction
    const recoveredTransaction = Transaction.from(
    Buffer.from(transactionBase64, "base64")
    );

    耐久性的 Nonce

    RecentBlockhash对于交易非常重要。如果你使用一个过期的最近区块哈希(在150个区块后),你的交易将被拒绝。你可以使用耐久性Nonce来获取一个永不过期的最近区块哈希。要触发这种机制,你的交易必须:

    1. 使用存储在nonce账户中的nonce作为最近的区块哈希。
    2. nonce advance操作放在第一个指令中。

    创建Nonce账户

    let tx = new Transaction().add(
    // create nonce account
    SystemProgram.createAccount({
    fromPubkey: feePayer.publicKey,
    newAccountPubkey: nonceAccount.publicKey,
    lamports: await connection.getMinimumBalanceForRentExemption(
    NONCE_ACCOUNT_LENGTH
    ),
    space: NONCE_ACCOUNT_LENGTH,
    programId: SystemProgram.programId,
    }),
    // init nonce account
    SystemProgram.nonceInitialize({
    noncePubkey: nonceAccount.publicKey, // nonce account pubkey
    authorizedPubkey: nonceAccountAuth.publicKey, // nonce account authority (for advance and close)
    })
    );

    console.log(
    `txhash: ${await connection.sendTransaction(tx, [feePayer, nonceAccount])}`
    );

    获取Nonce账户

    let accountInfo = await connection.getAccountInfo(nonceAccountPubkey);
    let nonceAccount = NonceAccount.fromAccountData(accountInfo.data);

    使用Nonce账户

    let tx = new Transaction().add(
    // nonce advance must be the first insturction
    SystemProgram.nonceAdvance({
    noncePubkey: nonceAccountPubkey,
    authorizedPubkey: nonceAccountAuth.publicKey,
    }),
    // after that, you do what you really want to do, here we append a transfer instruction as an example.
    SystemProgram.transfer({
    fromPubkey: feePayer.publicKey,
    toPubkey: nonceAccountAuth.publicKey,
    lamports: 1,
    })
    );
    // assign `nonce` as recentBlockhash
    tx.recentBlockhash = nonceAccount.nonce;
    tx.feePayer = feePayer.publicKey;
    tx.sign(
    feePayer,
    nonceAccountAuth
    ); /* fee payer + nonce account authority + ... */

    console.log(`txhash: ${await connection.sendRawTransaction(tx.serialize())}`);
    - +

    发送离线交易

    签署交易

    要创建离线交易,你需要签署交易,然后任何人都可以在网络上广播它。

    // there are two ways you can recover the tx
    // 3.a Recover Tranasction (use populate then addSignauture)
    {
    let recoverTx = Transaction.populate(Message.from(realDataNeedToSign));
    recoverTx.addSignature(feePayer.publicKey, Buffer.from(feePayerSignature));
    recoverTx.addSignature(alice.publicKey, Buffer.from(aliceSignature));

    // 4. Send transaction
    console.log(
    `txhash: ${await connection.sendRawTransaction(recoverTx.serialize())}`
    );
    }

    // or

    // 3.b. Recover Tranasction (use populate with signature)
    {
    let recoverTx = Transaction.populate(Message.from(realDataNeedToSign), [
    bs58.encode(feePayerSignature),
    bs58.encode(aliceSignature),
    ]);

    // 4. Send transaction
    console.log(
    `txhash: ${await connection.sendRawTransaction(recoverTx.serialize())}`
    );
    }

    部分签署交易

    当一个交易需要多个签名时,你可以部分签署它。其他签署者随后可以签署并在网络上广播该交易。

    以下是一些有用的情况示例:

    • 用支付作为交换发送 SPL 代币
    • 签署交易以便以后验证其真实性
    • 在需要你签名的自定义程序中调用交易

    在这个例子中,Bob给Alice发送了一个 SPL 代币,回报Alice的付款:

    // 1. Add an instruction to send the token from Bob to Alice
    transaction.add(
    createTransferCheckedInstruction(
    bobTokenAddress, // source
    tokenAddress, // mint
    aliceTokenAccount.address, // destination
    bobKeypair.publicKey, // owner of source account
    1 * 10 ** tokenMint.decimals, // amount to transfer
    tokenMint.decimals // decimals of token
    )
    );

    // 2. Bob partially signs the transaction
    transaction.partialSign(bobKeypair);

    // 3. Serialize the transaction without requiring all signatures
    const serializedTransaction = transaction.serialize({
    requireAllSignatures: false,
    });

    // 4. Alice can deserialize the transaction
    const recoveredTransaction = Transaction.from(
    Buffer.from(transactionBase64, "base64")
    );

    耐久性的 Nonce

    RecentBlockhash对于交易非常重要。如果你使用一个过期的最近区块哈希(在150个区块后),你的交易将被拒绝。你可以使用耐久性Nonce来获取一个永不过期的最近区块哈希。要触发这种机制,你的交易必须:

    1. 使用存储在nonce账户中的nonce作为最近的区块哈希。
    2. nonce advance操作放在第一个指令中。

    创建Nonce账户

    let tx = new Transaction().add(
    // create nonce account
    SystemProgram.createAccount({
    fromPubkey: feePayer.publicKey,
    newAccountPubkey: nonceAccount.publicKey,
    lamports: await connection.getMinimumBalanceForRentExemption(
    NONCE_ACCOUNT_LENGTH
    ),
    space: NONCE_ACCOUNT_LENGTH,
    programId: SystemProgram.programId,
    }),
    // init nonce account
    SystemProgram.nonceInitialize({
    noncePubkey: nonceAccount.publicKey, // nonce account pubkey
    authorizedPubkey: nonceAccountAuth.publicKey, // nonce account authority (for advance and close)
    })
    );

    console.log(
    `txhash: ${await connection.sendTransaction(tx, [feePayer, nonceAccount])}`
    );

    获取Nonce账户

    let accountInfo = await connection.getAccountInfo(nonceAccountPubkey);
    let nonceAccount = NonceAccount.fromAccountData(accountInfo.data);

    使用Nonce账户

    let tx = new Transaction().add(
    // nonce advance must be the first insturction
    SystemProgram.nonceAdvance({
    noncePubkey: nonceAccountPubkey,
    authorizedPubkey: nonceAccountAuth.publicKey,
    }),
    // after that, you do what you really want to do, here we append a transfer instruction as an example.
    SystemProgram.transfer({
    fromPubkey: feePayer.publicKey,
    toPubkey: nonceAccountAuth.publicKey,
    lamports: 1,
    })
    );
    // assign `nonce` as recentBlockhash
    tx.recentBlockhash = nonceAccount.nonce;
    tx.feePayer = feePayer.publicKey;
    tx.sign(
    feePayer,
    nonceAccountAuth
    ); /* fee payer + nonce account authority + ... */

    console.log(`txhash: ${await connection.sendRawTransaction(tx.serialize())}`);
    + \ No newline at end of file diff --git a/cookbook-zh/references/programs/index.html b/cookbook-zh/references/programs/index.html index 2c7b9e4bc..361c49bf1 100644 --- a/cookbook-zh/references/programs/index.html +++ b/cookbook-zh/references/programs/index.html @@ -5,13 +5,13 @@ 编写程序 | All in One Solana - +
    -

    编写程序

    如何在程序中转移 SOL

    你的Solana程序可以在不"调用"系统程序的情况下将lamports从一个账户转移给另一个账户。基本规则是,你的程序可以将lamports从你的程序所拥有的任何账户转移到任何账户。

    接收方账户不一定要是你的程序所拥有的账户。

    /// Transfers lamports from one account (must be program owned)
    /// to another account. The recipient can by any account
    fn transfer_service_fee_lamports(
    from_account: &AccountInfo,
    to_account: &AccountInfo,
    amount_of_lamports: u64,
    ) -> ProgramResult {
    // Does the from account have enough lamports to transfer?
    if **from_account.try_borrow_lamports()? < amount_of_lamports {
    return Err(CustomError::InsufficientFundsForTransaction.into());
    }
    // Debit from_account and credit to_account
    **from_account.try_borrow_mut_lamports()? -= amount_of_lamports;
    **to_account.try_borrow_mut_lamports()? += amount_of_lamports;
    Ok(())
    }

    /// Primary function handler associated with instruction sent
    /// to your program
    fn instruction_handler(accounts: &[AccountInfo]) -> ProgramResult {
    // Get the 'from' and 'to' accounts
    let account_info_iter = &mut accounts.iter();
    let from_account = next_account_info(account_info_iter)?;
    let to_service_account = next_account_info(account_info_iter)?;

    // Extract a service 'fee' of 5 lamports for performing this instruction
    transfer_service_fee_lamports(from_account, to_service_account, 5u64)?;

    // Perform the primary instruction
    // ... etc.

    Ok(())
    }

    如何在程序中获取时钟

    获取时钟的方法有两种:

    1. SYSVAR_CLOCK_PUBKEY作为指令的参数传入。
    2. 在指令内部直接访问时钟。

    了解这两种方法会对你有好处,因为一些传统的程序仍然将SYSVAR_CLOCK_PUBKEY作为一个账户来使用。

    在指令中将时钟作为一个账户传递

    让我们创建一个指令,该指令接收一个账户用于初始化,并接收 SYSVAR 的公钥。

    let clock = Clock::from_account_info(&sysvar_clock_pubkey)?;
    let current_timestamp = clock.unix_timestamp;

    现在,我们通过客户端传递时钟的 SYSVAR 公共地址:

    (async () => {
    const programId = new PublicKey(
    "77ezihTV6mTh2Uf3ggwbYF2NyGJJ5HHah1GrdowWJVD3"
    );

    // Passing Clock Sys Var
    const passClockIx = new TransactionInstruction({
    programId: programId,
    keys: [
    {
    isSigner: false,
    isWritable: true,
    pubkey: helloAccount.publicKey,
    },
    {
    is_signer: false,
    is_writable: false,
    pubkey: SYSVAR_CLOCK_PUBKEY,
    },
    ],
    });

    const transaction = new Transaction();
    transaction.add(passClockIx);

    const txHash = await connection.sendTransaction(transaction, [
    feePayer,
    helloAccount,
    ]);

    console.log(`Transaction succeeded. TxHash: ${txHash}`);
    })();

    在指令内部直接访问时钟

    让我们创建同样的指令,但这次我们不需要从客户端传递SYSVAR_CLOCK_PUBKEY

    let clock = Clock::get()?;
    let current_timestamp = clock.unix_timestamp;

    现在,客户端只需要传递状态和支付账户的指令:

    (async () => {
    const programId = new PublicKey(
    "4ZEdbCtb5UyCSiAMHV5eSHfyjq3QwbG3yXb6oHD7RYjk"
    );

    // No more requirement to pass clock sys var key
    const initAccountIx = new TransactionInstruction({
    programId: programId,
    keys: [
    {
    isSigner: false,
    isWritable: true,
    pubkey: helloAccount.publicKey,
    },
    ],
    });

    const transaction = new Transaction();
    transaction.add(initAccountIx);

    const txHash = await connection.sendTransaction(transaction, [
    feePayer,
    helloAccount,
    ]);

    console.log(`Transaction succeeded. TxHash: ${txHash}`);
    })();

    如何更改账户大小

    你可以使用realloc函数来更改程序拥有的账户的大小。realloc函数可以将账户的大小调整到最大10KB。当你使用realloc增加账户的大小时,你需要转移lamports以保持该账户的租金免除状态。

    // adding a publickey to the account
    let new_size = pda_account.data.borrow().len() + 32;

    let rent = Rent::get()?;
    let new_minimum_balance = rent.minimum_balance(new_size);

    let lamports_diff = new_minimum_balance.saturating_sub(pda_account.lamports());
    invoke(
    &system_instruction::transfer(funding_account.key, pda_account.key, lamports_diff),
    &[
    funding_account.clone(),
    pda_account.clone(),
    system_program.clone(),
    ],
    )?;

    pda_account.realloc(new_size, false)?;

    跨程序调用的方法

    跨程序调用,简单来说,就是在我们的程序中调用另一个程序的指令。一个很好的例子是Uniswapswap功能。UniswapV2Router合约调用必要的逻辑进行交换,并调用ERC20合约的transfer函数将代币从一个人转移到另一个人。同样的方式,我们可以调用程序的指令来实现多种目的。

    让我们来看看我们的第一个例子,即SPL Token Programtransfer指令。进行转账所需的账户包括:

    1. 源代币账户(我们持有代币的账户)
    2. 目标代币账户(我们要将代币转移至的账户)
    3. 源代币账户的持有者(我们将为其签名的钱包地址)
    let token_transfer_amount = instruction_data
    .get(..8)
    .and_then(|slice| slice.try_into().ok())
    .map(u64::from_le_bytes)
    .ok_or(ProgramError::InvalidAccountData)?;

    let transfer_tokens_instruction = transfer(
    &token_program.key,
    &source_token_account.key,
    &destination_token_account.key,
    &source_token_account_holder.key,
    &[&source_token_account_holder.key],
    token_transfer_amount,
    )?;

    let required_accounts_for_transfer = [
    source_token_account.clone(),
    destination_token_account.clone(),
    source_token_account_holder.clone(),
    ];

    invoke(
    &transfer_tokens_instruction,
    &required_accounts_for_transfer,
    )?;

    相应的客户端指令如下所示。有关了解铸币和代币创建指令,请参考附近的完整代码。

    (async () => {
    const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
    const programId = new PublicKey(
    "EfYK91eN3AqTwY1C34W6a33qGAtQ8HJYVhNv7cV4uMZj"
    );

    const transferTokensIx = new TransactionInstruction({
    programId: programId,
    data: TOKEN_TRANSFER_AMOUNT_BUFFER,
    keys: [
    {
    isSigner: false,
    isWritable: true,
    pubkey: SOURCE_TOKEN_ACCOUNT.publicKey,
    },
    {
    isSigner: false,
    isWritable: true,
    pubkey: DESTINATION_TOKEN_ACCOUNT.publicKey,
    },
    {
    isSigner: true,
    isWritable: true,
    pubkey: PAYER_KEYPAIR.publicKey,
    },
    {
    isSigner: false,
    isWritable: false,
    pubkey: TOKEN_PROGRAM_ID,
    },
    ],
    });

    const transaction = new Transaction();
    transaction.add(transferTokensIx);

    const txHash = await connection.sendTransaction(transaction, [
    PAYER_KEYPAIR,
    TOKEN_MINT_ACCOUNT,
    SOURCE_TOKEN_ACCOUNT,
    DESTINATION_TOKEN_ACCOUNT,
    ]);

    console.log(`Token transfer CPI success: ${txHash}`);
    })();

    现在让我们来看另一个例子,即System Programcreate_account指令。这里与上面提到的指令有一点不同。在上述例子中,我们不需要在invoke函数中将token_program作为账户之一传递。然而,在某些情况下,您需要传递调用指令的program_id。在我们的例子中,它将是System Programprogram_id("11111111111111111111111111111111")。所以现在所需的账户包括:

    let account_span = instruction_data
    .get(..8)
    .and_then(|slice| slice.try_into().ok())
    .map(u64::from_le_bytes)
    .ok_or(ProgramError::InvalidAccountData)?;

    let lamports_required = (Rent::get()?).minimum_balance(account_span as usize);

    let create_account_instruction = create_account(
    &payer_account.key,
    &general_state_account.key,
    lamports_required,
    account_span,
    program_id,
    );

    let required_accounts_for_create = [
    payer_account.clone(),
    general_state_account.clone(),
    system_program.clone(),
    ];

    invoke(&create_account_instruction, &required_accounts_for_create)?;

    对应的客户端代码如下所示:

    (async () => {
    const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
    const programId = new PublicKey(
    "DkuQ5wsndkzXfgqDB6Lgf4sDjBi4gkLSak1dM5Mn2RuQ"
    );

    // Airdropping some SOL
    await connection.confirmTransaction(
    await connection.requestAirdrop(PAYER_KEYPAIR.publicKey, LAMPORTS_PER_SOL)
    );

    // Our program's CPI instruction (create_account)
    const creataAccountIx = new TransactionInstruction({
    programId: programId,
    data: ACCOUNT_SPACE_BUFFER,
    keys: [
    {
    isSigner: true,
    isWritable: true,
    pubkey: PAYER_KEYPAIR.publicKey,
    },
    {
    isSigner: true,
    isWritable: true,
    pubkey: GENERAL_STATE_KEYPAIR.publicKey,
    },
    {
    isSigner: false,
    isWritable: false,
    pubkey: SystemProgram.programId,
    },
    ],
    });

    const transaction = new Transaction();
    // Adding up all the above instructions
    transaction.add(creataAccountIx);

    const txHash = await connection.sendTransaction(transaction, [
    PAYER_KEYPAIR,
    GENERAL_STATE_KEYPAIR,
    ]);

    console.log(`Create Account CPI Success: ${txHash}`);
    })();

    如何创建PDA

    程序派生地址(Program Derived Address,PDA)是程序拥有的账户,但没有私钥。相反,它的签名是通过一组种子和一个阻碍值(一个确保其不在曲线上的随机数)获取的。"生成"程序地址与"创建"它是不同的。可以使用Pubkey::find_program_address来生成PDA。创建PDA实质上意味着初始化该地址的空间并将其状态设置为初始状态。普通的密钥对账户可以在我们的程序之外创建,然后将其用于初始化PDA的状态。不幸的是,对于PDA来说,它必须在链上创建,因为它本身无法代表自己进行签名。因此,我们使用invoke_signed来传递PDA的种子,以及资金账户的签名,从而实现了PDA的账户创建。

    let create_pda_account_ix = system_instruction::create_account(
    &funding_account.key,
    &pda_account.key,
    lamports_required,
    ACCOUNT_DATA_LEN.try_into().unwrap(),
    &program_id,
    );

    invoke_signed(
    &create_pda_account_ix,
    &[funding_account.clone(), pda_account.clone()],
    &[signers_seeds],
    )?;

    可以通过客户端按如下方式发送所需的账户:

    const PAYER_KEYPAIR = Keypair.generate();

    (async () => {
    const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
    const programId = new PublicKey(
    "6eW5nnSosr2LpkUGCdznsjRGDhVb26tLmiM1P8RV1QQp"
    );

    const [pda, bump] = await PublicKey.findProgramAddress(
    [Buffer.from("customaddress"), PAYER_KEYPAIR.publicKey.toBuffer()],
    programId
    );

    const createPDAIx = new TransactionInstruction({
    programId: programId,
    data: Buffer.from(Uint8Array.of(bump)),
    keys: [
    {
    isSigner: true,
    isWritable: true,
    pubkey: PAYER_KEYPAIR.publicKey,
    },
    {
    isSigner: false,
    isWritable: true,
    pubkey: pda,
    },
    {
    isSigner: false,
    isWritable: false,
    pubkey: SystemProgram.programId,
    },
    ],
    });

    const transaction = new Transaction();
    transaction.add(createPDAIx);

    const txHash = await connection.sendTransaction(transaction, [PAYER_KEYPAIR]);
    })();

    如何读取账户

    在Solana中,几乎所有的指令都至少需要2-3个账户,并且在指令处理程序中会说明它期望的账户顺序。如果我们利用Rust中的iter()方法,而不是手动索引账户,那么这将非常简单。next_account_info方法基本上是对可迭代对象的第一个索引进行切片,并返回账户数组中存在的账户。让我们看一个简单的指令,它期望一堆账户并需要解析每个账户。

    pub fn process_instruction(
    _program_id: &Pubkey,
    accounts: &[AccountInfo],
    _instruction_data: &[u8],
    ) -> ProgramResult {
    // Fetching all the accounts as a iterator (facilitating for loops and iterations)
    let accounts_iter = &mut accounts.iter();
    // Payer account
    let payer_account = next_account_info(accounts_iter)?;
    // Hello state account
    let hello_state_account = next_account_info(accounts_iter)?;
    // Rent account
    let rent_account = next_account_info(accounts_iter)?;
    // System Program
    let system_program = next_account_info(accounts_iter)?;

    Ok(())
    }

    如何验证账户

    由于Solana中的程序是无状态的,作为程序创建者,我们必须尽可能验证传递的账户,以避免任何恶意账户的进入。可以进行的基本检查包括:

    1. 检查预期的签名账户是否已签名。
    2. 检查预期的状态账户是否已标记为可写。
    3. 检查预期的状态账户的所有者是否为调用程序的程序ID。
    4. 如果首次初始化状态,请检查账户是否已经初始化。
    5. 检查是否按预期传递了任何跨程序的ID(在需要时)。

    下面是一个基本的指令,它使用上述检查初始化英雄状态账户的示例:

    pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    _instruction_data: &[u8],
    ) -> ProgramResult {
    let accounts_iter = &mut accounts.iter();
    let payer_account = next_account_info(accounts_iter)?;
    let hello_state_account = next_account_info(accounts_iter)?;
    let system_program = next_account_info(accounts_iter)?;

    let rent = Rent::get()?;

    // Checking if payer account is the signer
    if !payer_account.is_signer {
    return Err(ProgramError::MissingRequiredSignature);
    }

    // Checking if hello state account is rent exempt
    if !rent.is_exempt(hello_state_account.lamports(), 1) {
    return Err(ProgramError::AccountNotRentExempt);
    }

    // Checking if hello state account is writable
    if !hello_state_account.is_writable {
    return Err(ProgramError::InvalidAccountData);
    }

    // Checking if hello state account's owner is the current program
    if hello_state_account.owner.ne(&program_id) {
    return Err(ProgramError::IllegalOwner);
    }

    // Checking if the system program is valid
    if system_program.key.ne(&SYSTEM_PROGRAM_ID) {
    return Err(ProgramError::IncorrectProgramId);
    }

    let mut hello_state = HelloState::try_from_slice(&hello_state_account.data.borrow())?;

    // Checking if the state has already been initialized
    if hello_state.is_initialized {
    return Err(ProgramError::AccountAlreadyInitialized);
    }

    hello_state.is_initialized = true;
    hello_state.serialize(&mut &mut hello_state_account.data.borrow_mut()[..])?;
    msg!("Account initialized :)");

    Ok(())
    }

    如何从一个交易中读取多个指令

    Solana允许我们查看当前交易中的所有指令。我们可以将它们存储在一个变量中,并对其进行迭代。我们可以利用这一点做许多事情,比如检查可疑的交易。

    let mut idx = 0;
    let num_instructions = read_u16(&mut idx, &instruction_sysvar)
    .map_err(|_| MyError::NoInstructionFound)?;


    for index in 0..num_instructions {

    let mut current = 2 + (index * 2) as usize;
    let start = read_u16(&mut current, &instruction_sysvar).unwrap();

    current = start as usize;
    let num_accounts = read_u16(&mut current, &instruction_sysvar).unwrap();
    current += (num_accounts as usize) * (1 + 32);

    }
    - +

    编写程序

    如何在程序中转移 SOL

    你的Solana程序可以在不"调用"系统程序的情况下将lamports从一个账户转移给另一个账户。基本规则是,你的程序可以将lamports从你的程序所拥有的任何账户转移到任何账户。

    接收方账户不一定要是你的程序所拥有的账户。

    /// Transfers lamports from one account (must be program owned)
    /// to another account. The recipient can by any account
    fn transfer_service_fee_lamports(
    from_account: &AccountInfo,
    to_account: &AccountInfo,
    amount_of_lamports: u64,
    ) -> ProgramResult {
    // Does the from account have enough lamports to transfer?
    if **from_account.try_borrow_lamports()? < amount_of_lamports {
    return Err(CustomError::InsufficientFundsForTransaction.into());
    }
    // Debit from_account and credit to_account
    **from_account.try_borrow_mut_lamports()? -= amount_of_lamports;
    **to_account.try_borrow_mut_lamports()? += amount_of_lamports;
    Ok(())
    }

    /// Primary function handler associated with instruction sent
    /// to your program
    fn instruction_handler(accounts: &[AccountInfo]) -> ProgramResult {
    // Get the 'from' and 'to' accounts
    let account_info_iter = &mut accounts.iter();
    let from_account = next_account_info(account_info_iter)?;
    let to_service_account = next_account_info(account_info_iter)?;

    // Extract a service 'fee' of 5 lamports for performing this instruction
    transfer_service_fee_lamports(from_account, to_service_account, 5u64)?;

    // Perform the primary instruction
    // ... etc.

    Ok(())
    }

    如何在程序中获取时钟

    获取时钟的方法有两种:

    1. SYSVAR_CLOCK_PUBKEY作为指令的参数传入。
    2. 在指令内部直接访问时钟。

    了解这两种方法会对你有好处,因为一些传统的程序仍然将SYSVAR_CLOCK_PUBKEY作为一个账户来使用。

    在指令中将时钟作为一个账户传递

    让我们创建一个指令,该指令接收一个账户用于初始化,并接收 SYSVAR 的公钥。

    let clock = Clock::from_account_info(&sysvar_clock_pubkey)?;
    let current_timestamp = clock.unix_timestamp;

    现在,我们通过客户端传递时钟的 SYSVAR 公共地址:

    (async () => {
    const programId = new PublicKey(
    "77ezihTV6mTh2Uf3ggwbYF2NyGJJ5HHah1GrdowWJVD3"
    );

    // Passing Clock Sys Var
    const passClockIx = new TransactionInstruction({
    programId: programId,
    keys: [
    {
    isSigner: false,
    isWritable: true,
    pubkey: helloAccount.publicKey,
    },
    {
    is_signer: false,
    is_writable: false,
    pubkey: SYSVAR_CLOCK_PUBKEY,
    },
    ],
    });

    const transaction = new Transaction();
    transaction.add(passClockIx);

    const txHash = await connection.sendTransaction(transaction, [
    feePayer,
    helloAccount,
    ]);

    console.log(`Transaction succeeded. TxHash: ${txHash}`);
    })();

    在指令内部直接访问时钟

    让我们创建同样的指令,但这次我们不需要从客户端传递SYSVAR_CLOCK_PUBKEY

    let clock = Clock::get()?;
    let current_timestamp = clock.unix_timestamp;

    现在,客户端只需要传递状态和支付账户的指令:

    (async () => {
    const programId = new PublicKey(
    "4ZEdbCtb5UyCSiAMHV5eSHfyjq3QwbG3yXb6oHD7RYjk"
    );

    // No more requirement to pass clock sys var key
    const initAccountIx = new TransactionInstruction({
    programId: programId,
    keys: [
    {
    isSigner: false,
    isWritable: true,
    pubkey: helloAccount.publicKey,
    },
    ],
    });

    const transaction = new Transaction();
    transaction.add(initAccountIx);

    const txHash = await connection.sendTransaction(transaction, [
    feePayer,
    helloAccount,
    ]);

    console.log(`Transaction succeeded. TxHash: ${txHash}`);
    })();

    如何更改账户大小

    你可以使用realloc函数来更改程序拥有的账户的大小。realloc函数可以将账户的大小调整到最大10KB。当你使用realloc增加账户的大小时,你需要转移lamports以保持该账户的租金免除状态。

    // adding a publickey to the account
    let new_size = pda_account.data.borrow().len() + 32;

    let rent = Rent::get()?;
    let new_minimum_balance = rent.minimum_balance(new_size);

    let lamports_diff = new_minimum_balance.saturating_sub(pda_account.lamports());
    invoke(
    &system_instruction::transfer(funding_account.key, pda_account.key, lamports_diff),
    &[
    funding_account.clone(),
    pda_account.clone(),
    system_program.clone(),
    ],
    )?;

    pda_account.realloc(new_size, false)?;

    跨程序调用的方法

    跨程序调用,简单来说,就是在我们的程序中调用另一个程序的指令。一个很好的例子是Uniswapswap功能。UniswapV2Router合约调用必要的逻辑进行交换,并调用ERC20合约的transfer函数将代币从一个人转移到另一个人。同样的方式,我们可以调用程序的指令来实现多种目的。

    让我们来看看我们的第一个例子,即SPL Token Programtransfer指令。进行转账所需的账户包括:

    1. 源代币账户(我们持有代币的账户)
    2. 目标代币账户(我们要将代币转移至的账户)
    3. 源代币账户的持有者(我们将为其签名的钱包地址)
    let token_transfer_amount = instruction_data
    .get(..8)
    .and_then(|slice| slice.try_into().ok())
    .map(u64::from_le_bytes)
    .ok_or(ProgramError::InvalidAccountData)?;

    let transfer_tokens_instruction = transfer(
    &token_program.key,
    &source_token_account.key,
    &destination_token_account.key,
    &source_token_account_holder.key,
    &[&source_token_account_holder.key],
    token_transfer_amount,
    )?;

    let required_accounts_for_transfer = [
    source_token_account.clone(),
    destination_token_account.clone(),
    source_token_account_holder.clone(),
    ];

    invoke(
    &transfer_tokens_instruction,
    &required_accounts_for_transfer,
    )?;

    相应的客户端指令如下所示。有关了解铸币和代币创建指令,请参考附近的完整代码。

    (async () => {
    const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
    const programId = new PublicKey(
    "EfYK91eN3AqTwY1C34W6a33qGAtQ8HJYVhNv7cV4uMZj"
    );

    const transferTokensIx = new TransactionInstruction({
    programId: programId,
    data: TOKEN_TRANSFER_AMOUNT_BUFFER,
    keys: [
    {
    isSigner: false,
    isWritable: true,
    pubkey: SOURCE_TOKEN_ACCOUNT.publicKey,
    },
    {
    isSigner: false,
    isWritable: true,
    pubkey: DESTINATION_TOKEN_ACCOUNT.publicKey,
    },
    {
    isSigner: true,
    isWritable: true,
    pubkey: PAYER_KEYPAIR.publicKey,
    },
    {
    isSigner: false,
    isWritable: false,
    pubkey: TOKEN_PROGRAM_ID,
    },
    ],
    });

    const transaction = new Transaction();
    transaction.add(transferTokensIx);

    const txHash = await connection.sendTransaction(transaction, [
    PAYER_KEYPAIR,
    TOKEN_MINT_ACCOUNT,
    SOURCE_TOKEN_ACCOUNT,
    DESTINATION_TOKEN_ACCOUNT,
    ]);

    console.log(`Token transfer CPI success: ${txHash}`);
    })();

    现在让我们来看另一个例子,即System Programcreate_account指令。这里与上面提到的指令有一点不同。在上述例子中,我们不需要在invoke函数中将token_program作为账户之一传递。然而,在某些情况下,您需要传递调用指令的program_id。在我们的例子中,它将是System Programprogram_id("11111111111111111111111111111111")。所以现在所需的账户包括:

    let account_span = instruction_data
    .get(..8)
    .and_then(|slice| slice.try_into().ok())
    .map(u64::from_le_bytes)
    .ok_or(ProgramError::InvalidAccountData)?;

    let lamports_required = (Rent::get()?).minimum_balance(account_span as usize);

    let create_account_instruction = create_account(
    &payer_account.key,
    &general_state_account.key,
    lamports_required,
    account_span,
    program_id,
    );

    let required_accounts_for_create = [
    payer_account.clone(),
    general_state_account.clone(),
    system_program.clone(),
    ];

    invoke(&create_account_instruction, &required_accounts_for_create)?;

    对应的客户端代码如下所示:

    (async () => {
    const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
    const programId = new PublicKey(
    "DkuQ5wsndkzXfgqDB6Lgf4sDjBi4gkLSak1dM5Mn2RuQ"
    );

    // Airdropping some SOL
    await connection.confirmTransaction(
    await connection.requestAirdrop(PAYER_KEYPAIR.publicKey, LAMPORTS_PER_SOL)
    );

    // Our program's CPI instruction (create_account)
    const creataAccountIx = new TransactionInstruction({
    programId: programId,
    data: ACCOUNT_SPACE_BUFFER,
    keys: [
    {
    isSigner: true,
    isWritable: true,
    pubkey: PAYER_KEYPAIR.publicKey,
    },
    {
    isSigner: true,
    isWritable: true,
    pubkey: GENERAL_STATE_KEYPAIR.publicKey,
    },
    {
    isSigner: false,
    isWritable: false,
    pubkey: SystemProgram.programId,
    },
    ],
    });

    const transaction = new Transaction();
    // Adding up all the above instructions
    transaction.add(creataAccountIx);

    const txHash = await connection.sendTransaction(transaction, [
    PAYER_KEYPAIR,
    GENERAL_STATE_KEYPAIR,
    ]);

    console.log(`Create Account CPI Success: ${txHash}`);
    })();

    如何创建PDA

    程序派生地址(Program Derived Address,PDA)是程序拥有的账户,但没有私钥。相反,它的签名是通过一组种子和一个阻碍值(一个确保其不在曲线上的随机数)获取的。"生成"程序地址与"创建"它是不同的。可以使用Pubkey::find_program_address来生成PDA。创建PDA实质上意味着初始化该地址的空间并将其状态设置为初始状态。普通的密钥对账户可以在我们的程序之外创建,然后将其用于初始化PDA的状态。不幸的是,对于PDA来说,它必须在链上创建,因为它本身无法代表自己进行签名。因此,我们使用invoke_signed来传递PDA的种子,以及资金账户的签名,从而实现了PDA的账户创建。

    let create_pda_account_ix = system_instruction::create_account(
    &funding_account.key,
    &pda_account.key,
    lamports_required,
    ACCOUNT_DATA_LEN.try_into().unwrap(),
    &program_id,
    );

    invoke_signed(
    &create_pda_account_ix,
    &[funding_account.clone(), pda_account.clone()],
    &[signers_seeds],
    )?;

    可以通过客户端按如下方式发送所需的账户:

    const PAYER_KEYPAIR = Keypair.generate();

    (async () => {
    const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
    const programId = new PublicKey(
    "6eW5nnSosr2LpkUGCdznsjRGDhVb26tLmiM1P8RV1QQp"
    );

    const [pda, bump] = await PublicKey.findProgramAddress(
    [Buffer.from("customaddress"), PAYER_KEYPAIR.publicKey.toBuffer()],
    programId
    );

    const createPDAIx = new TransactionInstruction({
    programId: programId,
    data: Buffer.from(Uint8Array.of(bump)),
    keys: [
    {
    isSigner: true,
    isWritable: true,
    pubkey: PAYER_KEYPAIR.publicKey,
    },
    {
    isSigner: false,
    isWritable: true,
    pubkey: pda,
    },
    {
    isSigner: false,
    isWritable: false,
    pubkey: SystemProgram.programId,
    },
    ],
    });

    const transaction = new Transaction();
    transaction.add(createPDAIx);

    const txHash = await connection.sendTransaction(transaction, [PAYER_KEYPAIR]);
    })();

    如何读取账户

    在Solana中,几乎所有的指令都至少需要2-3个账户,并且在指令处理程序中会说明它期望的账户顺序。如果我们利用Rust中的iter()方法,而不是手动索引账户,那么这将非常简单。next_account_info方法基本上是对可迭代对象的第一个索引进行切片,并返回账户数组中存在的账户。让我们看一个简单的指令,它期望一堆账户并需要解析每个账户。

    pub fn process_instruction(
    _program_id: &Pubkey,
    accounts: &[AccountInfo],
    _instruction_data: &[u8],
    ) -> ProgramResult {
    // Fetching all the accounts as a iterator (facilitating for loops and iterations)
    let accounts_iter = &mut accounts.iter();
    // Payer account
    let payer_account = next_account_info(accounts_iter)?;
    // Hello state account
    let hello_state_account = next_account_info(accounts_iter)?;
    // Rent account
    let rent_account = next_account_info(accounts_iter)?;
    // System Program
    let system_program = next_account_info(accounts_iter)?;

    Ok(())
    }

    如何验证账户

    由于Solana中的程序是无状态的,作为程序创建者,我们必须尽可能验证传递的账户,以避免任何恶意账户的进入。可以进行的基本检查包括:

    1. 检查预期的签名账户是否已签名。
    2. 检查预期的状态账户是否已标记为可写。
    3. 检查预期的状态账户的所有者是否为调用程序的程序ID。
    4. 如果首次初始化状态,请检查账户是否已经初始化。
    5. 检查是否按预期传递了任何跨程序的ID(在需要时)。

    下面是一个基本的指令,它使用上述检查初始化英雄状态账户的示例:

    pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    _instruction_data: &[u8],
    ) -> ProgramResult {
    let accounts_iter = &mut accounts.iter();
    let payer_account = next_account_info(accounts_iter)?;
    let hello_state_account = next_account_info(accounts_iter)?;
    let system_program = next_account_info(accounts_iter)?;

    let rent = Rent::get()?;

    // Checking if payer account is the signer
    if !payer_account.is_signer {
    return Err(ProgramError::MissingRequiredSignature);
    }

    // Checking if hello state account is rent exempt
    if !rent.is_exempt(hello_state_account.lamports(), 1) {
    return Err(ProgramError::AccountNotRentExempt);
    }

    // Checking if hello state account is writable
    if !hello_state_account.is_writable {
    return Err(ProgramError::InvalidAccountData);
    }

    // Checking if hello state account's owner is the current program
    if hello_state_account.owner.ne(&program_id) {
    return Err(ProgramError::IllegalOwner);
    }

    // Checking if the system program is valid
    if system_program.key.ne(&SYSTEM_PROGRAM_ID) {
    return Err(ProgramError::IncorrectProgramId);
    }

    let mut hello_state = HelloState::try_from_slice(&hello_state_account.data.borrow())?;

    // Checking if the state has already been initialized
    if hello_state.is_initialized {
    return Err(ProgramError::AccountAlreadyInitialized);
    }

    hello_state.is_initialized = true;
    hello_state.serialize(&mut &mut hello_state_account.data.borrow_mut()[..])?;
    msg!("Account initialized :)");

    Ok(())
    }

    如何从一个交易中读取多个指令

    Solana允许我们查看当前交易中的所有指令。我们可以将它们存储在一个变量中,并对其进行迭代。我们可以利用这一点做许多事情,比如检查可疑的交易。

    let mut idx = 0;
    let num_instructions = read_u16(&mut idx, &instruction_sysvar)
    .map_err(|_| MyError::NoInstructionFound)?;


    for index in 0..num_instructions {

    let mut current = 2 + (index * 2) as usize;
    let start = read_u16(&mut current, &instruction_sysvar).unwrap();

    current = start as usize;
    let num_accounts = read_u16(&mut current, &instruction_sysvar).unwrap();
    current += (num_accounts as usize) * (1 + 32);

    }
    + \ No newline at end of file diff --git a/cookbook-zh/references/staking/index.html b/cookbook-zh/references/staking/index.html index c9efe9090..bb10b1b0f 100644 --- a/cookbook-zh/references/staking/index.html +++ b/cookbook-zh/references/staking/index.html @@ -5,13 +5,13 @@ 质押 | All in One Solana - +
    -

    质押

    获取当前验证器

    我们可以质押 SOL 并通过帮助保护网络来获得奖励。要进行质押,我们将 SOL 委托给验证器,而验证器则处理交易。

    import { clusterApiUrl, Connection } from "@solana/web3.js";

    (async () => {
    const connection = new Connection(clusterApiUrl("devnet"), "confirmed");

    // Get all validators, categorized by current (i.e. active) and deliquent (i.e. inactive)
    const { current, delinquent } = await connection.getVoteAccounts();
    console.log("current validators: ", current);
    console.log("all validators: ", current.concat(delinquent));
    })();

    创建质押账户

    所有的质押指令由质押程序 (Stake Program) 处理。首先,我们创建一个质押账户, 该账户与标准系统账户创建和管理方式不同。特别是,我们需要设置账户的Stake AuthorityWithdrawal Authority

    // Setup a transaction to create our stake account
    // Note: `StakeProgram.createAccount` returns a `Transaction` preconfigured with the necessary `TransactionInstruction`s
    const createStakeAccountTx = StakeProgram.createAccount({
    authorized: new Authorized(wallet.publicKey, wallet.publicKey), // Here we set two authorities: Stake Authority and Withdrawal Authority. Both are set to our wallet.
    fromPubkey: wallet.publicKey,
    lamports: amountToStake,
    lockup: new Lockup(0, 0, wallet.publicKey), // Optional. We'll set this to 0 for demonstration purposes.
    stakePubkey: stakeAccount.publicKey,
    });

    const createStakeAccountTxId = await sendAndConfirmTransaction(
    connection,
    createStakeAccountTx,
    [
    wallet,
    stakeAccount, // Since we're creating a new stake account, we have that account sign as well
    ]
    );
    console.log(`Stake account created. Tx Id: ${createStakeAccountTxId}`);

    // Check our newly created stake account balance. This should be 0.5 SOL.
    let stakeBalance = await connection.getBalance(stakeAccount.publicKey);
    console.log(`Stake account balance: ${stakeBalance / LAMPORTS_PER_SOL} SOL`);

    // Verify the status of our stake account. This will start as inactive and will take some time to activate.
    let stakeStatus = await connection.getStakeActivation(stakeAccount.publicKey);
    console.log(`Stake account status: ${stakeStatus.state}`);

    委托质押

    一旦质押账户得到资金支持,Stake Authority可以将其委托给一个验证者。每个质押账户一次只能委托给一个验证者。此外,账户中的所有代币必须要么被委托,要么取消委托。一旦委托成功,质押账户需要经过几个时期才能变为活跃状态。

    // With a validator selected, we can now setup a transaction that delegates our stake to their vote account.
    const delegateTx = StakeProgram.delegate({
    stakePubkey: stakeAccount.publicKey,
    authorizedPubkey: wallet.publicKey,
    votePubkey: selectedValidatorPubkey,
    });

    const delegateTxId = await sendAndConfirmTransaction(connection, delegateTx, [
    wallet,
    ]);
    console.log(
    `Stake account delegated to ${selectedValidatorPubkey}. Tx Id: ${delegateTxId}`
    );

    // Check in on our stake account. It should now be activating.
    stakeStatus = await connection.getStakeActivation(stakeAccount.publicKey);
    console.log(`Stake account status: ${stakeStatus.state}`);

    通过验证器获取委托人

    多个账户可能已经质押给了特定的验证账户。为了获取所有的质押人,我们可以使用 getProgramAccountsgetParsedProgramAccounts API。请参考指南部分 获取更多信息。质押账户长度为200字节,选民公钥从第124字节开始。参考资料

    const STAKE_PROGRAM_ID = new PublicKey(
    "Stake11111111111111111111111111111111111111"
    );
    const VOTE_PUB_KEY = "27MtjMSAQ2BGkXNuJEJkxFyCJT8dugGAaHJ9T7Gc6x4x";

    const connection = new Connection(clusterApiUrl("mainnet-beta"), "confirmed");
    const accounts = await connection.getParsedProgramAccounts(STAKE_PROGRAM_ID, {
    filters: [
    {
    dataSize: 200, // number of bytes
    },
    {
    memcmp: {
    offset: 124, // number of bytes
    bytes: VOTE_PUB_KEY, // base58 encoded string
    },
    },
    ],
    });

    console.log(`Accounts for program ${STAKE_PROGRAM_ID}: `);
    console.log(
    `Total number of delegators found for ${VOTE_PUB_KEY} is: ${accounts.length}`
    );
    if (accounts.length)
    console.log(`Sample delegator:`, JSON.stringify(accounts[0]));

    /*
    // Output

    Accounts for program Stake11111111111111111111111111111111111111:
    Total number of delegators found for 27MtjMSAQ2BGkXNuJEJkxFyCJT8dugGAaHJ9T7Gc6x4x is: 184
    Sample delegator:
    {
    "account": {
    "data": {
    "parsed": {
    "info": {
    "meta": {
    "authorized": {
    "staker": "3VDVh3rHTLkNJp6FVYbuFcaihYBFCQX5VSBZk23ckDGV",
    "withdrawer": "EhYXq3ANp5nAerUpbSgd7VK2RRcxK1zNuSQ755G5Mtxx"
    },
    "lockup": {
    "custodian": "3XdBZcURF5nKg3oTZAcfQZg8XEc5eKsx6vK8r3BdGGxg",
    "epoch": 0,
    "unixTimestamp": 1822867200
    },
    "rentExemptReserve": "2282880"
    },
    "stake": {
    "creditsObserved": 58685367,
    "delegation": {
    "activationEpoch": "208",
    "deactivationEpoch": "18446744073709551615",
    "stake": "433005300621",
    "voter": "27MtjMSAQ2BGkXNuJEJkxFyCJT8dugGAaHJ9T7Gc6x4x",
    "warmupCooldownRate": 0.25
    }
    }
    },
    "type": "delegated"
    },
    "program": "stake",
    "space": 200
    },
    "executable": false,
    "lamports": 433012149261,
    "owner": {
    "_bn": "06a1d8179137542a983437bdfe2a7ab2557f535c8a78722b68a49dc000000000"
    },
    "rentEpoch": 264
    },
    "pubkey": {
    "_bn": "0dc8b506f95e52c9ac725e714c7078799dd3268df562161411fe0916a4dc0a43"
    }
    }

    */

    停用质押

    在质押账户委托后的任何时候,Stake Authority可以选择停用该账户。停用过程可能需要多个时期才能完成,并且在提取任何 SOL 之前必须完成停用操作。

    // At anytime we can choose to deactivate our stake. Our stake account must be inactive before we can withdraw funds.
    const deactivateTx = StakeProgram.deactivate({
    stakePubkey: stakeAccount.publicKey,
    authorizedPubkey: wallet.publicKey,
    });
    const deactivateTxId = await sendAndConfirmTransaction(
    connection,
    deactivateTx,
    [wallet]
    );
    console.log(`Stake account deactivated. Tx Id: ${deactivateTxId}`);

    // Check in on our stake account. It should now be inactive.
    stakeStatus = await connection.getStakeActivation(stakeAccount.publicKey);
    console.log(`Stake account status: ${stakeStatus.state}`);

    提取质押

    一旦停用了,Withdrawal Authority可以将 SOL 提取回系统账户。一旦质押账户不再委托并且余额为 0 SOL,它将被销毁了。

    // Once deactivated, we can withdraw our SOL back to our main wallet
    const withdrawTx = StakeProgram.withdraw({
    stakePubkey: stakeAccount.publicKey,
    authorizedPubkey: wallet.publicKey,
    toPubkey: wallet.publicKey,
    lamports: stakeBalance, // Withdraw the full balance at the time of the transaction
    });

    const withdrawTxId = await sendAndConfirmTransaction(connection, withdrawTx, [
    wallet,
    ]);
    console.log(`Stake account withdrawn. Tx Id: ${withdrawTxId}`);

    // Confirm that our stake account balance is now 0
    stakeBalance = await connection.getBalance(stakeAccount.publicKey);
    console.log(`Stake account balance: ${stakeBalance / LAMPORTS_PER_SOL} SOL`);
    - +

    质押

    获取当前验证器

    我们可以质押 SOL 并通过帮助保护网络来获得奖励。要进行质押,我们将 SOL 委托给验证器,而验证器则处理交易。

    import { clusterApiUrl, Connection } from "@solana/web3.js";

    (async () => {
    const connection = new Connection(clusterApiUrl("devnet"), "confirmed");

    // Get all validators, categorized by current (i.e. active) and deliquent (i.e. inactive)
    const { current, delinquent } = await connection.getVoteAccounts();
    console.log("current validators: ", current);
    console.log("all validators: ", current.concat(delinquent));
    })();

    创建质押账户

    所有的质押指令由质押程序 (Stake Program) 处理。首先,我们创建一个质押账户, 该账户与标准系统账户创建和管理方式不同。特别是,我们需要设置账户的Stake AuthorityWithdrawal Authority

    // Setup a transaction to create our stake account
    // Note: `StakeProgram.createAccount` returns a `Transaction` preconfigured with the necessary `TransactionInstruction`s
    const createStakeAccountTx = StakeProgram.createAccount({
    authorized: new Authorized(wallet.publicKey, wallet.publicKey), // Here we set two authorities: Stake Authority and Withdrawal Authority. Both are set to our wallet.
    fromPubkey: wallet.publicKey,
    lamports: amountToStake,
    lockup: new Lockup(0, 0, wallet.publicKey), // Optional. We'll set this to 0 for demonstration purposes.
    stakePubkey: stakeAccount.publicKey,
    });

    const createStakeAccountTxId = await sendAndConfirmTransaction(
    connection,
    createStakeAccountTx,
    [
    wallet,
    stakeAccount, // Since we're creating a new stake account, we have that account sign as well
    ]
    );
    console.log(`Stake account created. Tx Id: ${createStakeAccountTxId}`);

    // Check our newly created stake account balance. This should be 0.5 SOL.
    let stakeBalance = await connection.getBalance(stakeAccount.publicKey);
    console.log(`Stake account balance: ${stakeBalance / LAMPORTS_PER_SOL} SOL`);

    // Verify the status of our stake account. This will start as inactive and will take some time to activate.
    let stakeStatus = await connection.getStakeActivation(stakeAccount.publicKey);
    console.log(`Stake account status: ${stakeStatus.state}`);

    委托质押

    一旦质押账户得到资金支持,Stake Authority可以将其委托给一个验证者。每个质押账户一次只能委托给一个验证者。此外,账户中的所有代币必须要么被委托,要么取消委托。一旦委托成功,质押账户需要经过几个时期才能变为活跃状态。

    // With a validator selected, we can now setup a transaction that delegates our stake to their vote account.
    const delegateTx = StakeProgram.delegate({
    stakePubkey: stakeAccount.publicKey,
    authorizedPubkey: wallet.publicKey,
    votePubkey: selectedValidatorPubkey,
    });

    const delegateTxId = await sendAndConfirmTransaction(connection, delegateTx, [
    wallet,
    ]);
    console.log(
    `Stake account delegated to ${selectedValidatorPubkey}. Tx Id: ${delegateTxId}`
    );

    // Check in on our stake account. It should now be activating.
    stakeStatus = await connection.getStakeActivation(stakeAccount.publicKey);
    console.log(`Stake account status: ${stakeStatus.state}`);

    通过验证器获取委托人

    多个账户可能已经质押给了特定的验证账户。为了获取所有的质押人,我们可以使用 getProgramAccountsgetParsedProgramAccounts API。请参考指南部分 获取更多信息。质押账户长度为200字节,选民公钥从第124字节开始。参考资料

    const STAKE_PROGRAM_ID = new PublicKey(
    "Stake11111111111111111111111111111111111111"
    );
    const VOTE_PUB_KEY = "27MtjMSAQ2BGkXNuJEJkxFyCJT8dugGAaHJ9T7Gc6x4x";

    const connection = new Connection(clusterApiUrl("mainnet-beta"), "confirmed");
    const accounts = await connection.getParsedProgramAccounts(STAKE_PROGRAM_ID, {
    filters: [
    {
    dataSize: 200, // number of bytes
    },
    {
    memcmp: {
    offset: 124, // number of bytes
    bytes: VOTE_PUB_KEY, // base58 encoded string
    },
    },
    ],
    });

    console.log(`Accounts for program ${STAKE_PROGRAM_ID}: `);
    console.log(
    `Total number of delegators found for ${VOTE_PUB_KEY} is: ${accounts.length}`
    );
    if (accounts.length)
    console.log(`Sample delegator:`, JSON.stringify(accounts[0]));

    /*
    // Output

    Accounts for program Stake11111111111111111111111111111111111111:
    Total number of delegators found for 27MtjMSAQ2BGkXNuJEJkxFyCJT8dugGAaHJ9T7Gc6x4x is: 184
    Sample delegator:
    {
    "account": {
    "data": {
    "parsed": {
    "info": {
    "meta": {
    "authorized": {
    "staker": "3VDVh3rHTLkNJp6FVYbuFcaihYBFCQX5VSBZk23ckDGV",
    "withdrawer": "EhYXq3ANp5nAerUpbSgd7VK2RRcxK1zNuSQ755G5Mtxx"
    },
    "lockup": {
    "custodian": "3XdBZcURF5nKg3oTZAcfQZg8XEc5eKsx6vK8r3BdGGxg",
    "epoch": 0,
    "unixTimestamp": 1822867200
    },
    "rentExemptReserve": "2282880"
    },
    "stake": {
    "creditsObserved": 58685367,
    "delegation": {
    "activationEpoch": "208",
    "deactivationEpoch": "18446744073709551615",
    "stake": "433005300621",
    "voter": "27MtjMSAQ2BGkXNuJEJkxFyCJT8dugGAaHJ9T7Gc6x4x",
    "warmupCooldownRate": 0.25
    }
    }
    },
    "type": "delegated"
    },
    "program": "stake",
    "space": 200
    },
    "executable": false,
    "lamports": 433012149261,
    "owner": {
    "_bn": "06a1d8179137542a983437bdfe2a7ab2557f535c8a78722b68a49dc000000000"
    },
    "rentEpoch": 264
    },
    "pubkey": {
    "_bn": "0dc8b506f95e52c9ac725e714c7078799dd3268df562161411fe0916a4dc0a43"
    }
    }

    */

    停用质押

    在质押账户委托后的任何时候,Stake Authority可以选择停用该账户。停用过程可能需要多个时期才能完成,并且在提取任何 SOL 之前必须完成停用操作。

    // At anytime we can choose to deactivate our stake. Our stake account must be inactive before we can withdraw funds.
    const deactivateTx = StakeProgram.deactivate({
    stakePubkey: stakeAccount.publicKey,
    authorizedPubkey: wallet.publicKey,
    });
    const deactivateTxId = await sendAndConfirmTransaction(
    connection,
    deactivateTx,
    [wallet]
    );
    console.log(`Stake account deactivated. Tx Id: ${deactivateTxId}`);

    // Check in on our stake account. It should now be inactive.
    stakeStatus = await connection.getStakeActivation(stakeAccount.publicKey);
    console.log(`Stake account status: ${stakeStatus.state}`);

    提取质押

    一旦停用了,Withdrawal Authority可以将 SOL 提取回系统账户。一旦质押账户不再委托并且余额为 0 SOL,它将被销毁了。

    // Once deactivated, we can withdraw our SOL back to our main wallet
    const withdrawTx = StakeProgram.withdraw({
    stakePubkey: stakeAccount.publicKey,
    authorizedPubkey: wallet.publicKey,
    toPubkey: wallet.publicKey,
    lamports: stakeBalance, // Withdraw the full balance at the time of the transaction
    });

    const withdrawTxId = await sendAndConfirmTransaction(connection, withdrawTx, [
    wallet,
    ]);
    console.log(`Stake account withdrawn. Tx Id: ${withdrawTxId}`);

    // Confirm that our stake account balance is now 0
    stakeBalance = await connection.getBalance(stakeAccount.publicKey);
    console.log(`Stake account balance: ${stakeBalance / LAMPORTS_PER_SOL} SOL`);
    + \ No newline at end of file diff --git a/cookbook-zh/references/token/index.html b/cookbook-zh/references/token/index.html index 31d8b49ab..fa3b15534 100644 --- a/cookbook-zh/references/token/index.html +++ b/cookbook-zh/references/token/index.html @@ -5,14 +5,14 @@ 代币 | All in One Solana - +

    代币

    我需要什么才能开始使用SPL代币?

    每当你在Solana上与代币进行交互时,实际上你正在与Solana程序库代币(SPL-Token)或SPL代币标准交互。SPL代币标准需要使用特定的库,你可以根据你使用的编程语言在下面找到相应的库。

    "@solana/spl-token": "^0.2.0"

    如何创建一个新的代币

    创建代币是通过创建所谓的“铸币账户”来完成的。这个铸币账户随后用于向用户的代币账户铸造代币。

    // 1) use build-in function
    let mintPubkey = await createMint(
    connection, // conneciton
    feePayer, // fee payer
    alice.publicKey, // mint authority
    alice.publicKey, // freeze authority (you can use `null` to disable it. when you disable it, you can't turn it on again)
    8 // decimals
    );

    // or

    // 2) compose by yourself
    let tx = new Transaction().add(
    // create mint account
    SystemProgram.createAccount({
    fromPubkey: feePayer.publicKey,
    newAccountPubkey: mint.publicKey,
    space: MINT_SIZE,
    lamports: await getMinimumBalanceForRentExemptMint(connection),
    programId: TOKEN_PROGRAM_ID,
    }),
    // init mint account
    createInitializeMintInstruction(
    mint.publicKey, // mint pubkey
    8, // decimals
    alice.publicKey, // mint authority
    alice.publicKey // freeze authority (you can use `null` to disable it. when you disable it, you can't turn it on again)
    )
    );

    如何获得一个代币铸币账户

    为了获得代币的当前供应量、授权信息或小数位数,你需要获取代币铸币账户的账户信息。

    let mintAccount = await getMint(connection, mintAccountPublicKey);

    如何创建一个代币账户

    用户需要一个代币账户来持有代币。

    对于用户所拥有的每种类型的代币,他们将至少拥有一个代币账户。

    关联代币账户(Associated Token Accounts, ATA) 是根据每个密钥对确定性地创建的账户。关联代币账户是管理代币账户的推荐方法。

    // 1) use build-in function
    {
    let ata = await createAssociatedTokenAccount(
    connection, // connection
    feePayer, // fee payer
    mintPubkey, // mint
    alice.publicKey // owner,
    );
    }

    // or

    // 2) composed by yourself
    {
    let tx = new Transaction().add(
    createAssociatedTokenAccountInstruction(
    feePayer.publicKey, // payer
    ata, // ata
    alice.publicKey, // owner
    mintPubkey // mint
    )
    );
    }

    如何获得一个代币账户

    每个代币账户都包含有关代币的信息,例如所有者、铸币账户、数量(余额)和小数位数。

    let tokenAccount = await getAccount(connection, tokenAccountPubkey);

    如何获得一个代币账户的余额

    每个代币账户都包含有关代币的信息,例如所有者、铸币账户、数量(余额)和小数位数。

    let tokenAmount = await connection.getTokenAccountBalance(tokenAccount);
    info

    贴士 -一个代币账户只能持有一种铸币。当您指定一个代币账户时,您也需要指定一个铸币。

    如何铸造(mint)代币

    当你铸造代币时,你会增加供应量并将新代币转移到特定的代币账户。

    // 1) use build-in function
    {
    let txhash = await mintToChecked(
    connection, // connection
    feePayer, // fee payer
    mintPubkey, // mint
    tokenAccountPubkey, // receiver (sholud be a token account)
    alice, // mint authority
    1e8, // amount. if your decimals is 8, you mint 10^8 for 1 token.
    8 // decimals
    );
    }

    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createMintToCheckedInstruction(
    mintPubkey, // mint
    tokenAccountPubkey, // receiver (sholud be a token account)
    alice.publicKey, // mint authority
    1e8, // amount. if your decimals is 8, you mint 10^8 for 1 token.
    8 // decimals
    // [signer1, signer2 ...], // only multisig account will use
    )
    );
    }

    如何转移代币

    你可以将代币从一个代币账户转移到另一个代币账户。

    // 1) use build-in function
    {
    let txhash = await transferChecked(
    connection, // connection
    feePayer, // payer
    tokenAccountXPubkey, // from (should be a token account)
    mintPubkey, // mint
    tokenAccountYPubkey, // to (should be a token account)
    alice, // from's owner
    1e8, // amount, if your deciamls is 8, send 10^8 for 1 token
    8 // decimals
    );
    }

    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createTransferCheckedInstruction(
    tokenAccountXPubkey, // from (should be a token account)
    mintPubkey, // mint
    tokenAccountYPubkey, // to (should be a token account)
    alice.publicKey, // from's owner
    1e8, // amount, if your deciamls is 8, send 10^8 for 1 token
    8 // decimals
    )
    );
    }

    如何销代币

    如果你是代币的所有者,你可以销毁代币。

    // 1) use build-in function
    {
    let txhash = await burnChecked(
    connection, // connection
    feePayer, // payer
    tokenAccountPubkey, // token account
    mintPubkey, // mint
    alice, // owner
    1e8, // amount, if your deciamls is 8, 10^8 for 1 token
    8
    );
    }

    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createBurnCheckedInstruction(
    tokenAccountPubkey, // token account
    mintPubkey, // mint
    alice.publicKey, // owner of token account
    1e8, // amount, if your deciamls is 8, 10^8 for 1 token
    8 // decimals
    )
    );
    }

    如何关闭代币账户

    如果你不再需要使用某个代币账户,你可以关闭它。有两种情况:

    1. 包装的 SOL(Wrapped SOL)- 关闭操作会将包装的 SOL 转换为 SOL。
    2. 其他代币(Other Tokens)- 只有当代币账户的余额为0时,你才能关闭它。
    // 1) use build-in function
    {
    let txhash = await closeAccount(
    connection, // connection
    feePayer, // payer
    tokenAccountPubkey, // token account which you want to close
    alice.publicKey, // destination
    alice // owner of token account
    );
    }

    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createCloseAccountInstruction(
    tokenAccountPubkey, // token account which you want to close
    alice.publicKey, // destination
    alice.publicKey // owner of token account
    )
    );
    }

    如何在代币账户或铸币账户上设置权限

    你可以设置/更新权限。有四种类型:

    1. MintTokens(铸币账户):用于控制在铸币账户上铸造代币的权限。
    2. FreezeAccount(铸币账户):用于冻结或解冻铸币账户的权限。
    3. AccountOwner(代币账户):用于控制代币账户所有权的权限。
    4. CloseAccount(代币账户):用于关闭代币账户的权限。
    // 1) use build-in function
    {
    let txhash = await setAuthority(
    connection, // connection
    feePayer, // payer
    mintPubkey, // mint account || token account
    alice, // current authority
    AuthorityType.MintTokens, // authority type
    randomGuy.publicKey // new authority (you can pass `null` to close it)
    );
    }

    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createSetAuthorityInstruction(
    mintPubkey, // mint acocunt || token account
    alice.publicKey, // current auth
    AuthorityType.MintTokens, // authority type
    randomGuy.publicKey // new auth (you can pass `null` to close it)
    )
    );
    }

    如何批准代币委托

    你可以设置一个委托代理,并指定一个允许的代币数量。设置后,委托代理就像代币账户的另一个所有者。一个代币账户在同一时间只能委托给一个账户。

    // 1) use build-in function
    {
    let txhash = await approveChecked(
    connection, // connection
    feePayer, // fee payer
    mintPubkey, // mint
    tokenAccountPubkey, // token account
    randomGuy.publicKey, // delegate
    alice, // owner of token account
    1e8, // amount, if your deciamls is 8, 10^8 for 1 token
    8 // decimals
    );
    }
    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createApproveCheckedInstruction(
    tokenAccountPubkey, // token account
    mintPubkey, // mint
    randomGuy.publicKey, // delegate
    alice.publicKey, // owner of token account
    1e8, // amount, if your deciamls is 8, 10^8 for 1 token
    8 // decimals
    )
    );
    }

    如何撤销代币委托

    撤销操作将把代币委托设置为空,并将委托的代币数量设置为0。

    // 1) use build-in function
    {
    let txhash = await revoke(
    connection, // connection
    feePayer, // payer
    tokenAccountPubkey, // token account
    alice // owner of token account
    );
    }

    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createRevokeInstruction(
    tokenAccountPubkey, // token account
    alice.publicKey // owner of token account
    )
    );
    }

    如何管理包装的SOL

    包装的 SOL与其他代币铸币类似,区别在于使用 syncNative 并在 NATIVE_MINT 地址上专门创建代币账户。

    创建代币账户

    创建代币账户 但将mint替换为NATIVE_MINT

    import { NATIVE_MINT } from "@solana/spl-token";

    增加余额

    有两种方法可以增加包装的 SOL 的余额:

    1. 通过 SOL 转账方式

    let tx = new Transaction().add(
    // trasnfer SOL
    SystemProgram.transfer({
    fromPubkey: alice.publicKey,
    toPubkey: ata,
    lamports: amount,
    }),
    // sync wrapped SOL balance
    createSyncNativeInstruction(ata)
    );

    2. 通过代币转账方式

    let tx = new Transaction().add(
    // create token account
    SystemProgram.createAccount({
    fromPubkey: alice.publicKey,
    newAccountPubkey: auxAccount.publicKey,
    space: ACCOUNT_SIZE,
    lamports:
    (await getMinimumBalanceForRentExemptAccount(connection)) + amount, // rent + amount
    programId: TOKEN_PROGRAM_ID,
    }),
    // init token account
    createInitializeAccountInstruction(
    auxAccount.publicKey,
    NATIVE_MINT,
    alice.publicKey
    ),
    // transfer WSOL
    createTransferInstruction(auxAccount.publicKey, ata, alice.publicKey, amount),
    // close aux account
    createCloseAccountInstruction(
    auxAccount.publicKey,
    alice.publicKey,
    alice.publicKey
    )
    );

    如何通过所有者获取所有代币账户

    你可以通过所有者获取代币账户。有两种方法可以实现。

    1. 获取所有代币账户
    let response = await connection.getParsedTokenAccountsByOwner(owner, {
    programId: TOKEN_PROGRAM_ID,
    });
    1. 按照铸币进行过滤
    let response = await connection.getParsedTokenAccountsByOwner(owner, {
    mint: mint,
    });
    - +一个代币账户只能持有一种铸币。当您指定一个代币账户时,您也需要指定一个铸币。

    如何铸造(mint)代币

    当你铸造代币时,你会增加供应量并将新代币转移到特定的代币账户。

    // 1) use build-in function
    {
    let txhash = await mintToChecked(
    connection, // connection
    feePayer, // fee payer
    mintPubkey, // mint
    tokenAccountPubkey, // receiver (sholud be a token account)
    alice, // mint authority
    1e8, // amount. if your decimals is 8, you mint 10^8 for 1 token.
    8 // decimals
    );
    }

    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createMintToCheckedInstruction(
    mintPubkey, // mint
    tokenAccountPubkey, // receiver (sholud be a token account)
    alice.publicKey, // mint authority
    1e8, // amount. if your decimals is 8, you mint 10^8 for 1 token.
    8 // decimals
    // [signer1, signer2 ...], // only multisig account will use
    )
    );
    }

    如何转移代币

    你可以将代币从一个代币账户转移到另一个代币账户。

    // 1) use build-in function
    {
    let txhash = await transferChecked(
    connection, // connection
    feePayer, // payer
    tokenAccountXPubkey, // from (should be a token account)
    mintPubkey, // mint
    tokenAccountYPubkey, // to (should be a token account)
    alice, // from's owner
    1e8, // amount, if your deciamls is 8, send 10^8 for 1 token
    8 // decimals
    );
    }

    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createTransferCheckedInstruction(
    tokenAccountXPubkey, // from (should be a token account)
    mintPubkey, // mint
    tokenAccountYPubkey, // to (should be a token account)
    alice.publicKey, // from's owner
    1e8, // amount, if your deciamls is 8, send 10^8 for 1 token
    8 // decimals
    )
    );
    }

    如何销代币

    如果你是代币的所有者,你可以销毁代币。

    // 1) use build-in function
    {
    let txhash = await burnChecked(
    connection, // connection
    feePayer, // payer
    tokenAccountPubkey, // token account
    mintPubkey, // mint
    alice, // owner
    1e8, // amount, if your deciamls is 8, 10^8 for 1 token
    8
    );
    }

    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createBurnCheckedInstruction(
    tokenAccountPubkey, // token account
    mintPubkey, // mint
    alice.publicKey, // owner of token account
    1e8, // amount, if your deciamls is 8, 10^8 for 1 token
    8 // decimals
    )
    );
    }

    如何关闭代币账户

    如果你不再需要使用某个代币账户,你可以关闭它。有两种情况:

    1. 包装的 SOL(Wrapped SOL)- 关闭操作会将包装的 SOL 转换为 SOL。
    2. 其他代币(Other Tokens)- 只有当代币账户的余额为0时,你才能关闭它。
    // 1) use build-in function
    {
    let txhash = await closeAccount(
    connection, // connection
    feePayer, // payer
    tokenAccountPubkey, // token account which you want to close
    alice.publicKey, // destination
    alice // owner of token account
    );
    }

    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createCloseAccountInstruction(
    tokenAccountPubkey, // token account which you want to close
    alice.publicKey, // destination
    alice.publicKey // owner of token account
    )
    );
    }

    如何在代币账户或铸币账户上设置权限

    你可以设置/更新权限。有四种类型:

    1. MintTokens(铸币账户):用于控制在铸币账户上铸造代币的权限。
    2. FreezeAccount(铸币账户):用于冻结或解冻铸币账户的权限。
    3. AccountOwner(代币账户):用于控制代币账户所有权的权限。
    4. CloseAccount(代币账户):用于关闭代币账户的权限。
    // 1) use build-in function
    {
    let txhash = await setAuthority(
    connection, // connection
    feePayer, // payer
    mintPubkey, // mint account || token account
    alice, // current authority
    AuthorityType.MintTokens, // authority type
    randomGuy.publicKey // new authority (you can pass `null` to close it)
    );
    }

    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createSetAuthorityInstruction(
    mintPubkey, // mint acocunt || token account
    alice.publicKey, // current auth
    AuthorityType.MintTokens, // authority type
    randomGuy.publicKey // new auth (you can pass `null` to close it)
    )
    );
    }

    如何批准代币委托

    你可以设置一个委托代理,并指定一个允许的代币数量。设置后,委托代理就像代币账户的另一个所有者。一个代币账户在同一时间只能委托给一个账户。

    // 1) use build-in function
    {
    let txhash = await approveChecked(
    connection, // connection
    feePayer, // fee payer
    mintPubkey, // mint
    tokenAccountPubkey, // token account
    randomGuy.publicKey, // delegate
    alice, // owner of token account
    1e8, // amount, if your deciamls is 8, 10^8 for 1 token
    8 // decimals
    );
    }
    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createApproveCheckedInstruction(
    tokenAccountPubkey, // token account
    mintPubkey, // mint
    randomGuy.publicKey, // delegate
    alice.publicKey, // owner of token account
    1e8, // amount, if your deciamls is 8, 10^8 for 1 token
    8 // decimals
    )
    );
    }

    如何撤销代币委托

    撤销操作将把代币委托设置为空,并将委托的代币数量设置为0。

    // 1) use build-in function
    {
    let txhash = await revoke(
    connection, // connection
    feePayer, // payer
    tokenAccountPubkey, // token account
    alice // owner of token account
    );
    }

    // or

    // 2) compose by yourself
    {
    let tx = new Transaction().add(
    createRevokeInstruction(
    tokenAccountPubkey, // token account
    alice.publicKey // owner of token account
    )
    );
    }

    如何管理包装的SOL

    包装的 SOL与其他代币铸币类似,区别在于使用 syncNative 并在 NATIVE_MINT 地址上专门创建代币账户。

    创建代币账户

    创建代币账户 但将mint替换为NATIVE_MINT

    import { NATIVE_MINT } from "@solana/spl-token";

    增加余额

    有两种方法可以增加包装的 SOL 的余额:

    1. 通过 SOL 转账方式

    let tx = new Transaction().add(
    // trasnfer SOL
    SystemProgram.transfer({
    fromPubkey: alice.publicKey,
    toPubkey: ata,
    lamports: amount,
    }),
    // sync wrapped SOL balance
    createSyncNativeInstruction(ata)
    );

    2. 通过代币转账方式

    let tx = new Transaction().add(
    // create token account
    SystemProgram.createAccount({
    fromPubkey: alice.publicKey,
    newAccountPubkey: auxAccount.publicKey,
    space: ACCOUNT_SIZE,
    lamports:
    (await getMinimumBalanceForRentExemptAccount(connection)) + amount, // rent + amount
    programId: TOKEN_PROGRAM_ID,
    }),
    // init token account
    createInitializeAccountInstruction(
    auxAccount.publicKey,
    NATIVE_MINT,
    alice.publicKey
    ),
    // transfer WSOL
    createTransferInstruction(auxAccount.publicKey, ata, alice.publicKey, amount),
    // close aux account
    createCloseAccountInstruction(
    auxAccount.publicKey,
    alice.publicKey,
    alice.publicKey
    )
    );

    如何通过所有者获取所有代币账户

    你可以通过所有者获取代币账户。有两种方法可以实现。

    1. 获取所有代币账户
    let response = await connection.getParsedTokenAccountsByOwner(owner, {
    programId: TOKEN_PROGRAM_ID,
    });
    1. 按照铸币进行过滤
    let response = await connection.getParsedTokenAccountsByOwner(owner, {
    mint: mint,
    });
    + \ No newline at end of file diff --git a/cookbook-zh/tags/account-map/index.html b/cookbook-zh/tags/account-map/index.html index 0c571f1b8..ad6692668 100644 --- a/cookbook-zh/tags/account-map/index.html +++ b/cookbook-zh/tags/account-map/index.html @@ -5,13 +5,13 @@ One doc tagged with "account-map" | All in One Solana - +

    One doc tagged with "account-map"

    View All Tags

    账户映射

    在编程中,我们经常使用映射(Map)这种数据结构,将一个键与某种值关联起来。键和值可以是任意类型的数据,键用作标识要保存的特定值的标识符。通过键,我们可以高效地插入、检索和更新这些值。

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/account/index.html b/cookbook-zh/tags/account/index.html index b8cf81185..acca07814 100644 --- a/cookbook-zh/tags/account/index.html +++ b/cookbook-zh/tags/account/index.html @@ -5,13 +5,13 @@ One doc tagged with "account" | All in One Solana - +

    One doc tagged with "account"

    View All Tags

    获取程序帐户

    一个返回程序所拥有的账户的RPC方法。目前不支持分页。请求getProgramAccounts应该包括dataSlice和/或filters参数,以提高响应时间并返回只有预期结果的内容。

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/accounts/index.html b/cookbook-zh/tags/accounts/index.html index 196c88820..d75bd349e 100644 --- a/cookbook-zh/tags/accounts/index.html +++ b/cookbook-zh/tags/accounts/index.html @@ -5,13 +5,13 @@ One doc tagged with "accounts" | All in One Solana - +

    One doc tagged with "accounts"

    View All Tags

    账户

    在Solana中,账户是用来存储状态的。账户是Solana开发中非常重要的构成要素。

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/contribute/index.html b/cookbook-zh/tags/contribute/index.html index bf5b45ff7..edf006e1d 100644 --- a/cookbook-zh/tags/contribute/index.html +++ b/cookbook-zh/tags/contribute/index.html @@ -5,13 +5,13 @@ One doc tagged with "contribute" | All in One Solana - +

    One doc tagged with "contribute"

    View All Tags

    贡献

    欢迎任何人对这本食谱进行贡献。在贡献新的代码片段时,请参考项目的风格。

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/cpi/index.html b/cookbook-zh/tags/cpi/index.html index e48ef9816..b3fd9cac9 100644 --- a/cookbook-zh/tags/cpi/index.html +++ b/cookbook-zh/tags/cpi/index.html @@ -5,13 +5,13 @@ One doc tagged with "cpi" | All in One Solana - +

    One doc tagged with "cpi"

    View All Tags

    Cross Program Invocations (CPIs)

    A Cross-Program Invocation (CPI) is a direct call from one program into another, allowing for the composability of Solana programs. Just as any client can call any program using the JSON RPC, any program can call any other program via a CPI. CPIs essentially turn the entire Solana ecosystem into one giant API that is at your disposal as a developer.

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/data-migration/index.html b/cookbook-zh/tags/data-migration/index.html index 9962aface..4b6145ab2 100644 --- a/cookbook-zh/tags/data-migration/index.html +++ b/cookbook-zh/tags/data-migration/index.html @@ -5,13 +5,13 @@ One doc tagged with "data-migration" | All in One Solana - +

    One doc tagged with "data-migration"

    View All Tags
    - + \ No newline at end of file diff --git a/cookbook-zh/tags/debug/index.html b/cookbook-zh/tags/debug/index.html index 24fcac68f..7bfbc6dcf 100644 --- a/cookbook-zh/tags/debug/index.html +++ b/cookbook-zh/tags/debug/index.html @@ -5,13 +5,13 @@ One doc tagged with "debug" | All in One Solana - +

    One doc tagged with "debug"

    View All Tags
    - + \ No newline at end of file diff --git a/cookbook-zh/tags/distrbution/index.html b/cookbook-zh/tags/distrbution/index.html index 498575d03..7289f1073 100644 --- a/cookbook-zh/tags/distrbution/index.html +++ b/cookbook-zh/tags/distrbution/index.html @@ -5,13 +5,13 @@ One doc tagged with "distrbution" | All in One Solana - +

    One doc tagged with "distrbution"

    View All Tags

    Distribution

    Distribution of your game depends highly on the platform you are using. With Solana, there are game SDKs you can build for IOS, Android, Web and Native Windows or Mac. Using the Unity SDK you could even connect Nintendo Switch or XBox to Solana theoretically. Many game companies are pivoting to a mobile first approach because there are so many people with mobile phones in the world. Mobile comes with its own complications though, so you should pick what fits best to your game.

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/energy-system/index.html b/cookbook-zh/tags/energy-system/index.html index 3dadb4687..641c936e4 100644 --- a/cookbook-zh/tags/energy-system/index.html +++ b/cookbook-zh/tags/energy-system/index.html @@ -5,13 +5,13 @@ One doc tagged with "energy-system" | All in One Solana - +

    One doc tagged with "energy-system"

    View All Tags

    Energy System

    Casual games commonly use energy systems, meaning that actions in the game cost energy which refills over time. In this guide we will walk through how to build one on Solana.

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/example/index.html b/cookbook-zh/tags/example/index.html index 7aca83f34..8069d430a 100644 --- a/cookbook-zh/tags/example/index.html +++ b/cookbook-zh/tags/example/index.html @@ -5,13 +5,13 @@ 2 docs tagged with "example" | All in One Solana - +

    2 docs tagged with "example"

    View All Tags
    - + \ No newline at end of file diff --git a/cookbook-zh/tags/game/index.html b/cookbook-zh/tags/game/index.html index f539153a9..2a1bfa5fb 100644 --- a/cookbook-zh/tags/game/index.html +++ b/cookbook-zh/tags/game/index.html @@ -5,13 +5,13 @@ 11 docs tagged with "game" | All in One Solana - +

    11 docs tagged with "game"

    View All Tags

    Distribution

    Distribution of your game depends highly on the platform you are using. With Solana, there are game SDKs you can build for IOS, Android, Web and Native Windows or Mac. Using the Unity SDK you could even connect Nintendo Switch or XBox to Solana theoretically. Many game companies are pivoting to a mobile first approach because there are so many people with mobile phones in the world. Mobile comes with its own complications though, so you should pick what fits best to your game.

    Energy System

    Casual games commonly use energy systems, meaning that actions in the game cost energy which refills over time. In this guide we will walk through how to build one on Solana.

    How interact with tokens in program

    Tokens on Solana can serve various purposes, such as in-game rewards, incentives, or other applications. For example, you can create tokens and distribute them to players when they complete specific in-game actions.

    Intro into gaming on Solana

    The gaming space in the Solana ecosystem is expanding rapidly. Integrating with Solana can provide numerous benefits for games, such as enabling players to own and trade their assets via NFTs in games, building a real in-game economy, creating composable game programs, and allowing players to compete for valuable assets.

    NFTs In Games

    Non-fungible tokens (NFTs) are rapidly gaining popularity as a means of integrating Solana into games.

    Porting a program to Unity

    When you have written a solana program you now maybe want to use it in the Unity Game engine. Fortunately there is a code generator which lets you port a anchor idl (a json representation of a solana program) to C#

    save game state

    You can use Solana block chain to save the state of your game in program accounts. These are accounts that are owned by your program and they are derived from the program Id and some seeds. These can be thought of as data base entries.

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/hello-world/index.html b/cookbook-zh/tags/hello-world/index.html index e632503fb..e1f3675f4 100644 --- a/cookbook-zh/tags/hello-world/index.html +++ b/cookbook-zh/tags/hello-world/index.html @@ -5,13 +5,13 @@ One doc tagged with "hello-world" | All in One Solana - +

    One doc tagged with "hello-world"

    View All Tags
    - + \ No newline at end of file diff --git a/cookbook-zh/tags/index.html b/cookbook-zh/tags/index.html index 88138ed32..10dafbf47 100644 --- a/cookbook-zh/tags/index.html +++ b/cookbook-zh/tags/index.html @@ -5,13 +5,13 @@ Tags | All in One Solana - + - + \ No newline at end of file diff --git a/cookbook-zh/tags/intro/index.html b/cookbook-zh/tags/intro/index.html index 60cd99ba8..aa5de2307 100644 --- a/cookbook-zh/tags/intro/index.html +++ b/cookbook-zh/tags/intro/index.html @@ -5,13 +5,13 @@ One doc tagged with "intro" | All in One Solana - +

    One doc tagged with "intro"

    View All Tags

    Intro into gaming on Solana

    The gaming space in the Solana ecosystem is expanding rapidly. Integrating with Solana can provide numerous benefits for games, such as enabling players to own and trade their assets via NFTs in games, building a real in-game economy, creating composable game programs, and allowing players to compete for valuable assets.

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/keypair/index.html b/cookbook-zh/tags/keypair/index.html index a90e09ab7..0b6bbcab2 100644 --- a/cookbook-zh/tags/keypair/index.html +++ b/cookbook-zh/tags/keypair/index.html @@ -5,13 +5,13 @@ One doc tagged with "keypair" | All in One Solana - +

    One doc tagged with "keypair"

    View All Tags
    - + \ No newline at end of file diff --git a/cookbook-zh/tags/learn/index.html b/cookbook-zh/tags/learn/index.html index d1c5bae6e..17bb68c82 100644 --- a/cookbook-zh/tags/learn/index.html +++ b/cookbook-zh/tags/learn/index.html @@ -5,13 +5,13 @@ One doc tagged with "learn" | All in One Solana - +

    One doc tagged with "learn"

    View All Tags
    - + \ No newline at end of file diff --git a/cookbook-zh/tags/local-development/index.html b/cookbook-zh/tags/local-development/index.html index 128449756..70ecbc493 100644 --- a/cookbook-zh/tags/local-development/index.html +++ b/cookbook-zh/tags/local-development/index.html @@ -5,13 +5,13 @@ One doc tagged with "local-development" | All in One Solana - +

    One doc tagged with "local-development"

    View All Tags
    - + \ No newline at end of file diff --git a/cookbook-zh/tags/name-service/index.html b/cookbook-zh/tags/name-service/index.html index 186f135d7..96326bce3 100644 --- a/cookbook-zh/tags/name-service/index.html +++ b/cookbook-zh/tags/name-service/index.html @@ -5,13 +5,13 @@ One doc tagged with "name-service" | All in One Solana - +

    One doc tagged with "name-service"

    View All Tags
    - + \ No newline at end of file diff --git a/cookbook-zh/tags/nft/index.html b/cookbook-zh/tags/nft/index.html index 780c973af..10771e9e9 100644 --- a/cookbook-zh/tags/nft/index.html +++ b/cookbook-zh/tags/nft/index.html @@ -5,13 +5,13 @@ 2 docs tagged with "nft" | All in One Solana - +

    2 docs tagged with "nft"

    View All Tags

    NFTs In Games

    Non-fungible tokens (NFTs) are rapidly gaining popularity as a means of integrating Solana into games.

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/pda/index.html b/cookbook-zh/tags/pda/index.html index 450e9fdb9..e180b9a5e 100644 --- a/cookbook-zh/tags/pda/index.html +++ b/cookbook-zh/tags/pda/index.html @@ -5,13 +5,13 @@ 2 docs tagged with "pda" | All in One Solana - +

    2 docs tagged with "pda"

    View All Tags

    程序派生账户(PDA)

    程序派生账户(PDA)是为了让特定程序可以控制一些账户而设计出来的。使用PDA,程序可以通过编程方法为一些地址进行签名,而不一定用到私钥。

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/program/index.html b/cookbook-zh/tags/program/index.html index 8100cc0b5..bc2b71111 100644 --- a/cookbook-zh/tags/program/index.html +++ b/cookbook-zh/tags/program/index.html @@ -5,13 +5,13 @@ 4 docs tagged with "program" | All in One Solana - +

    4 docs tagged with "program"

    View All Tags

    How interact with tokens in program

    Tokens on Solana can serve various purposes, such as in-game rewards, incentives, or other applications. For example, you can create tokens and distribute them to players when they complete specific in-game actions.

    Porting a program to Unity

    When you have written a solana program you now maybe want to use it in the Unity Game engine. Fortunately there is a code generator which lets you port a anchor idl (a json representation of a solana program) to C#

    程序

    任何开发者都可以在Solana链上编写以及部署程序。Solana程序(在其他链上叫做智能合约),是所有链上活动的基础。

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/sdk/index.html b/cookbook-zh/tags/sdk/index.html index 5233f07d1..6dc431196 100644 --- a/cookbook-zh/tags/sdk/index.html +++ b/cookbook-zh/tags/sdk/index.html @@ -5,13 +5,13 @@ One doc tagged with "sdk" | All in One Solana - + - + \ No newline at end of file diff --git a/cookbook-zh/tags/serialization/index.html b/cookbook-zh/tags/serialization/index.html index 726f06b68..f351c0d8b 100644 --- a/cookbook-zh/tags/serialization/index.html +++ b/cookbook-zh/tags/serialization/index.html @@ -5,13 +5,13 @@ One doc tagged with "serialization" | All in One Solana - +

    One doc tagged with "serialization"

    View All Tags

    序列数据

    当我们谈论序列化时,我们指的是数据的序列化和反序列化。

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/solana-cook-book/index.html b/cookbook-zh/tags/solana-cook-book/index.html index 5919cf36e..37b8b6e72 100644 --- a/cookbook-zh/tags/solana-cook-book/index.html +++ b/cookbook-zh/tags/solana-cook-book/index.html @@ -5,13 +5,13 @@ 37 docs tagged with "solana-cook-book" | All in One Solana - +

    37 docs tagged with "solana-cook-book"

    View All Tags

    Cross Program Invocations (CPIs)

    A Cross-Program Invocation (CPI) is a direct call from one program into another, allowing for the composability of Solana programs. Just as any client can call any program using the JSON RPC, any program can call any other program via a CPI. CPIs essentially turn the entire Solana ecosystem into one giant API that is at your disposal as a developer.

    Distribution

    Distribution of your game depends highly on the platform you are using. With Solana, there are game SDKs you can build for IOS, Android, Web and Native Windows or Mac. Using the Unity SDK you could even connect Nintendo Switch or XBox to Solana theoretically. Many game companies are pivoting to a mobile first approach because there are so many people with mobile phones in the world. Mobile comes with its own complications though, so you should pick what fits best to your game.

    Energy System

    Casual games commonly use energy systems, meaning that actions in the game cost energy which refills over time. In this guide we will walk through how to build one on Solana.

    How interact with tokens in program

    Tokens on Solana can serve various purposes, such as in-game rewards, incentives, or other applications. For example, you can create tokens and distribute them to players when they complete specific in-game actions.

    Intro into gaming on Solana

    The gaming space in the Solana ecosystem is expanding rapidly. Integrating with Solana can provide numerous benefits for games, such as enabling players to own and trade their assets via NFTs in games, building a real in-game economy, creating composable game programs, and allowing players to compete for valuable assets.

    NFTs In Games

    Non-fungible tokens (NFTs) are rapidly gaining popularity as a means of integrating Solana into games.

    Porting a program to Unity

    When you have written a solana program you now maybe want to use it in the Unity Game engine. Fortunately there is a code generator which lets you port a anchor idl (a json representation of a solana program) to C#

    save game state

    You can use Solana block chain to save the state of your game in program accounts. These are accounts that are owned by your program and they are derived from the program Id and some seeds. These can be thought of as data base entries.

    Solana秘籍

    《Solana 秘籍》中文取自:Solana Cookbook仓库里面已经有的中文版本。后期会根据官方的更新及时更新中文版本,由All in One Solana 社区维护。

    交易

    客户端可以通过向一个集群提交交易来调用程序。一个交易可以包含多个指令,每个指令可以针对不同的程序。

    代币

    我需要什么才能开始使用SPL代币?

    功能相等测试

    当测试程序时,确保它在各个集群中以相同的方式运行对于确保质量和产生预期结果非常重要。

    序列数据

    当我们谈论序列化时,我们指的是数据的序列化和反序列化。

    程序

    任何开发者都可以在Solana链上编写以及部署程序。Solana程序(在其他链上叫做智能合约),是所有链上活动的基础。

    程序派生账户(PDA)

    程序派生账户(PDA)是为了让特定程序可以控制一些账户而设计出来的。使用PDA,程序可以通过编程方法为一些地址进行签名,而不一定用到私钥。

    获取程序帐户

    一个返回程序所拥有的账户的RPC方法。目前不支持分页。请求getProgramAccounts应该包括dataSlice和/或filters参数,以提高响应时间并返回只有预期结果的内容。

    贡献

    欢迎任何人对这本食谱进行贡献。在贡献新的代码片段时,请参考项目的风格。

    账户

    在Solana中,账户是用来存储状态的。账户是Solana开发中非常重要的构成要素。

    账户

    如何创建系统账户

    账户映射

    在编程中,我们经常使用映射(Map)这种数据结构,将一个键与某种值关联起来。键和值可以是任意类型的数据,键用作标识要保存的特定值的标识符。通过键,我们可以高效地插入、检索和更新这些值。

    重试交易

    在某些情况下,一个看似有效的交易可能在输入区块之前会被丢弃。这种情况最常发生在网络拥堵期间,当一个RPC节点无法将交易重新广播给区块链的领导节点时。对于最终用户来说,他们的交易可能会完全消失。虽然RPC节点配备了通用的重新广播算法,但应用程序开发人员也可以开发自己的自定义重新广播逻辑。

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/solana/index.html b/cookbook-zh/tags/solana/index.html index 9963bf2aa..690559840 100644 --- a/cookbook-zh/tags/solana/index.html +++ b/cookbook-zh/tags/solana/index.html @@ -5,13 +5,13 @@ One doc tagged with "solana" | All in One Solana - +

    One doc tagged with "solana"

    View All Tags

    Solana秘籍

    《Solana 秘籍》中文取自:Solana Cookbook仓库里面已经有的中文版本。后期会根据官方的更新及时更新中文版本,由All in One Solana 社区维护。

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/staking/index.html b/cookbook-zh/tags/staking/index.html index 0f5d649e8..bb863b3b1 100644 --- a/cookbook-zh/tags/staking/index.html +++ b/cookbook-zh/tags/staking/index.html @@ -5,13 +5,13 @@ One doc tagged with "staking" | All in One Solana - +

    One doc tagged with "staking"

    View All Tags
    - + \ No newline at end of file diff --git a/cookbook-zh/tags/store-sol/index.html b/cookbook-zh/tags/store-sol/index.html index fdf75fe72..3cdc8f38c 100644 --- a/cookbook-zh/tags/store-sol/index.html +++ b/cookbook-zh/tags/store-sol/index.html @@ -5,13 +5,13 @@ One doc tagged with "store-sol" | All in One Solana - +

    One doc tagged with "store-sol"

    View All Tags
    - + \ No newline at end of file diff --git a/cookbook-zh/tags/test/index.html b/cookbook-zh/tags/test/index.html index 0ce3742a3..104c65fa3 100644 --- a/cookbook-zh/tags/test/index.html +++ b/cookbook-zh/tags/test/index.html @@ -5,13 +5,13 @@ One doc tagged with "test" | All in One Solana - +

    One doc tagged with "test"

    View All Tags

    功能相等测试

    当测试程序时,确保它在各个集群中以相同的方式运行对于确保质量和产生预期结果非常重要。

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/token/index.html b/cookbook-zh/tags/token/index.html index 9425924fa..9a630e127 100644 --- a/cookbook-zh/tags/token/index.html +++ b/cookbook-zh/tags/token/index.html @@ -5,13 +5,13 @@ 2 docs tagged with "token" | All in One Solana - +

    2 docs tagged with "token"

    View All Tags

    How interact with tokens in program

    Tokens on Solana can serve various purposes, such as in-game rewards, incentives, or other applications. For example, you can create tokens and distribute them to players when they complete specific in-game actions.

    代币

    我需要什么才能开始使用SPL代币?

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/transaction/index.html b/cookbook-zh/tags/transaction/index.html index dd6d33d67..fbc5704d8 100644 --- a/cookbook-zh/tags/transaction/index.html +++ b/cookbook-zh/tags/transaction/index.html @@ -5,13 +5,13 @@ One doc tagged with "transaction" | All in One Solana - +

    One doc tagged with "transaction"

    View All Tags
    - + \ No newline at end of file diff --git a/cookbook-zh/tags/transactions/index.html b/cookbook-zh/tags/transactions/index.html index 5ceaa1eab..58f28b63a 100644 --- a/cookbook-zh/tags/transactions/index.html +++ b/cookbook-zh/tags/transactions/index.html @@ -5,13 +5,13 @@ 5 docs tagged with "transactions" | All in One Solana - +

    5 docs tagged with "transactions"

    View All Tags

    交易

    客户端可以通过向一个集群提交交易来调用程序。一个交易可以包含多个指令,每个指令可以针对不同的程序。

    账户

    如何创建系统账户

    重试交易

    在某些情况下,一个看似有效的交易可能在输入区块之前会被丢弃。这种情况最常发生在网络拥堵期间,当一个RPC节点无法将交易重新广播给区块链的领导节点时。对于最终用户来说,他们的交易可能会完全消失。虽然RPC节点配备了通用的重新广播算法,但应用程序开发人员也可以开发自己的自定义重新广播逻辑。

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/unity/index.html b/cookbook-zh/tags/unity/index.html index b927dd949..9a9ab420e 100644 --- a/cookbook-zh/tags/unity/index.html +++ b/cookbook-zh/tags/unity/index.html @@ -5,13 +5,13 @@ One doc tagged with "unity" | All in One Solana - +

    One doc tagged with "unity"

    View All Tags

    Porting a program to Unity

    When you have written a solana program you now maybe want to use it in the Unity Game engine. Fortunately there is a code generator which lets you port a anchor idl (a json representation of a solana program) to C#

    - + \ No newline at end of file diff --git a/cookbook-zh/tags/wallet/index.html b/cookbook-zh/tags/wallet/index.html index 60118783a..86a1df858 100644 --- a/cookbook-zh/tags/wallet/index.html +++ b/cookbook-zh/tags/wallet/index.html @@ -5,13 +5,13 @@ One doc tagged with "wallet" | All in One Solana - +

    One doc tagged with "wallet"

    View All Tags
    - + \ No newline at end of file diff --git a/cookbook-zh/tags/web-3-js/index.html b/cookbook-zh/tags/web-3-js/index.html index aa7c2845e..1ce27f5be 100644 --- a/cookbook-zh/tags/web-3-js/index.html +++ b/cookbook-zh/tags/web-3-js/index.html @@ -5,13 +5,13 @@ One doc tagged with "web3.js" | All in One Solana - +

    One doc tagged with "web3.js"

    View All Tags
    - + \ No newline at end of file diff --git a/index.html b/index.html index 798383f79..10cc42d24 100644 --- a/index.html +++ b/index.html @@ -5,13 +5,13 @@ Hello from All in One Solana | All in One Solana - +

    All in One Solana

    Power by 706 & Rustycab

    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 0cd6bdf63..0ba42cb93 100644 --- a/markdown-page/index.html +++ b/markdown-page/index.html @@ -5,13 +5,13 @@ Markdown page example | All in One Solana - +

    Markdown page example

    You don't need React to write simple standalone pages.

    - + \ No newline at end of file