La semaine dernière, @redacted_noah a envoyé un coup de gueule sur la façon dont Zero Copy™️ sur @anchorlang est l'alpha parfait pour chaque dev @solana. Je pensais que le zero copy n'était utilisé que pour des comptes très volumineux. Je me suis rendu compte que je n'avais aucune idée de pourquoi je l'utilisais parfois. J'ai décidé d'approfondir le sujet, laissez-moi vous emmener avec moi 👇
@SuperteamFRANCE @SuperteamJapan Tout d'abord, pourquoi parlons-nous même de l'analyse de données sans copie ? Le parseur de données par défaut d'Anchor s'appelle Borsh. Lors de l'appel d'une instruction Anchor, Borsh va copier les données de votre compte dans une structure Borsh (dans un emplacement mémoire appelé "le tas", plus à ce sujet plus tard)
Lorsque vous incluez un compte dans votre instruction, vous utilisez un format qui ressemble à ceci.
Lorsque vous utilisez le zero copy, votre code ressemblera à ceci.
Alors, que se passe-t-il réellement là-bas ? Ce n'est pas évident dès le départ ! Tout d'abord, nous devons comprendre comment Solana utilise ses données d'application Rust : le tas, la pile et l'espace "zero copy".
1. Pile : C'est ici que nous stockons des types de données locaux et simples. Vous disposez de 4Ko d'espace pour chaque pile, chaque appel de fonction obtient sa propre allocation de 4Ko. "Violation d'accès dans le cadre de pile X à l'adresse XXXXX de taille X." est le type d'erreur que vous obtenez lorsque vous dépassez la taille maximale de la pile. Dans Anchor, la première solution à cette erreur est d'utiliser un `Box` pour déplacer les données de la pile vers le "tas" 👇
2. Tas dans Solana : Les programmes s'exécutent dans une VM BPF avec un tas de 32 Ko par défaut. C'est une allocation unique pour une invocation entière. C'est ici que vous stockeriez des types de données plus dynamiques (Vec, String) La désérialisation des comptes avec Borsh copie les données dans le tas, consommant rapidement de l'espace.
3. Zero copy : Si vous devez contourner le tas et la pile parce que votre budget de données total est dépassé (beaucoup de CPIs, avec de grands comptes), vous utiliserez Zero copy. Zero copy vous permet de travailler avec les données sans avoir à les allouer ni à les copier d'abord en sautant la désérialisation.
Quand le Zero copy a-t-il du sens ? 1. Grandes données 2. Travailler avec beaucoup de CPI Continuons :
1. Grandes données Disons que vous souhaitez suivre une liste de portefeuilles directement dans votre état afin de pouvoir effectuer des vérifications entièrement onchain (si vous devez faire cela, renseignez-vous sur les arbres de Merkle 😅, ce n'est pas la bonne méthode) Comme dans une tombola, stocker l'adresse de chaque participant avant de procéder au tirage final et de sélectionner un gagnant. Cela dépassera facilement 32 Ko de mémoire. Un participant = 32 octets, donc si vous prévoyez d'avoir du succès et d'allouer de l'espace pour 1000 participants, cela consomme déjà toute la taille du tas (32 000 octets) Dans cette situation, vous pouvez opter pour le Zero copy pour contourner la limitation et permettre de travailler avec des comptes beaucoup plus grands sans atteindre les limites du tas ni de la pile.
COMMENT RÉPARER ? Simple ! Il suffit d'utiliser Zero Copy partout. C'est aussi facile que ça 👇 (ajoutez l'attribut de macro #[account("zero_copy")] au compte RootEscrow) MAIS Zero Copy pose un autre défi, la raison pour laquelle Anchor a choisi Borsh en premier lieu : l'alignement des octets.
L'alignement des octets est une technique de bas niveau que chaque développeur Solana devrait comprendre, qu'il utilise ou non le zero copy. Cela nécessite que les structures soient sûres pour le zero-copy via bytemuck (l'alignement des octets peut provoquer des panics s'il n'est pas géré correctement). Je publierai bientôt un autre fil sur ce sujet *excitant* 🔥
En attendant, jetez un œil à @legendsdotfun, le produit que je développe depuis mi-septembre et auquel je participe au hackathon @colosseum Cypherpunk. Inscrivez votre produit, donnez des votes positifs aux nouvelles équipes prometteuses. Faisons briller chaque légende de Solana 🤝
Un grand merci aux chèvres : - @redacted_noah - @blockiosaurus - @0xIchigo Pour avoir relu ce fil de découverte en direct !
6,11K