目录
- 来自垃圾的一篇笔记
- 首先特别感谢两位大佬的博客
- 有关于系统的声明
- 有关软件及环境
- 参考步骤
- 安装truffle框架
- 安装Ganache
- 创建项目
- 创建合约
- deploy配置以及编译部署
- 调试(与合约互动)
来自垃圾的一篇笔记
总体来说还不错,至少今天终于整出来了,心里万分欣喜,对没有夸张真的是万分,truffle调试我找了好多博客都没有,终于最后还是找到了两篇,这是开搞第6天了,我太难了。下面我就做下笔记,也为开发区块链项目的小白(对,这仅适合什么都不会的小白,大佬请指点哪里做的还不够好)做一个详细一点的步骤,因为本人也是个小白,所以就只会步骤,原理什么的(去他妈的原理,不用原理还做不来)就由大佬来负责吧。
首先特别感谢两位大佬的博客
以太坊开发框架truffle入门指南-02 整合Nodejs
区块链学习(3) 以太坊测试环境编译并部署智能合约
非常感谢两位大佬的博客指点迷津,否则菜鸡可能要死掉了。
有关于系统的声明
本人用的是Linux下deepin版本,不同的系统可能会出现不同的问题,请大家谅解(出现状况,本人无责,手动滑稽)。
有关软件及环境
truffle,web3那是必不可少的,还有就是Ganache; truffle之前是跟testrpc配套使用的,但这种方式现在已被摒弃!!!truffle官方强烈推荐使用Ganache替代testrpc。毕竟,testrpc是在命令行里,而Ganache是有安装包,有图形界面的。
参考步骤
安装truffle框架
npm install -g truffle //truffle@~4.1.11用来加版本号
具体安装的版本号要看你写的合约的版本,如果太高就可能编译不了,所以看个人情况,否则完全卸载truffle又要看很多博客,太麻烦了。npm是node中的命令,请自行查阅安装。里面-g说明是全局安装,这样在哪里都能用了,否则只能在指定路径下。
安装Ganache
点这里下载,下载完启动就可以了,在这里面,有时候需要配置一下端口号,在右上角的设置(本人用的8544端口,都可以,看你自身需求,反正是用来调试程序,这个其实只要与程序一致,都是可以的)
创建项目
mkdir test
cd test/
truffle初始化
truffle init
Downloading…
Unpacking…
Setting up…
Unbox successful. Sweet!Commands:
Compile: truffle compile
Migrate: truffle migrate
Test contracts: truffle test
理论上应该是这种结果(我成功了,看运气),但是呢,难免有什么问题
这种情况也是很正常的,我也经常遇到,我在写这篇笔记的时候也是跟着做了一遍,所以大家大可放心(至少linux系统的用户),我能做出来,你们一定也行,无非就是多试试,让然如果还不行的话:
解决方法可以是直接git代码取代truffle init命令
git clone https://github.com/truffle-box/bare-box
这条命令也是差不多效果的,只是会多几个类似.git的文件夹,毕竟是克隆下来的,这也在所难免了。
这条命令执行完的话,你的目录下至少应该有以下几个目录了:
contracts migrations test truffle-config.js truffle.js,我的少了一个truffle.js,可能是不同系统的问题吧,不过没什么大碍,后面再加上就可以。
创建合约
truffle create contract HelloWorld
可以使用这一条命令(它会默认将sol文件建在contracts文件夹下,方便),或者直接在contracts文件夹建一个sol文件就可以了,什么花里胡哨的,干就完了。
pragma solidity ^0.4.16;contract Test {function sayHi() returns (string) {return "你好,迪丽热巴";}function sayBye() returns (string) {return "再见,我的热巴";}
}
然后这里恬不知耻的借用一下人家的代码。
deploy配置以及编译部署
我这里选择增加migrations/2_deploy_contracts.js配置,我看两个博文写的不太一样,好像更改1_initial_migration.js这个文件也是可以的,不过个人更加喜欢前者,个人感觉有以下优点:
- 首先,我们留下他也没什么问题嘛,对吧,或许以后还能用到呢,还是保留更稳妥;
- 再者,我们新建一个文件夹,这个名字其实是自己写的,你可以根据这个对应的合约进行起名字,也更具有条理性
(扯得跟真的一样)
const Test = artifacts.require("./Test.sol");module.exports = function(deployer) {deployer.deploy(Test);
};
这里其实和1_initial_migration.js只有细微的区别,稍作修改即可。
这个先告一段落,还记不记得我之前提过的那个truffle.js,马上就要用到它了,当然,编译是不需要的,但是部署需要,你需要这个文件来指定你所监听的地址,端口,网络等:
module.exports = {// See <http://truffleframework.com/docs/advanced/configuration>// to customize your Truffle configuration!migrations_directory: "./migrations",networks: {development: {host: "localhost",port: 8544,network_id: "*" // Match any network id}}
};
下面就是很普通的编译部署操作了(太常规了,狗头)
truffle compile
truffle migrate
对于编译环节,如果你的合约写的不够严谨的话,比如某个函数没有指定是public或者internal等诸如此类的问题,那么都是会导致WARNING的,但是,放心,只要没有ERROR,那么你的合约就能部署使用,但是个人还是觉得合约这种东西还是严谨一点比较好。你可以根据报的警告对自己的合约进行修改。
还有就是,对于部署的环节,在你部署过一次后就不能再使用上面的truffle migrate进行部署了,但是编译是可以无限次重复的,当你编译完成后想要调试的时候,要重新部署,这时候你需要使用
truffle migrate --save
–reset表示部署过一次之后,下次再部署,需要添加此属性。切换到Ganache界面中,不出意外应该就能看到第一个账号消耗了一部分的eth。
调试(与合约互动)
truffle提供命令行工具,执行truffle console命令后,可用Javascript来和刚刚部署的合约互动。
Test.deployed().then(instance => contract = instance)
这里使用Test.deployed().then语句来取得HelloWorld合约的Instance(实例),并存到contract变量中,以方便后续的调用。 其方法如下:
contract.<functionName>.call()
这里的call()方法只能用来读取只读(read only)的数据,也就是用view,pure修饰的函数。这类函数和其它函数一样,可以直接contract.(arguements…)进行调用。