用truffle部署合约的完整流程
May 5th, 2022

涉及内容:利用truffle编译、部署、验证合约,实践过程中的问题以及tips,truffle和remix在etherscan上验证,在etherscan上进行mint

本篇是一个学习记录,有任何错误和建议欢迎twitter私聊,我们共同进步

https://twitter.com/pangmadee

案例合约:

SAC只有一个.sol文件,所有相关的代码都放在了一起。这是一个721类型合约,功能主要是白名单和公售mint,接下来会部署在测试网rinkeby上,只测试公售mint。

最初不明白为什么SAC所有文件都放在一个sol里面,跑通全部之后才知道可能是用的remix的flatten插件将文件扁平汇总到一个sol里面,再部署验证

truffle本地部署

1、合约编译

将SAC合约粘贴到contracts/Sac.sol,执行完会出现build目录

$ truffle compile

合约测试部分,以后学习的时候会再单独讲,这部分需要对合约有一个更加细致的了解,目前很多合约出现各种漏洞,都是因为测试没有做好,合约好写,测试不好做,以后会花更多的时间在这部分研究。

2、合约部署

$ truffle migrate --network rinkeby

--reset 强制重新部署

部署过程中出现了一些问题:

  • out of gas,在gas设置的时候数值不够
  • 修改了数据,再重新部署没有更新

1⃣️在truffle-config.js里面设置一个合适的gas,可以先进行gas估计,根据估计出的gas去部署就不会再出现gas不足的情况

 $ truffle consle --network rinkeby
truffle(rinkeby)>SAC.new.estimateGas()
5741260
gas设置
gas设置

2⃣️在修改了一些代码之后重新部署,如果不更新,在命令后面加上--reset

3、合约验证

通过以上的操作我们已经成功将合约部署到rinkeby,但是在etherscan查询的时候,看不到具体的内容

Bytecode
Bytecode

这时候需要安装插件truffle-plugin-verify,并在truffle-config.js添加设置

设置插件
设置插件

然后执行命令

$ truffle run verify SAC --network rinkeby 

出现错误无法连接api-rinkeby.etherscan.io,命令加上--debug可以看错误的详细信息

ping api-rinkeby.etherscan.io也确实出现timeout

验证失败
验证失败

尝试了三种方法:

1⃣️用https://url5.co/?t=1636355893这个网址查看对应的ip,sudo vim /private/etc/hosts添加进去,再次ping就能够访问,但是依然报错

2⃣️在本地终端加入VPN http://127.0.0.1:1087(mac的端口是1087),依然没有成功

3⃣️在truffle-config.js里面设置VPN

VPN设置
VPN设置

第三种方法成功设置,在网上查了很多办法,最后在truffle-plugin-verify的github上看到了详细的使用方法(还是官方文档更可靠)

到此就可以在etherscan上mint了。

4、public mint

代码里面有很多依赖,但是我们只需要关注SAC合约开始的这一部分

用另外的地址进行mint

以上就是truffle部署到最终mint的全部过程,下面准备用remix的方式进行合约验证。

Remix合约验证

如果是多个sol文件,用插件flatten将所有sol文件聚合在一个文件中,然后复制黏贴到etherscan进行验证

这里的ABI因为SAC的构造函数没有参数所以填空,remix上面可以找到ABI,然后通过下面这个网站得到hash值输入进去

总结:

1、全部流程跑通才知道为什么有的合约是多个sol文件,有的是一个sol文件,一个sol文件大概率是remix直接部署,手动etherscan验证,

2、truffle命令的时候,会报错找不到一些东西,这个时候不要先google,先仔细看一下相关的关键词有没有写对

3、合约发布之前,整体估计gas,测试阶段每个函数都估计一下gas

4、整个流程走完发现还是挺简单的,但是自己走一遍会对工具更熟悉

Subscribe to 0x3c
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from 0x3c

Skeleton

Skeleton

Skeleton