第一步:环境配置
1、安装node环境(不会请自行百度)
2、安装ganache
下载地址:https://www.trufflesuite.com/ganache
3、安装Truffle
打开cmd窗口,运行命令:npm install -g truffle@v5.1.10

第二步:初始化项目
进入自己的工作目录
运行命令:truffle init pet-shop

此时新生成的pet-shop目录下会有如下文件

项目目录结构说明
contracts/ ----------- 智能合约的文件夹,所有的智能合约文件都放置在这里
migrations/ ----------用来处理部署(迁移)智能合约 ,迁移是一个额外特别的合约用来保存合约的变化。
test/ -------------------智能合约测试用例文件夹
truffle-config.js ------配置文件
第三步:编写自己的智能合约
智能合约承担着分布式应用的后台逻辑和存储。智能合约使用 solidity 编写,可先了解solidity相关内容。
在 contracts 目录下,添加合约文件 Adoption.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
contract Adoption {
address[16] public adopters; // 保存领养者的地址
// 领养宠物
function adopt(uint petId) public returns (uint) {
require(petId >= 0 && petId <= 15); // 确保id在数组长度内
adopters[petId] = msg.sender; // 保存调用这地址
return petId;
}
// 返回领养者
function getAdopters() public view returns (address[16] memory) {
return adopters;
}
}
第四步:编译部署智能合约
1、编译
在项目目录pet-shop下运行命令:truffle compile

2、部署
在migrations文件夹下创建一个自己的部署脚本 2_deploy_contracts.js
var Adoption = artifacts.require("Adoption");
module.exports =function(deployer) {
deployer.deploy(Adoption);
};
启动Ganache来开启一个私链来进行开发测试,默认会在7545端口上运行一个开发链。

核对配置文件,确保参数一致

接下来运行部署命令:truffle migrate

此时Ganache里的current block应该会变成4
第五步:测试
现在我们来测试一下智能合约,测试用例可以用 JavaScript or Solidity来编写,这里使用Solidity。
在test目录下新建一个TestAdoption.sol,编写测试合约。
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
import "truffle/Assert.sol"; // 引入的断言
import "truffle/DeployedAddresses.sol"; // 用来获取被测试合约的地址
import "../contracts/Adoption.sol"; // 被测试合约
contract TestAdoption {
Adoption adoption = Adoption(DeployedAddresses.Adoption());
// 领养测试用例
function testUserCanAdoptPet() public {
uint returnedId = adoption.adopt(8);
uint expected = 8;
Assert.equal(returnedId, expected, "Adoption of pet ID 8 should be recorded.");
}
// 宠物所有者测试用例
function testGetAdopterAddressByPetId() public {
// 期望领养者的地址就是本合约地址,因为交易是由测试合约发起交易,
address expected = address(this);
address adopter = adoption.adopters(8);
Assert.equal(adopter, expected, "Owner of pet ID 8 should be recorded.");
}
// 测试所有领养者
function testGetAdopterAddressByPetIdInArray() public {
// 领养者的地址就是本合约地址
address expected = address(this);
address[16] memory adopters = adoption.getAdopters();
Assert.equal(adopters[8], expected, "Owner of pet ID 8 should be recorded.");
}
}
运行测试用例:truffle test

第六步:创建Dapp和智能合约交互
我们已经编写和部署及测试好了我们的合约,接下我们为合约编写UI,让合约真正可以用起来。
Dapp源码下载:https://github.com/luoyeguiti/pet-store
将下载好的源码放到本地web服务中,在浏览器中打开。

在浏览器中安装metamask钱包插件,选择RPC网络为本地测试网络,如果没有显示可以自定义RPC,填写Ganache中对应的RPC SERVER。
(本人使用过程中遇到无法创建自定义RPC的问题,但是metamask默认带有localhost:8545网络,所以在truffle-config.js配置文件中将端口改成8545,并且在Ganache的设置中修改了端口,解决了问题)

连接好metamask钱包后,就可以进行领养宠物了。


到此,一个简单的Dapp就完成了。
网友评论