通过web3.js部署执行自己的Token合约(truffle框架下)

这篇文章主要讲在truffle框架下调用web3.js,并连接自己的私链;以及编译一个简单的Token合约,并尝试通过web3来实现合约的部署、函数的调用。
前提条件:安装: truffle、atom、geth、mist、node.js;

  • 初始化

    首先我们通过truffle,来构建一个框架,来方便我们部署自己的智能合约。
    注意,要先建一个空文件夹,用来保存生成的框架,在进入这个文件夹目录后,在命令行敲入以下命令:
truffle init
    此命令可以声生成框架,此时打开我们创建的文件夹,会发现已经多了一些文件在里面,如图2。
通过web3.js部署执行自己的Token合约(truffle框架下)_第1张图片
通过web3.js部署执行自己的Token合约(truffle框架下)_第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”这个参数要记下来,待会儿连接私链的时候需要用到。

通过web3.js部署执行自己的Token合约(truffle框架下)_第3张图片
出现了welcome,证明我们的结点已经启动了。
之后切换到truffle的命令行中,输入以下命令来查看当前链的信息:

 truffle develop
 //进入truffle的开发者模式
 web3.currentProvider
 //查看provider的信息

通过web3.js部署执行自己的Token合约(truffle框架下)_第4张图片
这里的host其实是truffle自动生成的,并不是我们的私链,所以要改一下,在命令行输入:

web3.setProvider(new web3.providers.HttpProvider('http://localhost:8486'));

8486是我们的私链端口,要记得改成你自己的。设置后,我们可以再次查看当前provider的信息,可以看到端口号已经更改过了。
通过web3.js部署执行自己的Token合约(truffle框架下)_第5张图片
这时分别在geth、和web3下查看账户,看看是否相同,连接是否成功。

//
//在geth命令行下输入
eth.accounts
//在truffle命令行下输入:
web3.eth.accounts

通过web3.js部署执行自己的Token合约(truffle框架下)_第6张图片
可以看到账户的输出是一致的,也就证明我们的web3已经成功连接到我们的私链了!

  • 部署自己的Token合约
    这里用了一个很简便的合约,只用来测试学习,并不具备安全性,合约代码如下:
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进入启动页面:
通过web3.js部署执行自己的Token合约(truffle框架下)_第7张图片

点击Open Folder来选中我们用truffle初始化的文件夹,打开后如图:
通过web3.js部署执行自己的Token合约(truffle框架下)_第8张图片
注意,Migrations.sol文件不要删除,它是帮助我们部署智能合约的。
我们可以通过快捷的方式,选中Migrations.sol后复制粘贴,同时增加、修改Migrations目录下的文件名称,注意看下图:

通过web3.js部署执行自己的Token合约(truffle框架下)_第9张图片
将智能合约写在MyToken.sol文件中,在2_initial_MyToken.js文件中修改配置:
通过web3.js部署执行自己的Token合约(truffle框架下)_第10张图片
现在我们的合约以及配置文件就已经写好了!

  • 执行合约

    转到truffle命令行中,输入以下命令,编译、部署智能合约:

compile//编译
deploy//部署

通过web3.js部署执行自己的Token合约(truffle框架下)_第11张图片
注意,红色框内是我们合约的地址。之后打开生成的build文件下的MyToken,复制它的api,并压缩成一行(百度搜索json在线压缩),保存在abi变量中,同时创建一个变量address来保存合约的地址:

这里写图片描述
(注意这个地址要和你的MyToken合约地址相同,小编这里重新编译了一次,所以才上一张图上的地址不一样,大家复制自己的就可以)
现在就可以来实例化合约对象啦,在命令行输入:

var MyToken = web3.eth.contract(abi).at(address);

这样我们的合约实例化就完成了,不过由于我们是连接自己的私链测试,所以调用函数前还需要做以下几件事:
1、通过geth将默认账户解锁,不解锁是不可以通过此账户调用合约的

通过web3.js部署执行自己的Token合约(truffle框架下)_第12张图片
通过MyToken尝试下调用函数

2、在geth上启动挖矿命令
通过web3.js部署执行自己的Token合约(truffle框架下)_第13张图片
现在转到truffle命令行调用我们的合约函数

web3.eth.defaultAccount = web3.eth.coinbas;
//首先指定部署合约的默认账户
MyToken.testError();
 //该地址是我私链上的合约部署者账户,你也可以通过查看账户的方式
 //找到你自己的默认账户,方法见上面

这里写图片描述这里出现了哈希值,也就代表我们的任务已经成功提交了,不过具体执行还需要挖矿的配合,等挖出新块后,我们的函数就执行了!

你可能感兴趣的:(通过web3.js部署执行自己的Token合约(truffle框架下))