在公共测试网上部署智能合约
欢迎阅读又一篇关于以太坊编程基础的文章。在之前的文章中,我们已经知道了开发去中心化应用程序的流程和基本工具,在这篇文章中,我们将讨论怎样在公共测试网上部署 dapp,我也会为大家介绍一些有帮助的以太坊开发者资源。
什么是 Infura
Infura 的主要目的是提供对以太坊和 IPFS 网络即时访问,而无需在以太坊或者 IPFS 节点上做那些繁琐的设置。
Infura 基于最新的 microservice-driven 架构,可以动态扩容以支持 API 。开发者可以通过 HTTPs 和 WebSocket 链接到以太坊和 IPFS ,请求响应时间比其他服务和自托管解决方案要快 20 倍。我们的 API 套件会始终保持最新的更新,并在所有网络更新期间保持服务可用。——来自 Infura 的产品描述[4]
部署到 kovan 测试网
这一节,我们介绍把智能合约部署到 kovan 测试网的步骤。在 Ethereum stackexchange[5] 可以找到不同以太坊测试网之间的详细对比。
- 在 Infura 中创建项目:在开始使用 Infura 时,你需要先创建一个账户和一个新项目,因为你需要使用项目 Id 才能向 API 发送请求(更多细节在这里[6])
- 在 MetaMask 中获取助记词:如果忘记保存你的助记词了,可以进入 MetaMask 设置项,选择安全与隐私,然后点击“显示助记词”并输入密码就可以看到助记词了。
- 创建一个用于保存如助记词、Infura 项目 id 这样的保密内容的文件:在 truffle 项目的根目录创建一个 json 文件,取名为
.secrets.json
,然后添加下面的内容:
{
"mnemonic": <your mnemonic>,
"projectId": <your project Id>
}
- 安装
HDWalletProvider
:要部署智能合约,我们必须发送一笔带有合约字节码的交易到网络上,并且,为了给这笔交易签名,我们还需要 truffle 框架的hdwallet-provider
包:
npm install @truffle/hdwallet-provider
- 更新 truffle-config.js 文件:首先导入依赖项并解析
.secrets.json
文件。(更多配置细节请看truffle 文档[7])
const HDWalletProvider = require("@truffle/hdwallet-provider");
const fs = require("fs");
const secrets = JSON.parse(fs.readFileSync(".secrets.json").toString().trim());
在网络部分添加一个新网络:
kovan: {
networkCheckTimeout: 10000,
provider: () => {
return new HDWalletProvider(
secrets.mnemonic,
`wss://kovan.infura.io/ws/v3/${secrets.projectId}`
);
},
network_id: "42",
},
现在可以用终端来将项目部署到 Kovan 网络了:
truffle migrate --network kovan
接下来是什么
现在你已经具备写智能合约,开发 dapp 的基础知识了,你已经准备好下一步了。
这一节,我会推荐一些帮助你提升以太坊开发能力的资料:
图书:
电子书:精通以太坊-中文版[8]
Hands-On Smart Contract Development with Solidity and Ethereum: From Fundamentals to Deployment[9]
Mastering Blockchain Programming with Solidity: Write production-ready smart contracts for Ethereum…[10]
培训:
- 6-Figure Blockchain Developer from eattheblock-pro[11].
- Consensys academy courses[12].
其他资料:
以太坊智能合约最佳实践[13]
ConsenSys/ethereum-developer-tools-list[14]
Solidity 最新中文文档[15]
注意事项
- 在生产环境编译智能合约时要使用 optimizer 优化生成的字节码。
- 如果一个函数需要转移以太币给一个接收者,那么转移操作应该是这个函数执行的最后一个操作,以防接收者是一个有恶意 fallback 函数(重入攻击)的智能合约。如果有一些其他操作需要在转移之后执行,可以考虑使用 openzeppelin 的 ReentrancyGuard (详见这里[16])。
- 不要在如循环或者 if/else 等控制结构中做以太币转账。(与上一点相同,在有恶意 fallback 函数的情况下,如果攻击者不能盗取以太币,他还可以执行 DOS 攻击)
- 最好用撤回(取款)模式[17]来做以太币转账操作,这样可以避免重入攻击。
- 不要在交易中使用无限循环,这可能导致一个交易因为 gas 消耗超过区块 gas 限制而永远无法被打包进区块链。(参考这里[18])
- 如果不想让合约接收以太币,不要用
address(this).balance
基于合约余额写任何逻辑,因为以太币可以使用selfdestrct(recipient)
强制发送给合约。 - 使用 openzeppelin 的 SafeMath 库来避免整数溢出和下溢(Solidity 0.8 以上不需要)。
- 如果你需要根据用户角色设定函数访问权限,你可以用 openzeppelin 库的 AccessControl 合约。
- 不要用
tx.origin
授权。 - 使用函数前,一定要用 require 语句检查参数是否有效。
结论
这是以太坊编程基础系列最后一篇文章了。如果你需要更高级的主题,可以从这些内容开始:Oracles[19], Gasless transactions[20]。
你可能还想看看一些 github 上的工具:scaffold-eth[21] solidity-template[22]
原文:https://medium.com/nerd-for-tech/deploy-your-smart-contracts-to-a-public-testnet-7f9aef3f6039
猜你喜欢
比特币价格今日行情,比特币暴跌7%其它加密货币也跳水
比特币价格今日行情,比特币暴跌7%其它加密货币也跳水 比特币价格大幅下跌,而以太币价格也下跌。
2022-01-22
09年上大学买了5000个比特币,不惜卖掉婚房的唐宇,现今咋样了
09年上大学买了5000个比特币,不惜卖掉婚房的唐宇,现今咋样了 2013年,那个为买118个比特币,不惜卖掉婚房的唐宇,现今咋样了
2022-01-22
中国全面禁止比特币挖矿的原因
中国全面禁止比特币挖矿的原因 近期因为国内碳排放问题和国内电力不够用的情况,先是把比特币挖矿关停,进而把虚拟货币的整个交易市场也几乎关停了。很多区块链的企业开始转向了海外,或者直接清算结束运行了。
2022-01-22
交易所出海后,比特币中国禁止后怎么提现
交易所出海后,比特币中国禁止后怎么提现 为什么要清退虚拟货币呢?
2022-01-22
李晨比特币5个亿爆仓怎么翻身
李晨比特币5个亿爆仓怎么翻身 李晨有多少比特币 李晨比特币爆仓 李晨炒比特币 比特币大涨李晨 李晨的比特币 Q1:李晨比特币5个亿爆仓怎么翻身
2022-01-22
上一篇
从零开发区块链应用(一)-golang配置文件管理工具viper
评论