智能合约开发工具Remix
不久前,我在B站、视频号和 YouTube 都陆续发布了新的一套免费视频课程《智能合约开发工具Remix》,总共分为了 9 个小节的视频,以下分别是这 9 个小节在 B 站的视频链接,喜欢直接看视频的伙伴可以去 B 站观看:
- 概况
- 文件浏览器
- remixd
- Git插件
- 编辑器
- 编译器&AI工具
- 部署&发交易
- 调试器
- 单元测试
也可以在 B 站直接搜索「Keegan小钢」找到我,可以看到我目前发布的所有视频课程。截止到当前,我总共已经发布了 5 个视频合集:
- 转型Web3开发第一课
- 转型Web3开发第二课
- Web3 Dapp开发学习路线图
- Solidity编码规范
- 智能合约开发工具Remix
而对于智能合约开发工具Remix这套课程,下面我再对每一节的视频,罗列出一些重点内容。
1. 概况
这一小节主要介绍了Remix的基本概况。
首先,记住 Remix 的正确域名是 https://remix.ethereum.org,避免被钓鱼。
其次,官方支持的浏览器只有 Firefox, Chrome, Brave 这三款而已,其他浏览器也许可以用,但不保证使用过程中会出现问题。
Remix 整个页面的布局主要分为了:
- 图标面板:放置各种插件图标
- 侧边面板:插件所显示的内容面板
- 主面板:主页和编辑器面板
- 终端:输出交易记录和日志等信息
默认插件有:文件浏览器、全文搜索、编译器、部署&发交易、Git。可以通过插件管理器添加和移除其他插件,常用的包括 Remixd、调试器、单元测试插件等。
切换不同插件时,侧边面板就会展示对应插件的内容页面。
2. 文件浏览器
文件浏览器插件,顾名思义,就是管理文件的。
第一个要熟悉的就是 Workspace,即工作空间,每一个工作空间就是一个项目。
有多种方式可以用来创建一个新的工作空间。可以创建一个空的工作空间,也可以基于模板创建,Remix 提供了很多模板。还可以通过克隆一个 Git 仓库的方式来创建。
可以创建多个不同的工作空间,也可以在不同的工作空间之间进行切换。
还可以对工作空间进行重命名、下载、删除、备份、恢复等操作。还可以通过 Remixd 插件连接到本地文件系统,关于 Remixd 部分则在第 3 小节中有详细介绍。
在工作空间下,也支持多种操作,除了直接创建文件和文件夹之外,还可以将本地文件系统的文件和文件夹加载上传到当前工作空间,也可以从 IPFS 或 https 方式导入文件。最后,还可以将当前工作空间初始化为一个 Git 项目。
3. remixd
默认情况下,Remix 里添加的文件是存储在浏览器自带的数据库 IndexedDB 里的,而浏览器数据库的存储并不是永久性的存储,所以建议增加其他文件备份和存储方案。使用 Remixd 把文件存储到本地的文件系统里就是其中一种推荐的方案。
要使用 remixd,需要在你的本地系统里先安装 remixd 命令行工具,可通过执行以下 npm 命令来安装:
npm install -g @remix-project/remixd
本地连接到 Remix 时,为了保证正常使用,要确保 remixd 已经更新到最新版本。可通过 remixd -v
或 remixd --version
命令查看 remixd 的版本。如果版本还不是最新的,可直接通过以上安装命令升级更新到最新版本。
安装好 remixd 后,下一步可通过执行以下命令来启动 remixd:
remixd -s -u https://remix.ethereum.org
其中, 需要更换成你要连接的本地目录,比如,我要连接到 ./shared_project
目录,则实际执行的命令如下:
remixd -s ./shared_project -u https://remix.ethereum.org
启动成功后,在 Remix 里就可点击 “Connect to Local Filesystem” 打开确认连接到本地的弹出窗口,再点击 “Connect” 按钮就可建立连接了。
连接成功后,就会创建一个新的工作空间,与本地连接的目录相同。在 Remix 里对该工作空间的任何操作,都会同步到本地连接的目录中。同样的,对本地目录下的文件修改,也会同步到 Remix 里的工作空间里。
在本地执行 remixd 的终端窗口里,使用 ctrl-c
就可以关闭 remixd 了,也意味着断开了与 Remix 的连接。
4. Git插件
使用 Git 插件把 Remix 工作空间里的文件修改同步到 Git 远程仓库,也是推荐的另一种文件存储方案。
那要使用 Git,第一步需要先设置 Github 账号。进入 Git 插件面板,打开 GITHUB SETUP 选项卡,有两种设置方案:一是 Login with GitHub,会教你用三步骤来连接你的 Github 账号;二是手动输入你的 Git 用户名、邮箱和 Github token。
设置好 Github 账号之后,可以通过当前 Git 插件面板的 Initialize repository 按钮把当前工作空间初始化为 Git 项目。也可以创建一个新项目并勾选 ”Initialize workspace as a new git repository“。
当前工作空间变成一个 Git 项目之后,Git 插件面板所展示的选项卡也会多了很多。所有选项卡为:
- SOURCE CONTROL:主要是做提交和同步操作
- COMMANDS:可以执行 pull、push 和 fecth 操作
- COMMITS:展示每一次提交
- BRANCHES:用于创建分支、切换分支等
- REMOTES:管理远程仓库地址
- CLONE:克隆操作
- GITHUB SETUP:设置Github
- LOG:日志
完成了上一步的初始化之后,下一步需要设置远程仓库地址,在 Git 插件面板里的 REMOTES 选项卡里进行设置。
设置完之后,就可以对项目进行编码修改了,完成修改后。可通过 SOURCE CONTROL 添加 Commit
后执行 Sync Changes
,就完成把代码推送到远程仓库了。
5. 编辑器
Remix 的编辑器,是和 VS Code 使用的同一款编辑器。其支持 Solidity、JS 和 TS 三种语言的代码高亮。
默认情况下,有三个特性很有用:
- 代码自动补全
- 展示 gas 预算
- 展示错误提示
编码时,对于关键字和已声明的变量、函数名等都会有自动补全和提示功能。
对于每个函数,在函数右侧则会展示该函数的 gas 预算。
而对于代码中的 error 和 warning 则会用不同颜色的波浪线标记出来。
这几个特性都可在设置中进行开启或关闭,默认就是开启的。
另外,在编辑器中打开右键菜单,还可看到一个 ”Format Code“ 的选项,可以对当前代码进行代码风格格式化,使其符合代码规范,这一点也很方便。
6. 编译器&AI工具
编译器可以结合AI工具一起使用,比较方便。
编译器面板很简单,首先,可以选择编译器的版本,从 0.1.1 到最新版本全都有。其次,建议勾选上 “'Auto compile” 选项,则代码变更后会自动编译。然后,打开 ”Advanced Configuration“,建议把 ”Enable optimization“ 也给勾选上,值设为默认的 200 即可。
当代码里出现 error
和 warning
时,在编译器面板里也会显示出这些错误提示信息,且在每个错误提示信息下面会有个 ”Ask RemixAI“ 的按钮,点击它,RemixAI 会针对该错误提示给出相应的回答,展示在终端面板里。
另外,在主面板左上角有个机器人的小图标,点击该小图标右边的切换按钮,还可启用 RemixAI Copilot。启用之后,能够增强代码自动补全的功能。比如,启用 RemixAI Copilot 后,进行 import 时,会自动显示出可导入的合约,包括第三方库如 @openzeppelin
和 @uniswap
,这一点非常方便。再比如,当你要定义一个函数时,输入完 function
后,也会给你提示可能想实现的函数声明,按 tab
键就可以自动补全整个函数声明,然后再根据自己实际要实现的代码进行调整即可。
编译器面板上有两个编译按钮,背景蓝色的按钮就只是编译合约文件,而灰色背景的 “Compile and Run script” 按钮则会在编译完成后自动执行指定的脚本文件。前提是在合约文件头部需要有声明 @custom:dev-run-script
的注解,并指定了要执行的脚本文件。比如,示例中的 Storage
合约的注解为@custom:dev-run-script ./scripts/deploy_with_ethers.ts
,声明了 deploy_with_ethers.ts
脚本文件,该文件用 ethers
编写了部署 Storage
合约的脚本。那点击 “Compile and Run script” 按钮后,编译完 Storage
合约后,就会自动执行 deploy_with_ethers.ts
脚本,完成 Storage
合约的部署,部署成功的合约地址会在终端中打印出来。
在编译器面板最后有 ABI 和 Bytecode 两个选项,可以复制当前合约的 ABI 和 Bytecode,前端和后端需要和合约交互时就需要用到。
7. 部署&发交易
部署&发交易插件,先说部署。
第一步,选择部署的环境,即合约要部署的网络环境。默认下拉列表中有多个选项,点击列表中最后一项 “Customize this list…" 可以打开所有网络环境的列表。下面就只介绍最常用的几个。
- Injected Provider - MetaMask:直接连接你浏览器中的 MetaMask 钱包,你的 MetaMask 钱包当前连接到哪个网络环境就使用哪个环境,钱包账户也是直接使用你的 MetaMask 账户。
- Remix VM (Cancun):默认的内嵌浏览器的一个沙箱网络,并提供了 15 个默认账户,每个账户有 100 ether。
- Remix VM - Mainnet fork:fork 自主网的浏览器沙箱网络,也提供了 15 个默认账户,每个账户有 100 ether。
- WalletConnect:通过 WalletConnect 连接钱包
GAS LIMIT 部分一般直接选择默认的 Estimated Gas
即可,无需自定义数值。
VALUE 即需要转给合约的原生代币金额,即 msg.value
的值。
CONTRACT 里可选择要部署的合约,一般默认就是当前合约。
Deploy 就是部署按钮了,如果合约构造函数存在参数,则部署按钮旁边会显示出输入框,以输入参数。
部署成功后,在最下面的 Deployed Contracts 会展示出所部署合约的选项卡,打开它可以和合约进行交互。其中,蓝色背景的按钮是可读函数,橙色背景的按钮则是写函数。
还有个 At Address 按钮,也可用于加载合约到 Deployed Contracts 列表里进行合约交互。使用 At Address,有两种方式,一是CONTRACT 里选择要加载的合约代码,不一定需要完整合约代码,就算是只有 interface
也行;另一种方式,则是加载 abi
文件,视频里就使用了 IERC20.abi
作为示例演示。
8. 调试器
调试器插件,顾名思义,就是 Debug 用的。
有两种方式可以启动 Debug。第一种方式,直接在调试器面板中输入交易哈希,如果代码有 verify 的话,Remix 会尝试从 Sourcify 或 Etherscan 获取源代码。第二种方式,也是更常用的方式,则是通过部署&发交易插件发起的交易,在终端里显示出每一笔交易时,右侧有个 Debug 按钮,点击该按钮就可启动 Debug 了。
Debug 时的基本操作有:
- Step into:单步前进到下一个操作码,如果有子函数调用则会进入子函数
- Step back:单步回退到上一个操作码
- Step over forward:单步前进到下一个操作码,如果有子函数调用则不会进入子函数
- Step over back:单步向后回退到上一个操作码,如果有子函数调用则不会进入子函数
- Jump to next breakpoint:跳转到下一个断点
- Jump to brev breakpoint:跳转到上一个断点
- Jump out:跳出
- Stop debuging:停止调试
面板中会展示出很多信息,最核心的就是操作码面板,会显示当前执行到第几步和对应的操作码。
另外,还有以下子面板:
- Function Stack:函数栈
- Solidity State:显示合约的状态变量
- Solidity Locals:局部变量,包括函数参数
- Step details:当前操作码的详细信息
- Call Stack:调用栈
- Full Storage Changes:显示函数末尾的持久化存储
- Stack:EVM 栈
- Call Data:包含了函数参数的 calldata
- Memory:内存面板
- Storage:持久存储面板
- Return Value:返回值
- Global Variables:全局变量
我在实际测试时,其实这些面板通常展示的信息并不全,比如,Solidity State 面板并没有显示出状态变量,Solidity State 也没有显示出全部局部变量,Return Value 也并没有显示出返回值。
9. 单元测试
最后一个插件,单元测试插件。
Remix 的单元测试插件支持的是 solidity 语言编写的单元测试用例代码。其用来声明断点的库文件是 remix_tests.sol
,其中定义了 Asset
库,以及有多个 equal
、notEqual
、greaterThan
、lessThan
等函数。另外,还有一个 remix_accounts.sol
文件,其定义了 TestsAccounts
库,可通过其 getAccount
函数获取测试账户。
单元测试用例函数通常是以 checkXXX
命名的。另外,还有四个特殊函数:
beforeEach()
- 会在每个单元测试用例之前执行beforeAll()
- 会在所有单元测试用例之前执行,只执行一次afterEach()
- 会在每个单元测试用例之后执行afterAll()
- 会在所有单元测试用例之后执行,只执行一次
编写单元测试时,还可以通过添加注解 #sender: account-{N}
和 #value: {N}
来指定 msg.sender
和 msg.value
,如下所示:
/// #sender: account-0
/// #value: 10
function checkSenderIs0AndValueis10 () public payable {Assert.equal(msg.sender, TestsAccounts.getAccount(0), "wrong sender in checkSenderIs0AndValueis10");Assert.equal(msg.value, 10, "wrong value in checkSenderIs0AndValueis10");
}
在单元测试插件面板中,还可以通过点击 Generate 按钮来自动生成测试文件。
点击 Run 按钮,则会开始执行单元测试了。如果存在多个文件的情况下,也可以勾选要执行哪些测试文件。
相关文章:
智能合约开发工具Remix
不久前,我在B站、视频号和 YouTube 都陆续发布了新的一套免费视频课程《智能合约开发工具Remix》,总共分为了 9 个小节的视频,以下分别是这 9 个小节在 B 站的视频链接,喜欢直接看视频的伙伴可以去 B 站观看: 概况文件…...

