truffle是世界级的以太坊开发框架,它使得以太坊开发变得简单⾼效,它具有以下特点:
官⽹不稳定,经常⽆法打开
将代码克隆到本地,编译,便可在本地访问(完美!)
npm install -g truffle
运⾏如下命令,测试安装情况:
truffle version
mkdir truffleTest
cd truffleTest
truffle init
在contracts⽂件夹下,创建⽂件SimpleStorage.sol,并贴⼊如下代码:
pragma solidity ^0.8.14;
contract SimpleStorage {
uint storedData;
function set(uint x) public {
storedData = x;
}
function get() public view returns (uint) {
return storedData;
}
}
在我们的项⽬中执⾏如下命令:
truffle compile
此时会⽣成 build ⽬录,⾥⾯结果如下:
compile 将把我们的 Solidity 代码编译成字节码(以太坊虚拟机 (EVM) 能理解的代码),build⽂件夹⾥⾯的两个⽂件是根据合约⽣成的,每⼀个.sol⽂件会编译出⼀个.json⽂件,json描述⽂件⾥⾯包含合约的 abi , bytecode 等相关信息,⽤于后续部署。
我们⼀般部署在以下三种环境中:
打开 “migrations” ⽂件夹并创建⼀个名为 “2_deploy_contracts.js” 的新⽂件。Migrations 只是帮助我们将合约部署到区块链的脚本。将下⾯的代码粘贴到⾥⾯,然后保存。
```go
const SimpleStorage = artifacts.require("./SimpleStorage.sol");
module.exports = function (deployer) {
deployer.deploy(SimpleStorage);
};
第1⾏是⽤来导⼊ “SimpleStorage.sol” ⽂件的(从 “contracts” ⽂件夹导出),第4⾏则将它部署到区块链中。
安装命令⾏ganache-cli
sudo npm install -g ganache-cli
修改truffle-config.js如下:
module.exports = {
// See
// to customize your Truffle configuration!
networks: {
ganacheNet: { //ganacheNet是可以⾃定义的名字,链接到ganache客户端
host: "127.0.0.1",
port: 8545,
network_id: "*" // match any network
}
}
}
启动ganache后,执⾏如下命令
truffle migrate --network ganacheNet
这个 ganacheNet 就是我们在 truffle.js 配置⽂件中⼿动添加的
在项⽬中执⾏如下命令:
truffle develop
启动内置开发环境,效果如下:
启动后,会进⼊交互界⾯,默认启动本地服务,占⽤端⼝号 9545 ,同时创建10个虚拟账户,每个账户默认含有100个eth
-compile命令
在终端内直接执⾏ compile
命令,完成编译。
结果:会生成build目录,同上。
- migrate命令
在终端内直接执⾏ migrate
命令,完成部署。(它这里可以不需要部署网络,它自己是由一个虚拟网络的,只不过我们看不到)
当我们执⾏migrate的时, 这个命令会更新SimpleStorage.json⽂件,将部署在这个指定⽹络中的合约地址和对应的交易哈希保存进来。那么我们可以调⽤通过这个json⽂件中的信息,调⽤我们的合约。(后⾯介绍)
truffle控制台自带了一个web3实例,在控制台已经实例化了一个合约的实例,可以直接使用。这个实例化的合约不是我们之前使用的模式,而是使用一个叫truffle-contract库包裹之后的实例。
import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/SimpleStorage.sol";
//合约名字要Test开头
contract TestMetaCoin {
//测试函数要test开头
function testSet() public{
SimpleStorage ss = SimpleStorage(DeployedAddresses.SimpleStorage());
ss.set(100);
uint res=ss.get();
Assert.equal(res,100,"res shoulid be 1000");
}
}
执行truffle test