Pular para o conteúdo principal
Superteam Brasil
Voltar
+20 XP
1/12

What is the Anchor Framework?

Anchor is the most popular framework for Solana smart contract development. It provides a Rust-based DSL (domain-specific language) that dramatically reduces boilerplate and makes programs safer, faster to write, and easier to read.

Why Use Anchor?

Writing native Solana programs in Rust requires:

  • Manual account deserialization and validation
  • Verbose error handling
  • Security checks spread across your code
  • Repetitive boilerplate for common patterns

Anchor handles all of this for you through macros and attributes.

Native Solana Program

// Manual account deserialization
let account_info_iter = &mut accounts.iter();
let user_account = next_account_info(account_info_iter)?;

// Manual validation
if !user_account.is_writable {
    return Err(ProgramError::InvalidAccountData);
}

// Manual owner check
if user_account.owner != program_id {
    return Err(ProgramError::IncorrectProgramId);
}

Anchor Program

#[derive(Accounts)]
pub struct UpdateUser<'info> {
    #[account(mut)]
    pub user: Account<'info, UserAccount>,
}

Anchor automatically validates that the account is writable and owned by the program!

Anchor Project Structure

A typical Anchor project:

my-anchor-project/
├── programs/
│   └── my-program/
│       └── src/
│           └── lib.rs      # Your program code
├── tests/
│   └── my-program.ts       # TypeScript tests
├── migrations/
│   └── deploy.ts           # Deployment scripts
└── Anchor.toml             # Configuration

Key Anchor Components

1. Program Module

use anchor_lang::prelude::*;

declare_id!("YourProgramIDHere");

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

    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
        // Your logic here
        Ok(())
    }
}

The #[program] macro defines your program's instruction handlers.

2. Accounts Struct

#[derive(Accounts)]
pub struct Initialize<'info> {
    #[account(
        init,
        payer = user,
        space = 8 + 32 + 8
    )]
    pub my_account: Account<'info, MyAccount>,
    #[account(mut)]
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
}

Accounts structs define what accounts your instruction needs and how to validate them.

3. Account Data

#[account]
pub struct MyAccount {
    pub authority: Pubkey,
    pub counter: u64,
}

The #[account] macro adds serialization/deserialization and a discriminator for account type safety.

Anchor vs Native: Security Benefits

Security CheckNativeAnchor
Account ownershipManual checkAutomatic via Account<'info, T>
Signer verificationManual checkAutomatic via Signer<'info>
Writable validationManual checkAutomatic via #[account(mut)]
Account initializationManual allocationAutomatic via #[account(init)]
Discriminator (type safety)NoneAutomatic 8-byte discriminator

Anchor programs are harder to exploit because common security pitfalls are prevented by the framework itself.

Next Steps

In the next challenge, you'll build a mock Anchor program structure to understand how programs are organized on Solana.

Próximo

Discussão