YYF桌面 1.2 | 个性化桌面体验,清爽美观。
YYF桌面是一款经过定制的安卓桌面启动器,此版本基于1.2版本进行了一系列个性化修改。主界面快捷图标进行了美化处理,并采用了清爽半透明的图标背景。取消了底部快捷键,并重新制作了“全部应用”按钮,保留了动态效果。修改了右上角…...

【人工智能/计算机工程/大数据】第五届人工智能与计算工程国际学术会议(ICAICE 2024,2024年11月8-10日)
The 5th International Conference on Artificial Intelligence and Computer Engineering 第五届人工智能与计算工程国际学术会议(ICAICE 2024) 会议官网:www.event-icaice.org The 5th International Conference on Artificial Intellige…...
uni-app录音功能
纯纯干货,cv即用 <template><!-- 录音页面 --><view class"page"><view class"tape_box"><view class"upload_box1"><view class"upload_top"><view class"upload_img_title…...

C语言【调试】(个人笔记版)
调试 前言一、Bug二、调试工具1.DeBug2.Release 三、调试快捷键1、断点 四、调试时查看程序的当前信息1、查看临时变量2、查看内存3、查看调用堆栈、汇编、寄存器 总结 前言 这篇文章大都是我的个人笔记: 调试在日常程序设计中是很重要的。调试说白了就是为了解决代…...

