返回顶部
c

cabin-solSolana开发导师

Solana development tutor and builder. Teaches program development through challenges, Anchor framework, Token-2022, Compressed NFTs, and security best practices. "Return to primitive computing.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.2.1
安全检测
已通过
2,138
下载量
免费
免费
3
收藏
概述
安装方式
版本历史

cabin-sol

Cabin Sol 🌲

回归原始计算。

一份面向AI代理的全面Solana开发指南。使用Anchor构建程序,掌握账户模型,避开大多数开发者栽跟头的陷阱。



最重要的概念

在Solana上,账户就是一切。

与以太坊合约拥有内部存储不同,Solana程序是无状态的。所有数据都存在于程序读写操作的账户中。

对于每个功能,都要问:

  1. 1. 这些数据存在哪里?(哪个账户)
  2. 谁拥有那个账户?(程序拥有 vs 用户拥有)
  3. 它是PDA吗?(程序派生地址——没有私钥)
  4. 谁支付租金?(免租金 = 预付2年)



AI代理模式

教学模式

  • - PDA是如何工作的?
  • 解释Solana账户模型
  • SPL Token和Token-2022有什么区别?

构建模式

  • - 帮我构建一个质押程序
  • 使用Metaplex创建NFT集合
  • 构建一个代币交换

审查模式

  • - 审查这个程序是否存在漏洞
  • 检查我的PDA派生
  • 审计这个CPI

调试模式

  • - 为什么我的交易失败了?
  • 调试这个账户未找到错误
  • 修复我的代币转账

快速开始

选项A:create-solana-dapp(推荐)

bash
npx create-solana-dapp@latest

选择:Next.js + next-tailwind-counter


cd my-project
npm install
npm run anchor localnet # 终端1
npm run anchor build && npm run anchor deploy # 终端2
npm run dev # 终端3

选项B:纯Anchor

bash
anchor init my_program
cd my_program
solana-test-validator # 终端1
anchor build && anchor deploy # 终端2
anchor test



项目结构

my-solana-dapp/
├── anchor/ # Solana程序(Rust)
│ ├── programs/
│ │ └── my_program/
│ │ └── src/lib.rs # 你的Rust程序
│ ├── tests/ # TypeScript测试
│ └── Anchor.toml # Anchor配置
├── src/ # Next.js前端
│ ├── app/
│ └── components/
└── package.json



挑战

通过渐进式挑战学习Solana:

#挑战核心概念
0Hello Solana第一个Anchor程序,账户
1
SPL Token | 可替代代币,ATA,铸造 |
| 2 | NFT Metaplex | NFT标准,元数据,集合 |
| 3 | PDA Escrow | PDA,程序权限,托管 |
| 4 | 质押 | 基于时间的奖励,存款 |
| 5 | Token-2022 | 转账钩子,扩展 |
| 6 | 压缩NFT | 状态压缩,默克尔树 |
| 7 | 预言机(Pyth) | 价格馈送,过期检查 |
| 8 | AMM交换 | 恒定乘积,流动性池 |
| 9 | Blinks & Actions | 可分享交易 |


Rust基础

所有权(难点)

rust
// 每个值只有一个所有者
let s1 = String::from(hello);
let s2 = s1; // s1 被移动到 s2
// println!({}, s1); // 错误!

// 借用让你在不拥有所有权的情况下使用
fn get_length(s: &String) -> usize {
s.len() // 借用,不拥有
}

Result & Option

rust
// Result用于错误处理
pub fn do_thing(ctx: Context) -> Result<()> {
let value = someoperation().okor(ErrorCode::Failed)?;
Ok(())
}

// Option用于可空值
let maybe: Option = Some(42);
let value = maybe.unwrap_or(0); // 安全默认值



Anchor框架

程序结构

rust
use anchor_lang::prelude::*;

declare_id!(YourProgramId11111111111111111111111111111);

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

pub fn initialize(ctx: Context, data: u64) -> Result<()> {
ctx.accounts.my_account.data = data;
ctx.accounts.my_account.authority = ctx.accounts.authority.key();
Ok(())
}
}

#[derive(Accounts)]
pub struct Initialize {
#[account(
init,
payer = authority,
space = 8 + 8 + 32, // 鉴别器 + u64 + Pubkey
)]
pub my_account: Account,
#[account(mut)]
pub authority: Signer,
pub system_program: Program,
}

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

账户约束速查表

rust
// 初始化新账户
#[account(init, payer = payer, space = 8 + SIZE)]
pub new_account: Account,

// 可变现有账户
#[account(mut)]
pub existing: Account,

// 验证所有权
#[account(has_one = authority)]
pub owned: Account,

// 带种子的PDA
#[account(
seeds = [bvault, user.key().as_ref()],
bump,
)]
pub vault: Account,

// 初始化PDA
#[account(
init,
payer = user,
space = 8 + 64,
seeds = [buser, user.key().as_ref()],
bump,
)]
pub user_data: Account,

// 关闭并回收租金
#[account(mut, close = recipient)]
pub closing: Account,

PDA(程序派生地址)

rust
// PDA是确定性地址,没有私钥
// 你的程序可以代表它们签名

// 查找PDA
let (pda, bump) = Pubkey::findprogramaddress(
&[bvault, user.key().as_ref()],
&program_id,
);

// 在CPI中使用PDA签名
let seeds = &[bvault, user.key().as_ref(), &[bump]];
let signer = &[&seeds[..]];

token::transfer(
CpiContext::newwithsigner(
ctx.accounts.tokenprogram.toaccount_info(),
Transfer { from, to, authority: vault },
signer,
),
amount,
)?;



关键陷阱

1. 账户模型 ≠ EVM存储

程序是无状态的。所有数据都存在于账户中。

2. PDA没有私钥

由种子确定性派生。只有程序可以签名。

3. 代币账户是独立的

每个代币在每个钱包中需要自己的账户(关联代币账户)。

4. 必须支付租金

账户需要SOL才能存在。免租金 = 预付2年(约0.002 SOL)。

5. 计算单元 ≠ Gas

固定预算:默认200k,最大1.4M。如果需要可以请求更多。

6. 空间包含鉴别器

始终为Anchor的鉴别器添加8字节!

rust
// 错误
space = 8 + 32 // 忘记鉴别器?不行!

// 正确
space = 8 + 8 + 32 // 8(鉴别器)+ 8(u64)+ 32(Pubkey)

7. 整数溢出

rust
// 不好
let result = a + b; // 可能panic!

// 好
let result = a.checkedadd(b).okor(ErrorCode::Overflow)?;

8. Token-2022是不同的

与SPL Token使用不同的程序ID!检查你正在使用哪一个。

前端(Next.js)

钱包连接

typescript
// 已在create-solana-dapp中配置!
import { useWallet, useConnection } from @solana/wallet-adapter-react;
import { WalletMultiButton } from @solana/wallet-adapter-react-ui;

function App() {
const { publicKey } = useWallet();
return (
<>

{publicKey &&

已连接:{publicKey.toBase58()}

}

);
}

调用程序

typescript
import { Program, AnchorProvider, BN } from @coral-xyz/anchor;

const program = new Program(idl, provider);

// 写入
await program.methods
.initialize(new BN(42))
.accounts({
myAccount: keypair.publicKey,
authority: wallet

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 cabin-sol-1776381077 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 cabin-sol-1776381077 技能

通过命令行安装

skillhub install cabin-sol-1776381077

下载

⬇ 下载 cabin-sol v1.2.1(免费)

文件大小: 34.81 KB | 发布时间: 2026-4-17 14:25

v1.2.1 最新 2026-4-17 14:25
Add back tree emoji

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部