区块链(Solidity && truffle调试)

来自垃圾的一篇笔记

总体来说还不错,至少今天终于整出来了,心里万分欣喜,对没有夸张真的是万分,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 Test

可以使用这一条命令(它会默认将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这个文件也是可以的,不过个人更加喜欢前者,个人感觉有以下优点:

  1. 首先,我们留下他也没什么问题嘛,对吧,或许以后还能用到呢,还是保留更稳妥;
  2. 再者,我们新建一个文件夹,这个名字其实是自己写的,你可以根据这个对应的合约进行起名字,也更具有条理性
    (扯得跟真的一样)
const Test = artifacts.require("./Test.sol");
//这里的"./Test.sol"其实还可以换成合约的名字
module.exports = function(deployer) {
  deployer.deploy(Test);
};

这里其实和1_initial_migration.js只有细微的区别,稍作修改即可。对于有继承关系的,可以选择在我注释的地方写和合约的名字,多个合约在同一脚本就可以:

var SafeMath = artifacts.require("SafeMath");
var Ownable = artifacts.require("Ownable");
var Store = artifacts.require("Store");
module.exports = function(deployer){
    deployer.deploy(SafeMath);
    deployer.deploy(Store);
    deployer.deploy(Ownable);
}

至于先后顺序嘛,我也不太清楚,但是,你上面只要定义了那个artifacts就可以的,因为后面要用嘛,继承的合约会使用import的artifacts变量(我暂时理解的就是这样,大概有错误)。
这个先告一段落,还记不记得我之前提过的那个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 --reset

–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…)进行调用。只要没有写入区块链的操作的函数,都是可以使用call()函数的,而且参数加在call还是函数后都是以一样的,但是加在函数后的话后面就不可以再加上call了,否则就会:
TypeError: contract.(…).call is not a function

猜你喜欢

转载自blog.csdn.net/weixin_40788897/article/details/103918598