连锁收银系统
商淘云连锁管理系统助力连锁企业实现“人货账”全方位数字化管理,它依托连锁品牌进销存管理实现门店订货、线下收银、线上商城、会员营销等一体化管理。 门店订货补货支持连锁直营、加盟 不同门店不同进货价、不同门店不同商品、不同门店在线或者账期支付、门店PC或…...
5.2024.10.21
2024.10.21 学习和复习 学习QT的流程控制、函数、内联函数复习C语言printf练习 问题及解决方案 C学到函数之后有些吃力代码逻辑能力不大行,需要巩固一下C语言基础再挤多点时间去学习嵌入式写代码前先把大概思路写出来 碎碎念 最近作业比较多,有点静不下…...
前端Socket互动小游戏开发体验分享
随着实时网络通信技术的不断发展,基于WebSocket的前端互动小游戏成为了一种非常流行的选择。WebSocket允许客户端和服务器之间进行双向通信,为游戏互动带来了更快的响应时间和更流畅的体验。本文将通过一个简单的互动小游戏来探讨前端如何利用WebSocket技…...
react项目,通过自定义 separator 属性来修改日期选择器中间的分隔符:
1. 引入必要的依赖 确保你已经引入了 DatePicker 组件和 moment 库。 import React, { Component } from react; import { DatePicker } from antd; import moment from moment; const { RangePicker } DatePicker; const dateFormat "YYYY/MM/DD"; 2. 定义父组…...

