Truffle-Petshop项目搭建
关于本项目,你需要的一些准备工作。
- 安装vscode(推荐)
- 安装 ganache(也可以不安装,不过推荐安装,可以用于本地私有链测试)
- 安装metamask(虚拟币钱包插件,可在chrome应用商店下载)
- 安装Nodejs:下载地址https://nodejs.org/en/download/
- 当然对于nodejs你可能需要一些配置,可以在网上找到教程。
- 安装 Truffle :npm install -g truffle
- 安装ganache-cli:npm install -g ganache-cli(脚手架,用于创建区块链,所以ganache在此项目中是一个可选项而不是必选,但是本人选择直接用了本地的ganache)
安装过程可以参考:区块链DAPP-基于Truffle框架的宠物商店_黄豆2019的博客-CSDN博客
这里主要讲一下这个项目的大概目录与架构。
如何引入项目?
在项目目录运行:truffle unbox pet-shop
关于truffle目录结构的介绍:
contract:solidity智能合约所在的目录----这里有一个重要的合约Migrations.sol(在后面介绍)migrations:Truffle使用迁移系统来处理智能合约部署。迁移是一个附加的特殊智能合约,用于跟踪更改。test:测试文件所在的目录,智能合约的JavaScript和Solidity测试truffle.js:truffle项目的配置文件
在本项目中使用到的truffle命令:
truffle compile ---用于将Solidity编译为字节代码,以供以太坊虚拟机(EVM)执行
添加合约代码:
contracts > Adoption.sol
pragma solidity >=0.4.22 <0.8.0;contract Adoption{ address[16] public adopters; function adopt(uint petId) public returns (uint){ require(petId=0); adopters[petId] = msg.sender;//记录领养者地址 return petId; } /*此处该数组若未声明为memory变量会报错 因为memory表示值变量,即只是复制副本;而默认为storage是引用变量,所有的引用都实际只想一处 如果这里是storage变量,则外部可以修改该变量,这显然不符合区块链的安全性原则 view只读 pure不读写 */ function getAdopters() public view returns (address[16] memory){ return adopters; }}
添加完成后编译合约:
truffle compile预期输入:Compiling .\contracts\Adoption.sol...Compiling .\contracts\Migrations.sol...Writing artifacts to .\build\contracts
创建迁移脚本
在migrations
目录中创建迁移脚本,告诉Truffle如何部署智能合约,在该目录中创建文件2_deploy_contracts.js
。
注意,在migrations目录中所有文件都有编号,作用是让Truffle知道执行它们的顺序。
2_deploy_contracts.js
文件内容如下:
migrations > 2_deploy_contracts.js
var Adoption = artifacts.require("Adoption");module.exports = function(deployer) { deployer.deploy(Adoption);};
上面的代码中:
- 首先,
require
了创建的合约,并将其分配给一个名为“Adoption”的变量。 - 接着,将合约加入部署清单,运行迁移命令时合约将被部署。
修改配置文件:
修改dapp-guide-pet-shop配置文件truffle-config.js,连接本地地址和端口。
这个develop配置也不知道是哪里来的,,但是对我这个项目没有用
如果你已经下载了ganache,可以直接进行迁移(记得先把gannache打开),如果你没有下载gannache,请输入命令:
我们将使用ganache-cli,来开启一个私链来进行开发测试,可用于部署合同,开发应用程序和运行测试,设置端口:8545。
ganache-cli >> D:\xxx\你想存放的路径\ganachetrace.log
日志输出至指定的文件,默认启动的10个钱包账户和对应的私钥地址,账户余额均为100ETH。
执行迁移命令:
truffle migrate
matamask联动使用
区块链DAPP-基于Truffle框架的宠物商店_黄豆2019的博客-CSDN博客
添加的代码
test > TestAdoption.sol
pragma solidity ^0.5.0;import "truffle/Assert.sol";//断言import "truffle/DeployedAddresses.sol";//用来获取测试地址import "../contracts/Adoption.sol";//被测试的合约contract TestAdoption { // The address of the adoption contract to be tested Adoption adoption = Adoption(DeployedAddresses.Adoption()); // The id of the pet that will be used for testing uint expectedPetId = 8; //The expected owner of adopted pet is this contract address expectedAdopter = address(this); // Testing the adopt() function function testUserCanAdoptPet() public { uint returnedId = adoption.adopt(expectedPetId); Assert.equal(returnedId, expectedPetId, "Adoption of the expected pet should match what is returned."); } // Testing retrieval of a single pet's owner function testGetAdopterAddressByPetId() public { address adopter = adoption.adopters(expectedPetId); Assert.equal(adopter, expectedAdopter, "Owner of the expected pet should be this contract"); } // Testing retrieval of all pet owners function testGetAdopterAddressByPetIdInArray() public { // Store adopters in memory rather than contract's storage address[16] memory adopters = adoption.getAdopters(); Assert.equal(adopters[expectedPetId], expectedAdopter, "Owner of the expected pet should be this contract"); }}
输入命令:
>truffle testUsing network 'development'.Compiling .\test\TestAdoption.sol...
添加代码的案例:一些对链,合约的初始化
区块链DApp从零开始学 (二) | 超详细 DApp创建 | 发行代币token | 宠物领养_111辄的博客-CSDN博客
并重新初始化petshop’
运行:npm run dev
如果你的ganache cli出现问题的话,可以考虑直接使用ganache。
以太坊开发——使用Ganache CLI在私有链上搭建智能合约_bk1171676983的博客-CSDN博客
如果你对metamask与私有链的连接使用有一些疑惑的话:
1.打开gannache
2.执行迁移命令
3.npm run dev
4.将ganache中第一个账户的私钥导入到钱包里成为一个新的账户
关于ganache cli报错:版本过低。
Error: Callback was already called.
at F:\Nodejs\node_global\node_modules\ganache-cli\build\ganache-core.node.cli.js:25:273
at f. (F:\Nodejs\node_global\node_modules\ganache-cli\build\ganache-core.node.cli.js:25:2116)
at f.emit (node:events:513:28)
at f.destroy (F:\Nodejs\node_global\node_modules\ganache-cli\build\ganache-core.node.cli.js:37:906702)
at finish (node:internal/streams/writable:769:14)
at processTicksAndRejections (node:internal/process/task_queues:83:21)