truffle是一个以太坊智能合约集成开发测试环境,他和一般的IDE不同,它并没有代码编辑环境,
但是它能够方便的管理智能合约运行的环境,并且提供一套便捷开发智能合约(Smart Contract)的API,
能够有效的提升开发效率。
truffle拥有以下特性:
内建的智能合约编译、连接、发布和二进制文件管理工具。
快速开发自动化测试智能合约脚本。
脚本化、可拓展的发布、迁移框架。
管理任意公有以及私有的发布网络(1或者其他数字,1是以太坊正式运行网络,其他数字是本地开发网络环境)。
使用 EthPM 和 NPM 进行包管理,使用ERC190标准规范。
拥有与智能合约能直接通信的交互式控制台。
可配置的构建管道,支持紧密集成。
外部脚本运行器,用于在Truffle环境中执行脚本。
1.运行环境
windows
$ node -v && npm -v
v14.17.0
6.14.13
2.代码编辑器 vscode
下载后安装solidity, nodejs 插件。
3.安装 truffle
$ npm install -g truffle
$ truffle version
Truffle v5.3.10 (core: 5.3.10)
Solidity v0.5.16 (solc-js)
Node v14.17.0
Web3.js v1.3.6
3 快速入门
3.1 创建项目
创建项目文件夹
$ mkdir MetaCoin && cd MetaCoin
下载并解压MetaCoin项目(unbox)
$ truffle unbox metacoin
完成以上步骤后,你将会看到工程目录下有如下文件夹。
contracts/ 合约放在这个目录下(Solidity contracts)
migrations 脚本化部署文件
test/ 测试你的智能合约和应用文件夹
truffle.js truffle配置文件
3.2. 浏览项目
打开 contracts/MetaCoin.sol ,
这是一个用solidity编写的智能合约,它创建了一个MetaCoin token。
它使用了另外一个在该目录下的合约文件ConvertLib.sol。
打开 contracts/Migrations.sol ,
这个是一个独立的文件,没有依赖其他合约,用来更新你发布的只能合约状态。
这个是truffle生成的文件,一般我们不编辑它。
打开 migrations/1_initial_deployment.js ,
这个是用于迁移 Migrations.sol 的脚本文件。
打开 migrations/2_deploy_contracts.js ,
这个是用于迁移 MetaCoin.sol 的脚本。
(迁移的脚本会依次执行,以上两个文件的开头都是数字,执行顺序将会按照数字顺序执行。)
打开 test/TestMetaCoin.sol ,
这个是一个用solidity编写的测试文件,他将确保你的智能合约按照你预期的结果运行。
打开 test/metacoin.js,
这个是一个用javascript脚本编写的测试文件,他和上面的solidity编写的测试文件功能基本相同。
打开 truffle.js ,
这个是 truffle 配置文件,用来设置网络一起其他项目相关的设置。
这是一个空白文件,你可以不进行任何配置,truffle 的命令行中有一些内置的默认参数。
3.3. 测试
$ truffle test ./test/TestMetaCoin.sol
TestMetaCoin
√ testInitialBalanceUsingDeployedContract (120ms)
√ testInitialBalanceWithNewMetaCoin (119ms)
$ truffle test ./test/metacoin.js
Contract: MetaCoin
√ should put 10000 MetaCoin in the first account (115ms)
√ should call a function that depends on a linked library (93ms)
√ should send coin correctly (239ms)
3.4. 编译
$ truffle compile
Compiling your contracts...
===========================
> Compiling .\contracts\ConvertLib.sol
> Compiling .\contracts\MetaCoin.sol
> Compiling .\contracts\Migrations.sol
> Compiling .\contracts\ConvertLib.sol
> Artifacts written to D:\Repo\truffle_test\MetaCoin\build\contracts
> Compiled successfully using:
- solc: 0.5.16+commit.9c3226ce.Emscripten.clang
3.5. 迁移到truffle开发环境
使用如下命令创建私有连并与其交互:
$ truffle develop
Truffle Develop started at http://127.0.0.1:9545/
Accounts:
(0) 0xdcdfaf7df3fbcd87dafc33edb6cf110e84ca0b8c
(1) 0xafe0ce1980ca48eaa4b8f8dbaeb6af92cc51a749
(2) 0x162a15bc43be3870383f17531a21c1c11314a5ef
...
这里显示了10个账户和它们的私钥,用于和区块链交互。
truffle(develop)> 和 geth attach 是相同的交互式控制台。
在 truffle 交互控制台中,你可以省略 truffle 前缀,例如使用 truffle compile 你可以直接使用 compile 。
用于发布的命令行是 truffle migrate , 在交互命令行中使用 migrate 即可:
truffle(develop)> migrate
Summary
=======
> Total deployments: 3
> Final cost: 0.00109242 ETH
- Blocks: 0 Seconds: 0
- Saving migration to chain.
- Blocks: 0 Seconds: 0
- Blocks: 0 Seconds: 0
- Saving migration to chain.
这里显示交易IDs,和智能合约的部署地址。
3.6. 使用 Ganache 迁移智能合约
安装 Ganache 。
$ npm install -g ganache-cli
$ ganache-cli
Ganache CLI v6.12.2 (ganache-core: 2.13.2)
Available Accounts
==================
(0) 0x9D94916C27CCb9Ce84daeE18a4cD339f44736FC9 (100 ETH)
(1) 0xf6012D51dD8709c5FDda31279B43367eB7cc0881 (100 ETH)
(2) 0x42fceB310C0b4793BBB1cA7014fDDa01FFCdf8d2 (100 ETH)
...
...
Listening on 127.0.0.1:8545
打开 truffle.js 配置文件,替换 networks 配置:
module.exports = {
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*"
}
}
};
这个配置就是指定 truffle 连接到 Ganache 私有连。
保存并关闭文件。
在终端中输入 migrate 命令,迁移智能合约到由 Ganache 创建的区块链:(确认已经启动 ganache-cli)
$ truffle migrate
Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.
Starting migrations...
======================
> Network name: 'development'
> Network id: 1624084579260
> Block gas limit: 6721975 (0x6691b7)
...
...
Summary
=======
> Total deployments: 3
> Final cost: 0.0109242 ETH
为了与智能合约交互,你可使用 truffle 控制台。
truffle 控制台类似于 Truffle Develop ,
期望他连接到已经存在的区块链(由 Ganache 保证创建区块链)。
$ truffle console
truffle(development)>migrate
3.7.与智能合约交互
//创建新账号
truffle(development)> web3.eth.personal.newAccount('!#superpassword')
'0x69D8e22Bbc9971782e50c3cfefeB5e60E0e0eE6c'
//获取余额
truffle(development)> web3.eth.getBalance("0xD96e283D5213e81b33651178b59813e9da9713ee")
'0'
//创建获取所有账号
web3.eth.getAccounts()
truffle(development)> let accounts = await web3.eth.getAccounts()
undefined
truffle(development)> accounts
[
'0xc53e32f26F52101C04bB590A0EbcE89825323361',
'0x369CeFb91366d0a47c295895e7305b9a1855bD14',
'0x21fd2819ba51C1d4B36751b703A1733b65f6AB5d',
'0x79DEF71b768B332F99F96c9314757f9093C55934',
]
truffle(development)> accounts[0]
'0xc53e32f26F52101C04bB590A0EbcE89825323361'
truffle(development)> web3.eth.getBalance(accounts[0])
'99987682160000000000'
查询 metacoin 发布后智能合约中的账户余额:
MetaCoin.deployed().then(function(instance){return instance.getBalance(web3.eth.accounts[0]);}).then(function(value){return value.toNumber()});
查询账户余额值多少ETH
MetaCoin.deployed().then(function(instance){return instance.getBalanceInEth(web3.eth.accounts[0]);}).then(function(value){return value.toNumber()});
转 metacoin 从一个账户转账到另外一个账户
MetaCoin.deployed().then(function(instance){return instance.sendCoin(web3.eth.accounts[1], 500);});
查询接收 metacoin 的账户的余额:
MetaCoin.deployed().then(function(instance){return instance.getBalance(web3.eth.accounts[1]);}).then(function(value){return value.toNumber()});
查询转出 metacoin 账户的余额:
MetaCoin.deployed().then(function(instance){return instance.getBalance(web3.eth.accounts[0]);}).then(function(value){return value.toNumber()});
-----------------------------------------------------------------------------------------------------------------------------
pet-shop 记录
1.TestAdoption.sol
将 // address expected = this;
修改为 address expected = address(this);
2. jquery高版本,load() 事件已经废弃,替代即可解决:
将
// $(window).load(function() {
// App.init();
// });
修改为
$(window).on('load',function() {
App.init();
});
-----------------------------------------------------------------------------------------------------------------------------
defi 记录
truffle init
https://github.com/JKinGH/DecentralizedFinance
npm install truffle-hdwallet-provider
在项目目录执行truffle develop进入console 目录,
此时truffle提供了一个模拟的区块链环境RPC端口9545
truffle develop
执行compile命令编译合约(如需重新编译所有合约,可执行compile --all)
truffle(develop)> compile --all
执行migrate命令,Truffle会根据./migration/2_deploy_contracts.js 内容部署合约
如需重新部署所有合约,可执行migrate --reset
truffle(develop)> migrate --reset
truffle(develop)> let defi = await DeFi.deployed()
undefined
truffle(develop)>let accounts = await web3.eth.getAccounts()
undefined
truffle(develop)> accounts
truffle(develop)> defi //输入抽象合约对象名称即可
ruffle(develop)> web3.eth.getBalance(accounts[0])
truffle(develop)> defi.pledge.sendTransaction({ from: accounts[0], value: web3.utils.toWei("0.05", "ether"), gas: "220000"})
truffle(develop)> let contract = await defi.address
undefined
truffle(develop)> web3.eth.getBalance(contract)
'50000000000000000'
truffle(develop)> let result = await defi.pledge.sendTransaction({ from: accounts[0], value: web3.utils.toWei("0.006", "ether"), gas: "220000"})
undefined
truffle(develop)> result
truffle(develop)> result.logs //result.logs (array) - 解码过的事件 (日志)
truffle(develop)> web3.eth.getBalance(contract)
-----------------------------------------------------------------------------------------------------------------------------
MetaCoin 记录
truffle develop
truffle(develop)> compile
truffle(develop)> migrate
truffle(develop)>let accounts = await web3.eth.getAccounts()
truffle(develop)> accounts
ruffle(develop)> web3.eth.getBalance(accounts[0])
ruffle(develop)> web3.eth.getBalance(accounts[1])
truffle(develop)> let metaCoin = await MetaCoin.deployed()
truffle(develop)> metaCoin.address
truffle(develop)> let contract = await metaCoin.address
truffle(develop)> web3.eth.getBalance(contract)