Windows wsl智能合约编程环境搭建

下载wsl(windows子系统)

运行

1
wsl --install

但是似乎不能正常启动
会报
0x80004002之类的错误
查了一下针对我遇到的这类错误运行

1
2

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

即可,在后来使用的时候也遇到了无法启动的问题,似乎是因为windows更新把子系统的组件删掉了,需要
在任务面板中打开程序在windows服务中选择子系统相关的选项即可

vscode编程环境搭建

连接wsl

可以在vscode中ctrl+shift+p创建wsl窗口
或者在wsl中输入code .
即可拥有liunx命令行版的vscode

子系统虚拟环境搭建

然后配置wsl中的nvm环境
首先在创建好的文件夹里执行

1
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh

然后重启wsl即可查看nvm版本

然后执行

1
nvm install nodejs的版本号

安装js即可

代码格式化工具

再vscode中下载solidity+hardhat(现在改名了变成了solidity一个黄色的以太坊图标)
它可以使代码高亮
然后再安装一个格式化文件prettier
并且配置json文件(ctrl+shift+p选择open setting json)
在上一条语句后面加上逗号:
把以下语句加入

1
2
3
4
5
6
7
8
9
10
11
12

    "[solidity]": {

        "editor.defaultFormatter": "NomicFoundation.hardhat-solidity"

    },
   
    "[javascript]": {

        "editor.defaultFormatter":"esbenp.prettier-vscode"

    },

即可实现vs自动格式化
当然除此之外还需要打开open user setting
配置format on save 和default format

同样prettier也可以将solidity格式化而不一定要使用hardhat
可以通过
yarn add prettier prettier-plugin-solidity
安装prettier的solidity插件然后在项目文件夹中创建一个.prettierrc文件,然后输入

1
2
3
4
5
6
7
8
9
{
/* prettier的配置 */
"prettier.printWidth": 100, // 超过最大值换行
"prettier.tabWidth": 4, // 缩进字节数
"prettier.useTabs": false, // 缩进不使用tab,使用空格
"prettier.semi": true, // 句尾添加分号
"prettier.singleQuote": true, // 使用单引号代替双引号
//这里只是示例更多相关设置可以自行查询
}

包管理器

需要安装安装yarn,运行命令corepack enable即可
然后获取solc
运行 yarn add solc或者npm类命令也可
yarn add solc@0.8.0可指定solc的版本
yarn global add solc即可全局安装

然后运行

1
2
yarn solcjs --bin --abi --include-path node_modules/ --base-path . -o . simple-storage.sol
//注意哈,这里的simple-storage.sol是目录下的文件名

编译simple-storage.sol得到编译后的文件

同时可以将这个脚本加入到

即可使用

1
2
yarn compile 

快速编译

虚拟链上环境

ganache

这里选择ganache在windows上安装,当然也可以直接选择在子系统上安装
下面是转自github上大佬对相关问题的解决

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
**选项 1:如果您想在 WSL 本身上安装和运行 Ganache👇**

1. 在 WSL 上安装 Ganache
`yarn add ganache`

2. 运行甘纳许
`yarn run ganache`

3. 从终端屏幕底部 复制 RPC URL ( **127.0.0.1:8545 ),上面写着****RPC listening on 127.0.0.1:8545**
并将其粘贴到 ethers.js JsonRpcProvider( ) 函数参数中。

4. 还要在终端屏幕上滚动时复制任何**私钥,并将其粘贴到 ethers.js Wallet( ) 函数参数中。**

5. 现在让这个终端在后台运行,因为我们希望 Ganache 服务器运行。
因此,打开一个**新终端** 并通过运行以下命令来运行 deploy.js 文件:
`node deploy.js`


**选项 2:如果您想在 Windows 上运行 Ganache(如果您已经在 Windows 上安装了 Ganache)👇**

1. 转到 Ganache Windows GUI 右上角的设置(齿轮图标)。
移至**服务器**选项卡并将**主机名**更改为**WSL**(我的也适用于 VirtualBox 和 WiFi)
端口号和网络 ID 可以保持安全。

2. 单击UI 右上角的**保存并重新启动。**

3. **现在从RPC 服务器**复制 RPC URL 并将其粘贴到 ethers.js JsonRpcProvider() 函数参数中。

4. 同时复制任何**私钥**并将其粘贴到 ethers.js Wallet( ) 函数参数中。

5. **重要步骤(防火墙设置)**:
转到Windows 上**具有高级安全性的 Windows Defender 防火墙。**
单击**Inbound Rules** & Search for Ganache
右键单击​​ Ganache & Go to **Properties**。**然后选中显示允许连接的**
复选框并单击应用。并关闭此防火墙窗口。

