前一篇文章講了以太坊Dapp開發(fā)的一些內(nèi)容,在嘗試Truffle
的時(shí)候總是遇到各種各樣的問題醇滥,通過多次嘗試能夠正常的運(yùn)行一個(gè)demo
了黎比,問題主要是出在我的環(huán)境上,另外鸳玩,網(wǎng)上的大部分文章都有些過時(shí)了阅虫,Truffle
框架現(xiàn)在都已經(jīng)到V4+
了有些內(nèi)容做出了比較大的調(diào)整,智能合約的語法也有了一些變化不跟。
首先颓帝,我糾正一下testrpc
的配置
sudo npm install -g ethereumjs-testrpc
//輸出信息
+ ethereumjs-testrpc@6.0.3
added 404 packages in 37.952s
啟動(dòng)testrpc
testrpc
EthereumJS TestRPC v6.0.3 (ganache-core: 2.0.2)
Available Accounts
==================
(0) 0xd4c36cbc13aa269faef90cc33c21a16640b800db
(1) 0xdb2d100405b0377ab2ae1dd5ec0a42321703dca2
(2) 0x5ed80126ca200092418c14bca9c4b0a4a904f09b
(3) 0xaf7725ea608587ee44b40ad64c5bec38488d26c6
(4) 0x150856925c1101a21b4c9d57f2f34756888f99e5
(5) 0x57a70d1e1bd6de833c2e2f27728a36f108959b99
(6) 0x3c9c6fedb1e392b9430bad68b1abc97c80920e9f
(7) 0xbff334262de85a163c93dfe9485d741dda9c9b29
(8) 0x4bce3e355105bbfc228bfd0a2e0a55d3871fb984
(9) 0x598aacba1f1a78a241daab9f0126b6bf39063a40
Private Keys
==================
(0) c48b4eb2d42a085e163f6572958f63682e8f2b06fcafa838b205dca2640bc659
(1) 7fd8408c0b55d9550a310fb17a77ad82e1d55d856b574b7ac34a7a17c4c3847c
(2) 7340d2122c72b8e420acb703842c06bdf2170ac5e2adcd1f7bf4038a369edf1b
(3) b1916c4681d6ee9792f1fee10637aeecb357176ee00a434a18c5e5d3cfd11f83
(4) 7cda59f01f3aab76d2271c2497e6a4dd15a28faa67c143ec7d40ce25dfcdade5
(5) 26dedc489c16dc34292af820f11b430533d5a8fd8b30444cc8f51f5c1cbc511e
(6) 090b31a5d810327007c801601f830287a9d6031e805770d3e0516d232505ce80
(7) d110c83aed65532dc0a02e628bc4ebfa33e11f5b6742fcb865d1a7027298d0de
(8) e1c0874f40b94e165011671de60158770c1dd34679f830c6df2480501ed63d3d
(9) e87d1739ca3f543fc17cfe4c9007c61e5a1f7debfc3b670ca05da71c602c1da4
HD Wallet
==================
Mnemonic: math organ body menu burger say leave simple sketch decorate throw city
Base HD Path: m/44'/60'/0'/0/{account_index}
Listening on localhost:8545
備注:
testrpc
這種方式已經(jīng)不推薦了,官方推薦使用Ganache
Truffle
1.創(chuàng)建項(xiàng)目文件夾
mkdir /你的路徑/truffleTest
cd /你的路徑/truffleTest
2.初始化項(xiàng)目
$ truffle init
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!
Commands:
Compile: truffle compile
Migrate: truffle migrate
Test contracts: truffle test
此時(shí)的項(xiàng)目結(jié)構(gòu)如下:
$ tree
.
├── contracts
│ └── Migrations.sol
├── migrations
│ └── 1_initial_migration.js
├── test
├── truffle-config.js
└── truffle.js
3 directories, 4 files
3.編寫智能合約窝革,初始化的項(xiàng)目/contracts
文件夾里只有Migrations.sol
這個(gè)合約购城,不要修改里面的內(nèi)容,我們寫兩個(gè)簡(jiǎn)單的合約用來測(cè)試虐译。
第一個(gè)合約Test.sol
pragma solidity ^0.4.0;
contract Test{
function f() public pure returns (string){
return "method f()";
}
function g() public pure returns (string){
return "method g()";
}
}
第二個(gè)合約Greeter.sol
pragma solidity ^0.4.0;
contract Greeter
{
address creator;
string greeting;
constructor() public{
creator = msg.sender;
}
function greet() public constant returns (string){
return greeting;
}
function setGreeting(string _newgreeting) public {
greeting = _newgreeting;
}
function kill() public {
if (msg.sender == creator)
selfdestruct(creator);
// kills this contract and sends remaining funds back to creator
}
}
備注:因?yàn)闆]有比較復(fù)雜的內(nèi)容瘪板,就沒太關(guān)注
solidity
語法版本。另外漆诽,上面的合約語法可能在以后也會(huì)有所變化侮攀,可能需要適當(dāng)修改。
4.初始化的項(xiàng)目/migrations/
里只有一個(gè)1_initial_migration.js
文件拴泌,需要手動(dòng)創(chuàng)建一個(gè)2_deploy_contracts.js
var Greeter = artifacts.require('./Greeter.sol')
var Test = artifacts.require('./Test.sol')
module.exports = function (deployer) {
deployer.deploy(Greeter);
deployer.deploy(Test);
}
注意:移植腳本文件名以數(shù)字開頭魏身,一個(gè)描述性的后綴結(jié)尾。數(shù)字前綴是必須的蚪腐,用于記錄移植是否成功箭昵,后綴僅僅是為了提高可讀性,以方便理解回季。
補(bǔ)充:如果有庫文件需要按照如下的方式連接庫和合約
var ConvertLib = artifacts.require("ConvertLib.sol"); var MetaCoin = artifacts.require("MetaCoin.sol"); module.exports = function(deployer) { deployer.deploy(ConvertLib); deployer.link(ConvertLib, MetaCoin); deployer.deploy(MetaCoin); };
5.修改配置文件truffle.js
文件中聲明了項(xiàng)目的一些配置信息
module.exports = {
// See <http://truffleframework.com/docs/advanced/configuration>
// to customize your Truffle configuration!
networks: {
development: {
host: '127.0.0.1',
port: 8545,
network_id: '*' //匹配任何id
}
}
};
提示:這里我只配置了需要用的網(wǎng)絡(luò)環(huán)境家制,可以配置多個(gè)正林,更多詳細(xì)的配置請(qǐng)閱讀Truffle Doc
6.啟動(dòng)一個(gè)測(cè)試節(jié)點(diǎn),測(cè)試節(jié)點(diǎn)啟動(dòng)方式很多颤殴,這里使用testrpc
觅廓,參見文首。因?yàn)橹碍h(huán)境配置有問題涵但,后面的操作就遇到了以下的錯(cuò)誤信息
Error: No network specified. Cannot determine current network.
7.編譯項(xiàng)目杈绸,truffle compile
默認(rèn)編譯自上次編譯后被修改過的文件,來減少不必要的編譯矮瘟。如果你想編譯全部文件瞳脓,可以使用--compile-all
選項(xiàng)。
$ truffle compile --compile-all
Compiling ./contracts/Greeter.sol...
Compiling ./contracts/Migrations.sol...
Compiling ./contracts/Test.sol...
Writing artifacts to ./build/contracts
編譯完成之后項(xiàng)目/build/
下生產(chǎn)了幾個(gè)json
文件澈侠,這些就是合約的元數(shù)據(jù)
8.部署合約劫侧,在使用truffle migrate
部署合約的時(shí)候,可以通過--network development
來指定部署的網(wǎng)絡(luò)節(jié)點(diǎn)哨啃,development
就是在truffle.js
中配置的參數(shù)
$ truffle migrate --network development
Using network 'development'.
Running migration: 1_initial_migration.js
Replacing Migrations...
... 0x42b2d96809816765b609ca1b5e3505858a6d03ea1145f2ae47359fd66a6ebd69
Migrations: 0xe331f52a830f6abd8eb8e143fbde110edd28b9b8
Saving successful migration to network...
... 0x95f6e662c20a0350ff1903216a61cd1c878c8a571cb4a214b62d44a28e38a22d
Saving artifacts...
Running migration: 2_deploy_contracts.js
Replacing Greeter...
... 0x33b9776384f25342d51799970744b44dcfedf55a36093d55a72c5323dcbc8cf5
Greeter: 0x4cf91392df7740176d74f63faf9991ec838a6473
Replacing Test...
... 0x84463c7b8bce644a4df200ed1afdb3714514696cb32eef443854ca2dc2e56a70
Test: 0x57fec0a6d60ce7a133bbc6f7ac64f99a7b97425f
Saving successful migration to network...
... 0xc8902db446771ad43bf55b50acf6ae0e5c7972a48e72e7ff924104e5a8fbf6b0
Saving artifacts...
提示:如果你之前的移植是成功執(zhí)行的烧栋。
truffle migrate
僅會(huì)執(zhí)行新創(chuàng)建的移植。如果沒有新的移植腳本拳球,這個(gè)命令不同執(zhí)行任何操作审姓。如果報(bào)錯(cuò)出現(xiàn)了一些你之前編譯部署過,但你已經(jīng)不需要的合約醇坝,可以用truffle migrate --reset
來重置部署
9.驗(yàn)證合約邑跪,上一步操作已經(jīng)成功部署了合約,其實(shí)驗(yàn)證合約應(yīng)該是通過web3.js
在應(yīng)用里調(diào)用合約的方法呼猪,但我們的合約內(nèi)容簡(jiǎn)單画畅,我們通過console
來驗(yàn)證
$ truffle console
truffle(development)>
//調(diào)用Test合約的g()方法
truffle(development)> Test.deployed().then(function(func){return func.g.call();});
'method g()'
//調(diào)用Test合約的f()方法
truffle(development)> Test.deployed().then(function(func){return func.f.call();});
'method f()'
//調(diào)用Greeter合約的setGreeting()方法
truffle(development)> Greeter.deployed().then(function(func){return func.setGreeting("hello");});
{ tx: '0x2660bc0b7a769d995b32f68a9a1166d0ef93d8adb4a77a9fcb31cdccba000c41',
receipt:
{ transactionHash: '0x2660bc0b7a769d995b32f68a9a1166d0ef93d8adb4a77a9fcb31cdccba000c41',
transactionIndex: 0,
blockHash: '0x1fd9b5431279aadf9076a561aae7de355fbc3ba3ec4646c892de3cf577dd02a0',
blockNumber: 18,
gasUsed: 43033,
cumulativeGasUsed: 43033,
contractAddress: null,
logs: [],
status: 1 },
logs: [] }
//調(diào)用Greeter合約的greet()方法
truffle(development)> Greeter.deployed().then(function(func){return func.greet();});
'hello'
//退出控制臺(tái)
truffle(development)> .exit
關(guān)于Dapp開發(fā)的Truffle
框架Ⅰ的內(nèi)容就先寫到這里,后面就開始講web3
調(diào)用的內(nèi)容宋距,Truffle
框架的高級(jí)應(yīng)用在以后的內(nèi)容中遇到了再詳細(xì)講吧轴踱。至于智能合約的語法solidity
目前我還不是很熟練,就暫時(shí)不深講了谚赎,多讀讀文檔淫僻,多動(dòng)手嘗試編寫一些智能合約。