双十一有啥好用的家居好物推荐?2024性价比高的超声波清洗机推荐
双十一今天晚上就可以越热开抢了,还不知道购买什么物品的小伙伴们赶紧来看看我这篇文章,在众多家居好物中,超声波清洗机以其高效、便捷的特点,成为了许多家庭的必备神器。2024年,市场上涌现出了不少性价比超高的产品&a…...

比亚迪车机安装第三方应用教程
比亚迪车机安装第三方应用教程 比亚迪车机U盘安装APP, 无论是dlink3.0还是4.0都是安卓系统,因此理论上安卓应用是都可以安装的,主要就是横屏和竖屏的区别。在比亚迪上安装软件我主要推荐两种方法。 第一种,直接从电脑端下载安装布…...

移动零---双指针法
目录 一:题目 二:算法原理讲解 三:代码编写 一:题目 题目链接:https://leetcode.cn/problems/move-zeroes/description/ 二:算法原理讲解 三:代码编写 void moveZeroes2(vector<int>& nums) {for (int d…...

MoeCTF 2024 ---Misc方向WP
安全杂项 signin 题目描述: xdsec的小伙伴们和参赛者来上课,碰巧这一天签到系统坏了,作为老师的你,要帮他们 教师代签。 特殊提醒:luo同学今天好像在宿舍打游戏,不想来上课,这是严重的缺勤行为…...

