1. 网络与基础依赖

核心目标:解决 WSL 的网络连接问题,并一次性安装所有底层编译依赖(GCC/G++、Python3、Pipx),为后续工具链铺平道路。

1.1 网络模式选择

在开始下载之前,请根据您 Day001 的调试结果,选择一种网络连接方式。

  • 1.1.1 方案 A:TUN 模式 (强烈推荐)

    • 如果您的 v2rayN/Clash 已开启 TUN 模式,且在 Ubuntu 终端能直接 ping google.com 通畅。
    • 操作不需要执行任何代理命令,直接跳到 1.3 节 开始安装。
  • 1.1.2 方案 B:脚本代理 (保底方案)

    • 如果 TUN 模式无效(Ping 不通),或者下载速度极慢。
    • 操作:请使用我们在 .bashrc 中配置的脚本。
    • 执行命令:setproxy

1.2 代理命令机制详解

很多新手会对 sourcesetproxy 感到困惑,这里用“开关灯”做比喻:

  • 1.2.1 什么是 source ~/.bashrc (安装开关)

    • 含义:这相当于把“开关”安装到墙上。
    • 频率极低。只有当你修改了 .bashrc 文件(比如粘贴了新代码进去)时,才需要运行一次。平时开机,系统会自动执行。
  • 1.2.2 什么是 setproxy (按下开关)

    • 含义:这相当于伸手去“按开关,开灯”。
    • 安全机制脚本默认是静默的。只要您不手动输入这个命令,它就绝对不会运行,绝不会干扰 TUN 模式。
    • 频率按需。每次新打开一个黑窗口,默认都是“纯净模式”(无代理)。
  • 1.2.3 端口号策略 (自定义技巧)

    • 默认行为:直接输入 setproxy,默认连接 7890 端口。
    • 修改默认值:编辑 ~/.bashrc,找到 local port=${1:-7890},将 7890 改为您常用的(如 10809)。

1.3 安装系统工具链

执行以下命令,一次性安装 C++ 编译器、Python 环境以及 pipx(解决新版 Ubuntu 限制 pip 的问题):

# 1. 安装核心依赖
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git build-essential libssl-dev pkg-config python3-pip pipx
 
# 2. 配置 pipx 环境变量 (关键步骤)
pipx ensurepath
 
# 3. 立即刷新环境变量,确保 pipx 生效
source ~/.bashrc

2. Node.js 环境

核心目标:通过 NVM (Node Version Manager) 安装 Node.js,杜绝权限问题。

2.1 安装 NVM 管理器

严禁使用 sudo apt install nodejs。请执行官方脚本:

curl -o- [https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh](https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh) | bash

2.2 刷新与安装 LTS 版本

  • 2.2.1 刷新环境

    source ~/.bashrc
    
  • 2.2.2 安装 Node.js: 安装长期支持版 (LTS),这是企业开发的标准:

    nvm install --lts
    
  • 2.2.3 启用 Corepack (可选): 开启 pnpm/yarn 支持:

    corepack enable
    

2.3 验证安装

执行以下命令,版本号应为 v20.x 或更高:

node -v
npm -v

3. Foundry 工具链

核心目标:安装 Rust 编写的 Foundry 套件。它是目前审计公司(如 OpenZeppelin)和黑客最常用的工具。

3.1 下载与安装

执行官方安装脚本:

curl -L [https://foundry.paradigm.xyz](https://foundry.paradigm.xyz) | bash

3.2 激活与组件下载

  • 3.2.1 刷新环境

    source ~/.bashrc
    
  • 3.2.2 安装组件: 执行此命令下载 forge, cast, anvil

    foundryup
    

3.3 验证安装

forge --version

4. Solidity 编译器管理

核心目标:使用隔离环境安装编译器切换工具,完美兼容 PEP 668 标准。

4.1 安装工具

由于已经在 1.3 节配置好了 pipx,这里直接安装即可:

pipx install solc-select

4.2 安装并锁定版本

  • 4.2.1 安装 0.8.20:这是目前最主流的稳定版本:

    solc-select install 0.8.20
    
  • 4.2.2 设为全局默认

    solc-select use 0.8.20
    
  • 4.2.3 切换运行:若要改用不同的solidity版本运行项目,执行4.2.1下载不同版本,再执行4.2.2即可

4.3 验证切换

solc --version

5. VS Code插件配置

核心目标:让 VS Code 支持 Solidity 语法高亮。

5.1 启动 VS Code

code .

5.2 必装插件

  • Solidity (Nomic Foundation):官方 Hardhat 团队出品。

  • Even Better TOML:用于高亮 foundry.toml 配置文件。

6. 环境终极验证

核心目标:跑通一个标准的 Foundry 项目,确保所有链路正常。

6.1 初始化项目

mkdir demo_contract
cd demo_contract
forge init

6.2 编译与测试

forge build
forge test

6.3 判定标准

  • 如果终端输出了绿色的 [PASS] 字样,恭喜!您的企业级 Solidity 开发环境已完美就绪。

7. Web3 项目自动化

7.1 脚本源代码

Windows下新建FoundryManager.bat,修改BASE_DIR路径,再粘贴修改后脚本:

@echo off
setlocal enabledelayedexpansion

:: ====================================================
:: 配置区域
:: ====================================================
set "LINUX_USER=cx770"
set "BASE_DIR=/home/%LINUX_USER%/solidityCode"

echo ========================================
echo     Web3 Solidity Project Manager (V15)
echo ========================================

:: 1. 交互询问
set /p "choice=是否创建新项目? (y/n): "

if /i "%choice%"=="y" (
    set /p "proj_name=请输入无空格和非法字符的项目名称: "
    
    :: --- 安全锁:检查目录是否存在 ---
    wsl -u %LINUX_USER% bash -c "if [ -d \"%BASE_DIR%/!proj_name!\" ]; then exit 100; fi"
    
    if !errorlevel! equ 100 (
        echo.
        echo [警告] 文件夹 '!proj_name!' 已存在!
        set /p "reopen=为防止代码被覆盖,已停止初始化。是否直接打开该旧项目? (y/n): "
        if /i "!reopen!"=="y" (
            set "TARGET_PROJ=!proj_name!"
            goto OPEN_PROJ
        ) else (
            echo 已取消。
            pause
            exit /b
        )
    )

    echo [状态] 正在进入 Linux 初始化新项目...
    
    :: --- 核心初始化逻辑 ---
    :: 修复点:确保 .last_project 写入时不带多余空格或换行
    wsl -u %LINUX_USER% bash -l -c "rm -rf \"%BASE_DIR%/.last_project\" && mkdir -p \"%BASE_DIR%/!proj_name!\" && cd \"%BASE_DIR%/!proj_name!\" && $HOME/.foundry/bin/forge init && [ -f foundry.toml ] && echo -n \"!proj_name!\" > \"%BASE_DIR%/.last_project\""
    
    if !errorlevel! neq 0 (
        echo.
        echo [错误] 项目创建失败!可能原因:网络超时或路径非法。
        echo [建议] 请在下方的终端中手动尝试输入: forge init
        wsl -u %LINUX_USER% --cd "%BASE_DIR%/!proj_name!" bash -l
        pause
        exit /b
    )
    
    set "TARGET_PROJ=!proj_name!"

) else (
    :: --- 核心修复:获取历史记录逻辑 ---
    :: 使用 head -n 1 确保只读取第一行内容,忽略文件末尾的空行干扰
    set "TARGET_PROJ="
    for /f "tokens=*" i"
    )
    
    :: --- 逻辑跳转:未发现历史记录时返回基础目录 ---
    if "!TARGET_PROJ!"=="" (
        echo.
        echo [提示] 未发现有效的历史记录。
        echo [状态] 正在为您打开基础工作目录: %BASE_DIR%
        set "TARGET_PROJ=."
        pause
        goto OPEN_PROJ
    )
)

:OPEN_PROJ
:: 判断是进入具体项目还是基础目录
if "!TARGET_PROJ!"=="." (
    echo [状态] 正在唤起 VS Code: %BASE_DIR% ...
    wsl -u %LINUX_USER% --cd "%BASE_DIR%" code .
    echo [完成] 基础目录终端已就绪。
    wsl -u %LINUX_USER% --cd "%BASE_DIR%" bash -l
) else (
    echo [状态] 正在唤起 VS Code: !TARGET_PROJ! ...
    wsl -u %LINUX_USER% --cd "%BASE_DIR%/!TARGET_PROJ!" code .
    echo [完成] 项目终端已就绪。
    wsl -u %LINUX_USER% --cd "%BASE_DIR%/!TARGET_PROJ!" bash -l
)

7.2 VScode编码合规

为了确保合约代码在特定环境下正确识别,请严格执行以下手动编码保存步骤:

  • 7.2.1 定位编码状态栏:在 VS Code 编辑器界面的右下角,找到显示当前编码(如 UTF-8)的区域并点击。

  • 7.2.2 触发保存动作:在编辑器顶部弹出的命令菜单中,选择 Save with Encoding(通过编码保存)。

  • 7.2.3 选择目标编码:在列表中搜索并选择 Simplified Chinese (GB2312)

  • 7.2.4 注意事项:执行此操作会改变文件的磁盘写入编码。在执行 forge build 前,请确保代码逻辑已完成且保存状态为 LF(行尾序列)。

7.3 使用方法与工作流

  • 7.3.1 极速启动逻辑:双击 .bat 文件后,直接输入项目名即可完成“目录创建 框架初始化 VS Code 唤起”的闭环。

  • 7.3.2 历史跳转:若只需继续开发上一个项目,运行脚本后输入 n,脚本会读取 .last_project 记录并自动定位开启。

  • 7.3.3 终端协同原则

    • 管理器终端:即运行 .bat 的黑窗口,初始化成功后应将其最小化作为环境备份。

    • 生产终端:在 VS Code 内部使用 Ctrl + ~ 开启,负责所有的 forge 编译、测试与交互任务。