Актуальні теми
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
Минулого тижня @redacted_noah розповів про те, що Zero Copy™️ on @anchorlang є альфа-версією для кожного @solana розробника
Я думав, що нульовий копія використовується лише для дуже великих облікових записів
Я зрозумів, що поняття не маю, чому іноді використовую його
Я вирішив глибоко зануритися, дозвольте взяти вас із собою 👇

@SuperteamFRANCE @SuperteamJapan По-перше, чому ми взагалі говоримо про парсинг даних з нульовим копіюванням?
Парсер даних Anchor за замовчуванням називається Borsh.
При виклику інструкції Anchor, Borsh збирається скопіювати дані вашого облікового запису в структуру Borsh (в слот пам'яті під назвою "купа", докладніше про це пізніше)
Коли ви включаєте обліковий запис у свою інструкцію, ви використовуєте формат, який виглядає наступним чином.

При використанні нульового копіювання ваш код буде виглядати наступним чином.

Так що ж там насправді відбувається?
Це не очевидно з самого початку!
Спочатку нам потрібно зрозуміти, як Solana використовує дані свого додатка Rust: купу, стек і простір «нульового копіювання».
1. Стек:
Саме тут ми зберігаємо локальні та прості типи даних.
Ви отримуєте 4 КіБ простору для кожного стека, кожен виклик функції отримує свій власний розподіл 4 КіБ.
"Порушення доступу в кадрі стека X за адресою XXXXX розміру X." - це така помилка, яку ви отримуєте, коли перевищуєте максимальний розмір стека.
У Anchor першим виправленням цієї помилки є використання «Box» для переміщення даних зі стека до «купи» 👇

2. Купа в Solana:
За замовчуванням програми працюють у віртуальній машині BPF із купою 32 КБ. Це одноразовий розподіл для одного цілого виклику.
Саме тут ви будете зберігати більш динамічні типи даних (Vec, String)
Десеріалізація облікових записів за допомогою Borsh копіює дані в купу, швидко з'їдаючи місце
3. Нульова копія:
Якщо вам потрібно обійти купу та стек, тому що ваш повний бюджет на дані перевищено (багато CPI, з великими обліковими записами), ви використовуватимете нульову копію.
Нульове копіювання дає змогу працювати з даними без необхідності спочатку виділяти або копіювати їх, пропускаючи десеріалізацію.
Коли нульове копіювання має сенс?
1. Великі обсяги даних
2. Робота з великою кількістю CPI
Продовжуємо:
1. Великі обсяги даних
Скажімо, ви хочете відстежувати список гаманців прямо у вашому стані, щоб мати можливість повністю запускати перевірки ончейн (якщо вам потрібно це зробити, подивіться на дерева 😅 меркла, це не спосіб це зробити)
Як і в розіграші, зберігаючи адресу кожного учасника перед проведенням фінального розіграшу та вибором переможця.
Це легко вийде за межі 32 Кб пам'яті. Один учасник = 32 байти, так що якщо ви плануєте бути успішним і виділити місце для 1000 учасників, це вже з'їдає весь розмір купи (32 000 байт)
У цій ситуації ви можете використовувати нульове копіювання, щоб обійти обмеження та дозволити працювати з набагато більшими обліковими записами, не потрапляючи ні в купу, ні в ліміти стека.
ЯК ВИПРАВИТИ?
Простий! Просто використовуйте функцію «Нульове копіювання» скрізь.
Все дуже просто 👇 (додайте атрибут макросу #[account("zero_copy")] до облікового запису RootEscrow)
АЛЕ Нульове копіювання пов'язане з іншою проблемою, причиною, через яку Anchor вибрав Borsh на першому місці: вирівнювання байтів.

Вирівнювання байтів — це низькорівнева техніка, яку повинен розуміти кожен розробник Solana, використовуючи нульове копіювання чи ні
Він вимагає, щоб структури були безпечними для нульового копіювання через bytemuck (вирівнювання байтів може спричинити паніку, якщо його неправильно обробити)
Скоро 🔥 я опублікую ще одну тему на цю *захоплюючу* тему
А поки що оформлюю @legendsdotfun продукт, який я створюю з середини вересня та беру участь у хакатоні @colosseum Cypherpunk
Зареєструйте свій продукт, віддайте голоси новим перспективним командам
Давайте зробимо так, щоб кожна легенда солани сяяла 🤝
Величезне спасибі козам:
- @redacted_noah
- @blockiosaurus
- @0xIchigo
Для доказу прочитайте цю гілку живих відкриттів!
6,1K
Найкращі
Рейтинг
Вибране

