如何编译部署测试TNS代币
这篇文章主要介绍"如何编译部署测试TNS代币"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"如何编译部署测试TNS代币"文章能帮助大家解决问题。
编译
此时我们有一个包含一些Solidity代码的文件。但为了使以太坊虚拟机能够理解它,我们需要将其转化为机器代码。另外,为了从Web应用程序与它进行通信,我们需要一个ABI(应用程序二进制接口),它是对某个智能合约中存在的函数的通用可读描述--无论是代币还是更复杂的东西。我们可以使用Truffle的编译器立即为EVM和ABI创建机器代码。
在项目文件夹中,运行:
truffle compile
此命令将查看contracts
子文件夹内部,将它们全部编译并将其编译后的版本放入build
子文件夹中。请注意,如果你使用了上一部分的替代开发流程,那么我们的TNSToken合约继承功能的所有父合约也将在其自己的文件中逐个编译。
随意检查生成的JSON文件的内容。我们的TNSToken应该有超过10000行的JSON代码。
部署到Ganache
现在让我们看看是否可以将它部署到我们的仿真模拟器Ganache区块链中。如果Ganache尚未在终端的选项卡中或操作系统的应用程序中运行,请运行以下命令:
ganache-cli
或运行应用程序以获得这样的屏幕:
然后,回到我们刚刚编译合约的文件夹中,我们必须添加一个migration迁移。创建文件migrations/2_deploy_tnstoken.js
。如果你不熟悉Truffle生态系统中的迁移,请参阅本指南。
我们将以下内容放入该文件中:
var Migrations = artifacts.require("./Migrations.sol");var TNSToken = artifacts.require("./TNSToken.sol");module.exports = function(deployer, network, accounts) { deployer.deploy(TNSToken, {from: accounts[0]});};
首先,通过请求Migrations.sol
进行完整的导入。每次迁移都需要这样做。接下来,部署代币意味着我们需要导入其Solidity代码,我们通过TNSToken.sol
(我们在前一部分中编写的代码)来完成此操作。最后,只是迁移function(deployer, network, accounts) {and the last}
之间改变的部分。
在这种情况下,我们告诉部署者部署TNSToken并传入from
参数以设置初始代币持有者。这里使用的地址是由Ganache生成的随机地址,但是通过使用自动发送给部署者的accounts
数组,我们确保可以访问运行节点中存在的帐户列表(无论是实时Geth节点还是Ganache)。在我的特定示例中,account[0]
地址为0xdFb659D556d926dd3585d0f18d4F8eD7939E8061
,在上面的屏幕截图中也很明显。
我们也不要忘记在truffle.js
配置开发环境:
module.exports = { networks: { development: { host: "127.0.0.1", port: 7545, network_id: "*" } }};
注意:照顾端口和IP; 你的可能会有所不同!
最后,在项目文件夹中,运行truffle migrate
。你应该看到这样的东西:
注意TNStoken旁边的以太坊地址:0x3134bcded93e810e1025ee814e87eff252cff422
。这是我们的代币部署的地方。现在让我们看看它的实际效果。
测试代币
在这种情况下,不需要自动测试。代币合约是高度标准化和战斗测试。如果我们使用的某些功能超出了传统代币的范围,那么自动化测试就会派上用场。但是,通过将它发送到地址和从地址发送来测试它已经足够了。
打开像MyEtherWallet这样的钱包UI,在右上角的菜单中选择一个自定义网络。在对话框中,输入你的私有区块链给你的信息--Ganache或实际的PoA区块链,根据本教程系列的第1部分,你可以运行的任何一个。在我的例子中,地址为127.0.0.1
,端口为7545
。
在MEW中配置网络
打开你在部署脚本中设置为from
值的钱包。如果你正在使用Ganache,你会看到它的私钥打印在Ganache UI的屏幕上或终端的ganache输出中。
最后,需要告知MEW该代币存在。我们通过添加自定义代币来完成此操作。
在MEW中添加自定义代币
添加代币后,你会立即注意到该帐户现在有1亿的余额,并且能够在货币下拉选择菜单中发送它们。我们试着将一些发送到另一个地址。
继续发送,然后再将原始帐户恢复到1亿。我们刚刚确保代币的基本功能按预期工作。
部署到实时网络
如果不将其部署在实时网络上,这将不是真正的代币测试。但是,我们不要使用主网络,而是像Rinkeby这样的测试网。
在truffle.js
,让我们添加一个新的网络rinkeby
,这样我们的文件看起来像这样:
require('dotenv').config();const WalletProvider = require("truffle-wallet-provider");const Wallet = require('ethereumjs-wallet');const Web3 = require("web3");const w3 = new Web3();const PRIVKEY = process.env["PRIVKEY"];const INFURAKEY = process.env["INFURAKEY"];module.exports = { networks: { development: { host: "127.0.0.1", port: 7545, network_id: "*" }, rinkeby: { provider: function() { return new WalletProvider( Wallet.fromPrivateKey( Buffer.from(PRIVKEY, "hex")), "https://rinkeby.infura.io/"+INFURAKEY ); }, gas: 4600000, gasPrice: w3.utils.toWei("50", "gwei"), network_id: "3", }, }};
哎呀!这都是什么?
让我们逐行梳理它。
前几行导入一些节点模块,因此我们可以使用下面的函数。如果你得到任何一个缺少的模块消息,只需运行npm install web3-wallet-provider truffle-wallet-provider web3 dotenv --save
应该可以解决问题。
接下来,我们从根目录中的.env
文件中加载我们正在运行合约钱包的私钥(所以钱包将获得1亿个代币;我们不能在这里使用from
值)项目文件夹。如果它不存在,请创建它。该文件还有一个Infura.io
访问密钥,这是一个托管以太坊节点并允许应用程序连接到它们的网站,因此开发人员无需在其计算机上运行完整的以太坊节点。
.env
文件默认是隐藏的,可以在.gitignore
忽略,这样就不会有私钥泄漏的危险--这是一个非常重要的预防措施!这是文件包含的内容:
PRIVKEY="YOUR_PRIVATE_KEY";INFURAKEY="YOUR_INFURA_ACCESS_KEY";
你可以在此处注册获取Infura密钥。如果你只是安装Metamask,将其切换到Rinkeby,然后转到导出私钥,则可以轻松获取私钥。但是,任何方法都可行,所以选择你喜欢的任何方法。你也可以使用Ganache的私钥。一个私钥可以在所有以太坊网络上解锁相同的钱包--testnet
,rinkeby
,mainnet
,你可以命名它。
回到我们的配置文件。我们有一个新的network
入口:rinkeby。这是我们将要部署的以太坊测试网的名称,提供商内部的代码基本上是千篇一律的复制粘贴,告诉Truffle"抓住我的私钥,对其进行十六进制编码,使其成为一个未锁定的钱包,然后再通过它来和Infura交互"。
最后,我们定义了我们希望在执行此合约时要花费的gas限制(460万就够了,如果需要可以更改),gas需要多少(50 Gwei实际上相当昂贵,但我们正在玩的以太网是模拟的,所以没关系),并且将网络ID设置为4,因为这是Rinkeby testnet的标签。
还有一件事我们需要做。我们之前写的迁移文件是针对起始地址,但Rinkeby的地址不同。这是否意味着我们需要根据网络更改部署脚本?当然不是!让我们将2_deploy_tnstoken.js
文件更改为如下所示:
var Migrations = artifacts.require("./Migrations.sol");var TNSToken = artifacts.require("./TNSToken.sol");module.exports = function(deployer, network, accounts) { if (network == "development") { deployer.deploy(TNSToken, {from: accounts[0}); } else { deployer.deploy(TNSToken); }};
正如你所看到的,部署脚本是简单的JavaScript,并且为部署者提供的第二个参数始终是网络的名称--我们可以使用它来区分它们。
如果我们现在尝试使用truffle migrate --network rinkeby
运行迁移,如果我们使用的地址是新的,它将失败:
这是因为该地址在部署合约时无需花费以太。但这很容易解决。只需前往Rinkeby Faucet免费获取一些。
现在重新运行迁移,代币合约将在Rinkeby网络上实时部署。它可以像上面的Ganache用例一样进行测试。一切都应该完全一样,只有现在你也可以和你的朋友和同事一起测试。很有进展!
奖励:验证和ENS
对于额外的信任点,建议你在Etherscan上验证代币并为其注册ENS域。
验证
验证意味着将代币的源代码提交给Etherscan,以便将其与网络上部署的内容进行比较,从而将其验证为无后门。这是在代币地址的"代码"选项卡上完成的。由于我们的代币使用了一些第三方代码,并且无法轻松将这些代码拉入验证屏幕的代码窗口,因此我们需要修改合约。为此,我们将使用一个名为truffle-flattener
的工具:
npm install --global truffle-flattener
该工具将所有依赖项和代币的源代码复制到一个文件中。我们可以像这样运行它:
truffle-flattener contracts/TNSToken.sol >> ./contracts/TNSTokenFlat.sol
现在,contracts
文件夹中应该存在一个新文件,几乎与我们的源代码相同,但粘贴了依赖代码(例如,SafeMath.sol
将粘贴在文件的顶部)。
将该新文件的内容粘贴到Verify
屏幕的代码窗口中,将编译器设置为通过运行truffle version
获得的truffle版本,并将Optimization
设置为No
。单击"验证并发布",一旦该过程完成,你的代币的地址屏幕将显示新选项卡:"读取合约"和"写入合约"," 代码"选项卡将具有绿色复选标记,表示代码已经过验证。这为社区提供了额外的信任点。
ENS
ENS是以太坊名称系统。它用于为以太坊提供人类可读的名称,因此你不必记住0xmumbojumbo
字符串,而是可以记住像bitfalls.eth
这样的。然后,你甚至可以注册像token.bitfalls.eth
这样的子域名。注册ENS域的过程并不简单,需要时间,因此如果你愿意这样做,我建议你阅读本指南并按照此处的说明进行操作。
关于"如何编译部署测试TNS代币"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。