6. 通过在 WSL 终端窗口中运行以下命令来运行 deploy.js 文件:
`node deploy.js`


非常感谢所有回答并提出疑问的人。✌

虽然我在这个地方卡了很久但是最后解决的时候发现并没有那么麻烦,
在网络选择上直接选择主机所处的网段地址即可,最大的问题还是各个包的版本问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{

  "dependencies": {

    "dotenv": "^16.3.1",

    "ethers": "5.6.2",

    "fs-extra": "^11.1.1",

    "ganache": "^7.9.0",

    "solc": "0.8.8"

  },
  //非唯一正确版本,仅供参考

此外附上linux的ganache相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-a 或 –accounts:指定启动时要创建的测试账户数量。
-e 或 –defaultBalanceEther:分配给每个测试账户的 ether 数量,默认值为 100。
-b 或 r –blockTime:指定自动挖矿的blockTime,以秒为单位,默认值为 0,表示不进行自动挖矿。
-d 或 –deterministic:基于预定的助记词(mnemonic)生成固定的测试账户地址。
-n 或 –secure:默认锁定所有测试账户,有利于进行第三方交易签名。
-m 或 –mnemonic:用于生成测试账户地址的助记词。
-p 或 –port:设置监听端口,默认值为8545。
-h 或 –hostname:设置监听主机,默认值同 NodeJS 的 server.listen()。
-s 或 –seed:设置生成助记词的种子。
-g 或 –gasPrice:设定 Gas 价格, 默认值为 20000000000。
-l 或 –gasLimit:设定 Gas 上限,默认值为 90000。
-f 或 –fork:从一个运行中的以太坊节点客户端软件的指定区块分叉,输入值应当是该节点旳 HTTP 地址和端口,例如 http://localhost:8545。可选使用 @ 标记来指定具体区块,例如:http://localhost:8545@1599200。
-I 或 –networkId:指定网络 id,默认值为当前时间,或使用所分叉链的网络 id。
–db:设置保存链数据的目录,如果该路径中已经有链数据,ganache-cli 将用它初始化链而不是重新创建。
–debug:输出 VM 操作码,用于调试。
–mem:输出 ganache-cli 内存使用统计信息,这将替代标准的输出信息。
–noVMErrorsOnRPCResponse:不把失败的交易作为 RCP 错误发送,开启这个标志使错误报告方式兼容其他的节点客户端,例如 geth 和 Parity。
特殊选项:
–account:指定账户私钥和账户余额来创建初始测试账户,可多次设置:

正常运行使用
yarn run ganache即可

子系统与主机网络之间的问题(因为网络知识不足不知道如何解决)

这里使因为前面ganache的问题无法解决而发现的奇怪的地方
一开始以为是防火墙的问题导致子系统虚拟机无法访问主机,所以尝试性的区ping了一下,发现子系统确实ping不通。
结果阴差阳错之下找到了以为遇到了相同问题的大佬。
根据大佬的说法添加一条防火墙规则即可
`New-NetFirewallRule -DisplayName “WSL” -Direction Inbound -InterfaceAlias “vEthernet (WSL)” -Action Allow
似乎还是不行
然后区看了下另一篇推荐的博客
发现给出上一个建议的博主使用的命令是优化过的版本,原版本是使用ip地址制定规则,但是他给出的是根据wsl的接口制定的规则;
原文:

1
2
3
4
PS C:\WINDOWS\system32> $myIp = (Ubuntu1804 run "cat /etc/resolv.conf | grep nameserver | cut -d' ' -f2")
PS C:\WINDOWS\system32> $myIp
172.21.0.1
PS C:\WINDOWS\system32> New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -LocalAddress $myIp -Action Allow

理解:

1
2
3
$myIp='子系统ip'

New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -LocalAddress $myIp -Action Allow

我本来以为那个ip是是子系统ip,但是发现只有当那个ip为空(允许所有本地ip访问)或者ip为主机ip是才能ping通。
即:

1
2
3
$myIp='主机ip'

New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -LocalAddress $myIp -Action Allow

然后我去试了下那个接口的
还是ping不通,但是突然想起来我能用wireshark来抓包看一下通过接口的流量啊

然后又去试了下放子系统ip的

结果是一样的,但是并不知道是哪里出了问题,还请各位大佬指点斧正。


Windows wsl智能合约编程环境搭建
http://example.com/2023/07/11/Windows wsl智能合约编程环境搭建/
Author
ghh
Posted on
July 11, 2023
Licensed under