[TOC]
一、vscode开发环境搭建
安装vscode插件.
自动格式化solidity
添加配置如下,并且 设置里 勾选 Format on save
自动格式化js
如下图操作,遇到问题参考该连接。
https://stackoverflow.com/questions/58866847/in-vs-code-im-getting-this-error-failed-to-load-module-attempted-to-load-pr
二、javascript基础知识
执行
node xxx.js
顺序
从文件顶部的代码开始运行。
function main(){
// do sth
}
main( );
异步编程
大部分我们要使用的部署合约的函数都是异步的。
promise
一个promise可以是 “挂起的”(Pending),“已成功”(Fulfilled) 或是 “已失败”(Rejected)。
async/await
- 当函数是async的时候,我们可以访问另一个名为 await的关键字。
- await 关键字告诉任何基于promise的函数,要等待promise 变成 fulfilled或者 rejected。
三、solc-js编译合约
用来编译 solidity,类似remix的的编译。
#npm 安装solc
npm install solc
#yarn 安装solc
yarn add solc@0.8.7-fixed
关于yarn
#node16.10之前版本要先运行如下两句
npm i -g corepack
corepack enable
#v16.20 默认yarn可用
yarn --version
#注意,这里把 win环境变量path的Hadoop_home去掉了,不然混淆yarn。
yarn也可以运行脚本
yarn solcjs --help
编译合约1
编译SimpleStorage.sol ,包含node_modules/ 下的文件以及合约
yarn solcjs --bin --abi --include-path node_modules/ --base-path . -o . SimpleStorage.sol
编译合约2
yarn compile
效果等同于上一种方法,因为这个很长的脚本已经写进package.json
"scripts": {
"compile": "solcjs --bin --abi --include-path node_modules/ --base-path . -o . SimpleStorage.sol"
}
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error)
process.exit(1)
})
### 3)执行deploy.js
```javascript
node deploy.js
4)观察ganache
注意:如果我们用的是 Truffle ,就能在 “CONTRACTS” 这个tab里看到合约。
但是,我们使用的是Hardhat,所以无法在这里看到合约。
(五)使用ethers.js调用合约
1)概述
将如下代码片段 填入 deploy.js 的main函数末尾。
实现用js调用SimpleStorage.sol合约的retrieve,store方法,就像在remix中做的一样。
2)源码
//调用合约中的函数retrieve,store
let currentFavoriteNumber = await contract.retrieve()
console.log(`Current Favorite Number: ${currentFavoriteNumber}`)
console.log("Updating favorite number...")
// 也可以传入 字符串 "7",ethers会自动转化
let transactionResponse = await contract.store(7)
let transactionReceipt = await transactionResponse.wait()
currentFavoriteNumber = await contract.retrieve()
console.log(`New Favorite Number: ${currentFavoriteNumber.toString()}`)
3)输出
$ node deploy.js
Deploying, please wait...
Contract deployed to 0xc319004A8C0b3F246FFdF628a7e3734C1559Ec84
Here is the transaction:
Here is the receipt:
Current Favorite Number: 0
Updating favorite number...
New Favorite Number: 7
4)思考
-
为什么使用BigNumber ?
因为solidity不能用浮点,只能用长整型,对于js来说,如果用number数字太大放不下。
-
怎么保证私钥安全?
- 密钥 用终端设置环境变量 export privateKey=value,然后清空历史命令 history -c 。
- 设置password进行密钥本地加密,配合 history -c 隐藏 password。
- .env 设置 gitignore
(六)部署到测试网
1)步骤
部署到Sepolia 网络。
- 需要一个Sepolia RPC URL。
- 需要 Sepolia 账号的 PrivateKey。
- (暂时不实验)本地部署一个Sepolia 版本的 go-ethereum Geth节点,然后连接到Geth节点。
- (代替步骤3)连接到一个第三方RPC URL。
2)Alchemy
alchemy 具有节点即服务的功能,并允许我们连接到他们支持的任何区块链。
其它备选方案有QuickNode,Morales或者 Infura,他们都有节点即服务的选项。
1 注册账号
gmail登录
2 创建应用->选网络
4)源码参数替换
- RPC_URL: 替换为 alchemy 应用 里的rpcurl。
- privateKey: metaMask 里 account1的privateKey。
5)部署Sepolia
一样,执行 node deploy.js。
部署成功后地址为
0x2C114BeA53D0aEf2Ada124bB4D228bF9e68FeF71
注意
FAQ:
- 交易资金不够。
reason: 'insufficient funds for intrinsic transaction cost',
code: 'INSUFFICIENT_FUNDS',
error: Error: processing response error (body="{\"jsonrpc\":\"2.0\",\"id\":49,\"error\":{\"code\":-32000,\"message\":\"insufficient funds for transfer\"}}",
error={"code":-32000}, requestBody="{\"method\":\"eth_estimateGas\",\"params\":[{\"type\":\"0x2\",\"maxFeePerGas\":\"0x59689650\",\"maxPriorityFeePerGas\":\"0x59682f00\",\"from\":\"0xe3d0cc8971bd41d3d93fff21b46e0ee1873d40c9\",\"data\":\"
---------------------------------------------------------------------------
原因:
metamask钱包的 余额小于部署合约需要花费的eth,
可能是由于 测试网络Sepolia 比较繁忙(由于各种原因例如撸空头的团队等)费用高。
---------------------------------------------------------------------------
所以这个失败,不用太担心,正式部署时不会。
解决:
1.换网https://ethereum.stackexchange.com/questions/147894/insufficient-funds-for-intrinsic-transaction-cost-on-goerli-network
2.换节点服务https://stackoverflow.com/questions/74420125/insufficient-funds-for-intrinsic-transaction-cost-on-goerli-network
3.ganache+truffle本地模拟以太坊网络+水龙头 https://blog.csdn.net/weixin_44613271/article/details/125311201
4.(推荐)下班、半夜多试几次。
6)发布合约代码(可选)
到Sepolia.etherscan.io 上验证并发布我们的合约源码。
这样,就不会显示一堆16进制数字代码。
- Contract tab --》 Verify and Publish--》select Compiler Type(0.8.7)--》select Open Source License Type (MIT)
- 把合约源码复制进去
- Verify and Publish
- 成功编译
- 重新打开 Contract tab出现了绿勾, 看 合约代码,已经不是数字,而是我们上传的源码。
7)Alchemy-Dashboard
费用不够的那几次调用错误日志排查。
TODO
(一)本地模拟以太坊网络
ganache+truffle+metaMask
ganache
本地模拟以太网络,避免测试网的拥堵,
truffle
上传水龙头合约,避免测试网水龙头的数量、频率限制。
metamask
钱包连入ganache网络