【我的 RT 学习手札】信息收集
相关笔记整理自B站up主泷羽sec全栈渗透测试教学(免费) 视频链接为泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频 笔记只是方便师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线࿰…...
CMake变量:CMAKE_FIND_LIBRARY_SUFFIXES
CMAKE_FIND_LIBRARY_SUFFIXES是CMake中的一个变量,用于指定在查找库文件时使用的后缀列表。当CMake需要找到库文件时,它会尝试在这些后缀后添加库名来构建库文件的完整路径。例如,如果库名为mylib,并且CMAKE_FIND_LIBRARY_SUFFIXE…...

在使用 RabbitMQ 作为消息代理时,多个 Celery 实例(或应用)可以共享同一个 RabbitMQ 实例
在使用 RabbitMQ 作为消息代理时,多个 Celery 实例(或应用)可以共享同一个 RabbitMQ 实例。这样做可以简化基础设施管理,同时允许不同的 Celery 应用之间进行消息传递和协作。下面是如何配置多个 Celery 实例以使用同一个 RabbitM…...
ARM在嵌入式开发中的作用有哪些?
ARM在嵌入式开发中的作用主要体现在以下几个方面: 架构优势: ARM架构基于RISC(精简指令集计算机),具有精简而高效的指令集,适合资源受限的环境。低功耗设计使得ARM处理器在移动设备和嵌入式系统中非常受欢…...

-webkit-box-orient属性丢失?
在实际项目场景当中,我们经常会遇到需要对超长文本溢出省略的场景: 我们经常会这样写—— 单行省略: overflow: hidden; //文本溢出隐藏text-overflow: ellipsis; //文本溢出显示省略号white-space: nowrap; //不换行 多行省略:…...

openKylin系统SSH服务配置结合cpolar轻松实现开放麒麟远程连接
前言 本文主要介绍如何在openKlyin系统中设置ssh连接,并结合cpolar内网穿透工具实现远程也可以ssh连接本地局域网内部署的openKlyin系统. openKylin是中国首个基于Linux 的桌面操作系统开发者平台,通过开放操作系统源代码的方式,打造具有自…...

我的世界之合成
合成(Crafting)是一种在Minecraft中获得多种方块、工具和其他资源的方法。合成时,玩家必须先把物品从物品栏移入合成方格中。22的简易合成方格可以直接在物品栏中找到,而33的合成方格需要使用工作台或合成器来打开。 目录 1合成系…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...

CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...