前段时间征集大创,班里两个同学想和我组队,然后我就又拉上一位大佬组起了队。其实到现在也不太清楚大学阶段最后要深入研究那个方向,现在还在各种方向都摸索着,好害怕最后什么都知道一点,但是什么都不精。不太想专门写一篇日志,所以就借着这个周二的早上记录一下叭。言归正传。
用了4天看solidity,第3、4天看的加密僵尸,第6章需要用到javascript、jquery,然后就用了3天去看这个两个语法,顺带着看了看nodejs的相关基础(因为部署的时候需要用到truffle等东西,这些都是和nodejs有一点联系的,比如说truffle就是得用npm来install,但是下载npm最省事的方法就是通过安装node来安装了)。
然后花了1天时间来看truffle的部署,准确的说应该是废了1天,因为这一天啥都没弄明白,只是装好了各种环境而已。
看了一天还是萌萌咚咚,然后想起来CX大佬之前写过一篇关于部署和测试的文章,借鉴了一下。
https://blog.csdn.net/weixin_40788897/article/details/103918598
加密僵尸那个教程的truffle里好多部署,看的头都晕了。但是现在想想好像是这么回事:truffle部署合约,可以部署到各种以太坊网路(包括公链、私链、测试链等等,也不知道这么说准不准确)。
比如说truffle部署到testrpc
部署到Ganache
部署到Loom Testnet
部署到Basechain、好多好多。。。
说是现在摒弃了部署到testrcp,因为Ganache比testrpc更好用。
如果这些名词不知道啥意思,可以看前面的博客,里面记录了各种(太tm多了)名词。
然后也了解到了Ganache可以和rimex链接起来,还可以和metamask链接起来。
好了,废话到这里了,接下来就记录truffle部署到ganache了。
但是首先声明一下,没有搭建环境的不适合看这篇记录,需要先把需要的各种软件下来好。
需要的软件:truffle、git、Ganache
truffle init
新建一个空项目
但是我这里总是失败,所以我就用了从git上下载的另外一条命令。
git clone https://github.com/truffle-box/bare-box
第二种命令新建的项目会比第一种多一些东西,但是不需要用到。
contracts用于放solidity源码文件
migrations用于放部署文件
test用于放测试文件
truffle-config.js用于设置部署相关参数,后面都会一个一个用到。
在contracts目录里写一段代码,我这里保存为demo.sol
pragma solidity ^0.4.23;
contract Demo {
int x=5; //很喜欢5这个数字,所以就等于5了哈哈
function getX() public view returns (int) {
return x;
}
function setX(int _x) public {
x = _x;
}
}
第1步
这时就需要编辑migrations目录下的文件,
新建一个js文件,命名为2_demo_migration.js
注意,文件名以数字编号作为前缀,并以描述作为后缀。
var myContract = artifacts.require('./Demo.sol');
module.exports = function(deployer) {
deployer.deploy(myContract);
}
通过artifacts.require告诉truffle要和哪些合约进行交互,返回一个合约的抽象,在后面就可以用这个合约的抽象了。
注意这里最好不要用文件名称,因为一个文件里面可能有多个合约。
module.exports是nodejs的语法,通过这个可以导出一个函数供其他文件require的时候用。
其中deployer对象时执行部署任务的主要接口。
在部署脚本中,我们使用部署器来部署合约。也就是上面代码里的deployer.deploy,这个函数会严格按照我们代码的顺序部署。
比如说有两行代码deployer.deploy(a); deployer.deploy(b);
它就一定会先部署a再部署b。
第2步
编辑好部署脚本后就需要修改truffle-config.js文件,这个文件的作用就是用来配置部署到的网络,监听的端口等等。
这里就需要先用到上面提到的Ganache了,先开启它,搭建好一个测试网络。
默认HTTP://127.0.0.1:7545
,这在我们的config.js里面需要用到。
然后就去修改我们的truffle-config.js文件
networks: {
development: {
host: "localhost", // Localhost (default: none)
port: 7545, // Standard Ethereum port (default: none)
network_id: "*", // Any network (default: none)
},
}
在第一次执行时,将编译所有合约。在随后的执行中,Truffle将只编译更改过的合约。
如果想全部编译,可以使用truffle compile --all
选项执行上面的命令。
这个时候就会在根目录下面出现一个build/contracts子目录,用于存放编译完成的文件。
离成功不远了,希望不要出错
truffle migrate
注意,一旦部署就永远存在。但是在测试链中我们可以用truffle migrate --reset
来重新部署。
这时请注意Ganache,第一个用户的gas已经减少了一些,哈哈哈太激动了(这个地方要突出本菜鸡的心理变化)。
这就意味着我们已经通过truffle把合约部署到了Ganache。
然后我们用truffle提供个命令行工具,truffle console
来启动命令行。
把部署的一个实例绑定给一个变量
Test.deployed().then(instance => contract = instance)
这里的myContract就是我们在2_xx.js里定义的变量
使用deployed()函数获取一个已部署合约的实例,并将其分配给promise回调函数中的一个contract变量。
然后就可以很容易的通过contract.function.call()或者contract.function.send()来调用智能合约中的函数了
菜鸡在部署的最后一步与合约互动出了点问题,一直没有办法获取那个变量。
后来重新生成一个项目做了一遍就好了。现在想想可能就是中间改了源码没有–all和–reset的原因吧。
再一个就是contract.function.call()这个语句中的function不要加括号。因为写函数调用写习惯了,就总是加个括号contract.function().call()一直不成功。
部署的学习总算是告一段落了。