这篇文章主要讲在truffle框架下调用web3.js,并连接自己的私链;以及编译一个简单的Token合约,并尝试通过web3来实现合约的部署、函数的调用。
前提条件:安装: truffle、atom、geth、mist、node.js;
首先我们通过truffle,来构建一个框架,来方便我们部署自己的智能合约。
注意,要先建一个空文件夹,用来保存生成的框架,在进入这个文件夹目录后,在命令行敲入以下命令:
truffle init
此命令可以声生成框架,此时打开我们创建的文件夹,会发现已经多了一些文件在里面,如图2。
连接自己的私链
truffle可以自动提供10个虚拟账户,初学者可以直接用这些测试账户,但以后我们是需要连接私链执行各种功能的,所以这里直接连接我们的私链。
首先用geth启动我们创建好的节点:
geth –identity “TestNode1” –datadir “data0” –rpc –rpcapi “db,eth,net,web3” –rpcaddr “127.0.0.1” –rpcport “8486” –port “30304” –networkid “29382” console
其中 –rpcport “8486”这个参数要记下来,待会儿连接私链的时候需要用到。
出现了welcome,证明我们的结点已经启动了。
之后切换到truffle的命令行中,输入以下命令来查看当前链的信息:
truffle develop
//进入truffle的开发者模式
web3.currentProvider
//查看provider的信息
这里的host其实是truffle自动生成的,并不是我们的私链,所以要改一下,在命令行输入:
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8486'));
8486是我们的私链端口,要记得改成你自己的。设置后,我们可以再次查看当前provider的信息,可以看到端口号已经更改过了。
这时分别在geth、和web3下查看账户,看看是否相同,连接是否成功。
//
//在geth命令行下输入
eth.accounts
//在truffle命令行下输入:
web3.eth.accounts
可以看到账户的输出是一致的,也就证明我们的web3已经成功连接到我们的私链了!
pragma solidity ^0.4.24;
constructor(){
uint256 INITIAL_SUPPLY = 10000;
mapping (address => uint256) balances;
function construction(){
balances[msg.sender] = INITIAL_SUPPLY;
}
// 转账到另一个指定的地址
function transfer(address _to,uint256 _amount){
assert(balances[msg.sender] > _amount);
balances[msg.sender] -= _amount;
balances[_to] += _amount;
}
// 查看指定的地址的余额
function balanceOf(address _owner) constant returns(uint256){
return balances[_owner];
}
//测试函数调用
function testError() public returns(string){
return "Function success!";
}
}
这里选用atom编译器,大家也可以根据自己兴趣选择,在任意命令行输入atom进入启动页面:
点击Open Folder来选中我们用truffle初始化的文件夹,打开后如图:
注意,Migrations.sol文件不要删除,它是帮助我们部署智能合约的。
我们可以通过快捷的方式,选中Migrations.sol后复制粘贴,同时增加、修改Migrations目录下的文件名称,注意看下图:
将智能合约写在MyToken.sol文件中,在2_initial_MyToken.js文件中修改配置:
现在我们的合约以及配置文件就已经写好了!
执行合约
转到truffle命令行中,输入以下命令,编译、部署智能合约:
compile//编译
deploy//部署
注意,红色框内是我们合约的地址。之后打开生成的build文件下的MyToken,复制它的api,并压缩成一行(百度搜索json在线压缩),保存在abi变量中,同时创建一个变量address来保存合约的地址:
(注意这个地址要和你的MyToken合约地址相同,小编这里重新编译了一次,所以才上一张图上的地址不一样,大家复制自己的就可以)
现在就可以来实例化合约对象啦,在命令行输入:
var MyToken = web3.eth.contract(abi).at(address);
这样我们的合约实例化就完成了,不过由于我们是连接自己的私链测试,所以调用函数前还需要做以下几件事:
1、通过geth将默认账户解锁,不解锁是不可以通过此账户调用合约的
通过MyToken尝试下调用函数
2、在geth上启动挖矿命令
现在转到truffle命令行调用我们的合约函数
web3.eth.defaultAccount = web3.eth.coinbas;
//首先指定部署合约的默认账户
MyToken.testError();
//该地址是我私链上的合约部署者账户,你也可以通过查看账户的方式
//找到你自己的默认账户,方法见上面
这里出现了哈希值,也就代表我们的任务已经成功提交了,不过具体执行还需要挖矿的配合,等挖出新块后,我们的函数就执行了!