今天研究了一上午truffle与以太坊平台之间的交互,终于走通了,特地做一下笔记。备忘(truffle与以太坊私有链的交互)
1、首先启动geth客户端,使用如下命令
>./geth --datadir "./chaintest" --networkid 314590 --port 61910 --rpc --rpcapi "web3,eth,net" --rpccorsdomain "*" --rpcport 8200 console
部署合约到私有链时,需要注意:geth启动节点的时候,必须带有--rpcapi选项,并且选项的值必须包含有"web3","eth","net"这三个设置,另外为了保证rpc为启用,还必须带有--rpc等一系列参数。
客户端启动之后,如果是新的客户端,需要给客户端创建1-2个账户以方便测试,新建账户的命令如下:
>personal.newAccount("123456"); //其中123456为账户密码
如果客户端原本就有账户,我们给账户解锁,以便智能合约能够部署到私有链上,因为部署合约的时候默认是用第一个账户进行操作,所以我们只要解锁第一个账号即可。解锁命令如下:
>personal.unlockAccount(eth.accounts[0],passwoed,1000*60*60); //第三个参数是经过多长时间,账户被锁定,我们可以设置的长一点,这里设置60分钟
2、启动geth客户端之后,我们来构建一个truffle项目,前提是你的机器上已经安装了truffle,我是在linux上测试的,系统为centos7
>mkdir truffle3
>cd truffle3
>truffle init //这个命令之后,truffle会自动在truffle3目录下构建一个truffle项目,格式如下
我这个是经过编译之后的目录结构,实际上刚刚创建完之后,该目录下之后我标出来的四个文件
删掉contracts目录下除了Migrations.sol的另外两个文件,当然也可以保留,我们这边是用自己写的智能合约进行测试。Migrations.sol文件移植的时候需要用到,所以我们保留。增加Greeter.sol文件。内容如下
pragma solidity ^0.4.11;
contract Greeter
{
address creator;
string greeting;
function Greeter(string _greeting) public
{
creator = msg.sender;
greeting = _greeting;
}
function greet() constant returns (string)
{
return greeting;
}
function setGreeting(string _newgreeting)
{
greeting = _newgreeting;
}
/**********
Standard kill() function to recover funds
**********/
function kill()
{
if (msg.sender == creator)
suicide(creator); // kills this contract and sends remaining funds back to creator
}
}
修改migrations目录下的2_deploy_contracts.js的文件如下:
var Greeter = artifacts.require("./Greeter.sol");
module.exports = function(deployer) {
deployer.deploy(Greeter);
};
修改truffle3下的truffle.js内容如下:
module.exports = {
rpc: {
host:"localhost",
port:8200
},
networks: {
development: {
host: "localhost",
port: 8200,
network_id: 314590 // Match any network id
}
}
};
这里的rpc-port为geth客户端启动时的端口号,networks-development-network_id为geth客户端启动时的networkid。
设置完之后,就可以进行编译了
>编译
truffle compile
编译之后,就会出现上面的目录结构了
>部署
truffle migrate
执行部署操作之后,回到geth客户端进行挖矿操作miner.start();admin.sleepBlocks(13);miner.stop();
挖矿成功之后,智能合约就部署到以太坊私有链上了
之后我们在geth客户端测试一下
> var abi = [{"constant": false,"inputs": [],"name": "kill","outputs": [],"payable": false,"type": "function"},{"constant": false,"inputs": [{"name": "_newgreeting","type": "string"}],"name": "setGreeting","outputs": [],"payable": false,"type": "function"},{"constant": true,"inputs": [],"name": "greet","outputs": [{"name": "","type": "string"}],"payable": false,"type": "function"},{"inputs": [{"name": "_greeting","type": "string"}],"payable": false,"type": "constructor"}]
undefined
>
>
> var address = "0x231485032a7159202382515d4f90baef00ef9cdb";
undefined
>
> var greeter = web3.eth.contract(abi).at(address);
undefined
> greeter.setGreeting("Hello world!",{from : eth.accounts[0]});
INFO [09-12|16:09:43] Submitted transaction fullhash=0x54dd41fde0b5fa8b362713568ef2eddfea3d9075759376dbc0e6de22106a4d8e recipient=0x231485032a7159202382515d4f90baef00ef9cdb
"0x54dd41fde0b5fa8b362713568ef2eddfea3d9075759376dbc0e6de22106a4d8e"
>
> miner.start();admin.sleepBlocks(13);miner.stop();
> var aaa = greeter.greet();
undefined
> console.log(aaa);
Hello world!
undefined
>
在部署的时候遇到的问题,截图如下:
exceeds block gas limit的意思是超出了区块最大的gas限制,把创世文件里面的gas limit参数改大一点就好了。