Solidity
基础变量的定义或语法的使用还不太了解,又不想花太多的时间去看视频教程,那么结合文档进行学习会是一个更不错的选择Foundry
框架进行 Solidity
智能合约开发必须要阅读的资料,同时当你真正开始构建生产级别应用时,可以在其中找到很多我并未在提及到的开发技巧和解决错误的方法北京大学肖臻老师的《区块链技术与应用》公开课: 课程内容主要是讲解以太坊和比特币的底层原理,虽然肖臻老师录制该课程的时间为 2018 年,但是课程容并不过时,其中涉及到编程的内容很少,大多数都是对区块链的认真看完会帮助你打下非常坚实的理论基础
B站:梁培利老师 个人空间的所有关于区块链的课程: 成都信息工程大学区块链工程专业教师的课程录制,没有接触过区块链的朋友建议从这位老师的课程开始看,比北大肖臻老师的课程内容更新一些,内容覆盖面也更广
B站 up主:五里墩茶社的《跟我学Solidity》系列这是我看过讲解 Solidity
最为详细的中文教程博主,从最基础的知识一直讲到实际的合约编写,所有使用 Solidity
开发智能合约,需要的基础知识都囊括其中了,其视频配套使用的 WTF 学院
发布的一系列区块链相关课程我在上面也有提到,输入入门必看系列!!!
Solidity
的相关基本知识,接下来应该开始学习框架从而进入到实际开发中,目前主流的 Solidity
开发框架有两个: Hardhat
与 Foundry
,这两个课程都是由 Patrick Collins
老师讲授的,
Patrick Collins
老师讲授,此外,还有更为详细的智能合约审计相关课程由 Owen
老师讲授。
入门基本的智能合约安全审计课程:2024年智能合约安全审计课程(第1-5课)
进阶的智能合约安全审计课程: 21 小时智能合约安全审计课程(基础知识+案例实战)Tips: 不要将错误代码整段整段的复制到对话框中,这样搜索引擎通常会无法检索到正确的信息
### 我不推荐新手朋友在学习的过程中使用 Copilot,Copilot 会自动帮你完成很多本应你自己完成的代码,相信我,自己跟着视频教程敲一遍代码,一定能让你学到更多
Mumbai
, 后来改为了 Amoy
.toml
文件主要用于便捷查看 foundry.toml
文件Ethereum Unit Converter: 以太坊的单位转换工具,因为实际在 Solidity 中编程,默认的计量单位为 Wei, 与 ether 之间存在 10 ** 18 的换算,编程时不确定换算是否正确可以使用此工具进行核验
OpenZeppelin官网: 内有 Solidity 中最全的标准库,官方文档中包含不同操作系统的安装方式,以及查看标准库中一些合约的源代码,同时主页有一个简易的合约定制工具,可以快速生成 ERC-20, ERC-721 等合约的模板
Alchemy: 在一定限额内免费的多条公链 API 的工具,同时也支持实时数据分析以及交易监听的
Infura: 与 Alchemy 提供的服务差不多,选自己用的顺手的就行
@TODO 这部分内容还有很多学习资料,后面有时间了抽空补上…
Code4rena: 相较于其他两个,我个人比较喜欢的平台,可以很方便的查看过往比赛的审计报告,数量很多,选择自己感兴趣的报告查看学习即可。同时也有不定期的公开审计比赛,没有什么门槛限制,有闲暇时间可以参与一下,看看自己的审计能力
Immunefi: 审计比赛平台,同时也有一些合约安全审计的学习资料
Sherlock: 审计比赛平台,比赛也很多
CodeHawks: Cyfrin 官方推出的审计平台,主要是以其过往的审计报告为主,赏金较少
https://web3.career/
https://remote3.co/
https://remoteok.com/
https://cryptojobslist.com/
https://www.useweb3.xyz/
https://www.cryptojobs.com/
https://blockchain.works-hub.com/
https://abetterweb3.notion.site/abetterweb3-7ce334dcf8524cb79a5894bdd784ddb4
git
所需的环境
git --version
,如果安装成功则显示 git version x.x.x
,截止 2024 年 11 月,当前我使用的版本为 2.39.5
。node
运行所需的环境
node -v
如果安装成功则显示 node version x.x.x
,截止 2025 年 1 月,当前我使用的版本为 22.12.0
。然后运行 npm -v
,查看 npm
包管理器的版本,截止 2025 年 1 月,当前我使用的版本为 10.9.0
,如果需要更新 npm
的版本,可以运行 npm install -g npm
Rustup
: Foundry 运行必须的环境时
rustc --version
,如果安装成功则显示 rustc x.x.x
,截止 2025 年 1 月,当前我使用的版本为 rustc 1.83.0 (90b35a623 2024-11-26)
HomeBrew
, 很好用的包管理工具
brew --version
,如果安装成功则显示 Homebrew x.x.x
,截止 2025 年 1 月,当前我使用的版本为 Homebrew 4.4.14
Foundry
forge --version
,如果安装成功则显示 forge x.x.x
,截止 2025 年 1 月,当前我使用的版本为 forge 0.3.0 (5a8bd89 2024-12-20T08:45:53.204298000Z)
15.1.7
。
npx create-next-app@latest
初始化一个 Nextjs 项目,并根据自己的需求选择所需要的附加插件npm install -D tailwindcss npx tailwindcss init
,然后根据官网文档进行配置安装Ethers: 用于前端与合约之间的交互(新手更推荐 Ethers)
安装Wagmi: 用于前端与合约之间的交互
npm init @rainbow-me/rainbowkit@latest
anvil
节点anvil
anvil
非常好用,结合 cast
基本可以在本地完成全部的链上操作
这将默认在本地节点部署智能合约。为了成功部署,你需要在另一个终端中运行 anvil
。
forge compile
需要注意的是,确保你合约内标注的 solc
版本与安装的版本一致,如果你想指定特定的编译器版本,可以在 foundry.toml
中使用
solc-version = ["0.x.x"]
进行设置
编译合约并在本地生成字节码和 ABI
文件
forge build
这将默认在本地节点部署智能合约。为了成功部署,你需要在另一个终端中运行 anvil
。
必须要提的是,当前的 Foundry
不需要编写部署脚本进行合约部署,可以使用 forge create
命令进行快速部署,具体代码如下
forge create <contract_address> --constructor-args <args> --private-key <private_key> --rpc-url <rpc_url>
CheatCodes
vm.prank()
: 模拟一个不同的交易发起者,即将当前交易的发送者地址更改为 _sender
function prank(address _sender) public;
vm.deal()
: 将指定数量的以太币 _amount
发送到 _recipient
地址
function deal(address _sender) public;
vm.addr()
: 指定一个私钥来返回与之对应的以太坊地址
function addr(uint256 privateKey) external returns (address);
vm.hoax()
: 模拟地址并且向其中存入指定数量的以太币,可以认为是 prank
和deal
的结合
function hoax(address _sender, uint256 _amount) public;
vm.roll()
: 模拟链上的区块高度,允许将区块号设置为 ` _blockNumber`
function roll(uint256 _blockNumber) external;
vm.warp()
: 模拟区块时间,将当前的区块时间(block.timestamp)设置为 _timestamp
function warp(uint256 _timestamp) external;
vm.expectRevert()
: 设置一个断言,期望下一次的操作会 revert,如果操作没有 revert,则测试失败。
function expectRevert(bytes memory _data) public;
vm.expectEmit()
: 检查事件是否被正确地发出,可以选择检查最多四个事件的主题
function expectEmit(
bool checkTopic1,
bool checkTopic2,
bool checkTopic3,
bool checkData,
address emitter
) external;
vm.setBlockGasLimit(uint _gasLimit)
: 设置当前区块的 gasLimit
function setBlockGasLimit(uint _gasLimit) public;
cast
与合约进行交互cast send
和 cast call
与智能合约进行交互,详细用法可以在 Foundry 官方文档 - cast 概览中找到