name: arbitrum-dapp-skill description: 基于 Arbitrum 使用 Stylus (Rust) 和/或 Solidity 构建 dApp 的指导手册。涵盖本地开发节点设置、合约开发、测试、部署以及与 viem 的 React 前端集成。适用于启动新的 Arbitrum 项目、编写 Stylus 或 Solidity 合约、部署到 Arbitrum 或构建与 Arbitrum 合约交互的前端。
Arbitrum dApp 开发
技术栈
| 层级 | 工具 | 备注 |
|---|---|---|
| 智能合约 (Rust) | stylus-sdk v0.10+ |
编译为 WASM,在 Stylus VM 上运行 |
| 智能合约 (Solidity) | Solidity 0.8.x + Foundry | Arbitrum 上的标准 EVM 路径 |
| 本地节点 | nitro-devnode |
基于 Docker 的本地 Arbitrum 链 |
| 合约 CLI | cargo-stylus |
用于 Stylus 的检查、部署、导出 ABI |
| 合约工具链 | Foundry (forge, cast, anvil) |
用于 Solidity 的构建、测试、部署、交互 |
| 前端 | React / Next.js + viem + wagmi | 使用 viem 处理所有链交互 |
| 包管理器 | pnpm | 支持工作区,速度快 |
决策流程
启动新合约时:
- 需要极致性能/更低 Gas? → 选择 Stylus Rust。参见
references/stylus-rust-contracts.md。 - 需要广泛的工具兼容性/快速原型开发? → 选择 Solidity。参见
references/solidity-contracts.md。 - 需要混合使用? → 两者都用。Stylus 和 Solidity 合约在 Arbitrum 上完全可互操作。
项目脚手架
推荐的单体仓库布局
my-arbitrum-dapp/
├── apps/
│ ├── frontend/ # React / Next.js 应用
│ ├── contracts-stylus/ # Rust Stylus 合约
│ ├── contracts-solidity/ # Foundry Solidity 合约
│ └── nitro-devnode/ # 本地开发链 (git 子模块)
├── pnpm-workspace.yaml
└── package.json
引导步骤
# 1. 创建工作区
mkdir my-arbitrum-dapp && cd my-arbitrum-dapp
pnpm init
printf "packages:
- 'apps/*'
" > pnpm-workspace.yaml
# 2. 本地开发节点
git clone https://github.com/OffchainLabs/nitro-devnode.git apps/nitro-devnode
cd apps/nitro-devnode && ./run-dev-node.sh && cd ../..
# 3a. Stylus 合约
cargo stylus new apps/contracts-stylus
# 3b. Solidity 合约
cd apps && forge init contracts-solidity && cd ..
# 4. 前端
pnpm create next-app apps/frontend --typescript
cd apps/frontend
pnpm add viem wagmi @tanstack/react-query
核心工作流
Stylus Rust
# 验证
cargo stylus check --endpoint http://localhost:8547
# 部署 (使用 nitro-devnode 预注资的部署者账户)
cargo stylus deploy \
--endpoint http://localhost:8547 \
--private-key $PRIVATE_KEY
# 导出 ABI 供前端使用
cargo stylus export-abi
Solidity (Foundry)
# 构建
forge build
# 测试
forge test
# 本地部署 (使用 nitro-devnode 预注资的部署者账户)
forge script script/Deploy.s.sol --rpc-url http://localhost:8547 --broadcast \
--private-key $PRIVATE_KEY
注意: nitro-devnode 附带一个预注资的部署者账户。默认私钥和地址请参见
references/local-devnode.md。对于测试网/主网,请通过环境变量使用您自己的密钥——切勿硬编码密钥。
前端 (viem + wagmi)
import { createPublicClient, http } from "viem";
import { arbitrumSepolia } from "viem/chains";
const client = createPublicClient({
chain: arbitrumSepolia,
transport: http(),
});
// 从合约读取数据
const result = await client.readContract({
address: "0x...",
abi: contractAbi,
functionName: "myFunction",
});
完整模式(包括 wagmi 钩子、钱包连接和写入交易)请参见 references/frontend-integration.md。
原则
- 始终使用 viem 进行链交互。
- 先在本地测试,使用 nitro-devnode,然后再部署到测试网。
- 导出 ABI,无论是来自 Stylus (
cargo stylus export-abi) 还是 Solidity (forge inspect),并将其保存在前端可以导入的共享位置。 - 使用环境变量 存储 RPC URL、合约地址和私钥。切勿硬编码密钥。
- Stylus 合约是 EVM 兼容的 —— 它们与 Solidity 合约共享相同的地址空间、存储模型和 ABI 编码。跨合约调用无缝工作。
参考资料
需要更深入指导时请查阅:
references/stylus-rust-contracts.md— Stylus SDK 模式、存储、宏、入口点references/solidity-contracts.md— Arbitrum 上的 Solidity 细节和 Foundry 工作流references/frontend-integration.md— React + viem + wagmi 模式references/local-devnode.md— Nitro 开发节点设置、账户和调试references/deployment.md— 部署到测试网和主网references/testing.md— Stylus 和 Solidity 的测试策略