使用truffle与以太坊平台进行交互

今天研究了一上午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项目,格式如下

使用truffle与以太坊平台进行交互_第1张图片

我这个是经过编译之后的目录结构,实际上刚刚创建完之后,该目录下之后我标出来的四个文件

删掉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
> 


在部署的时候遇到的问题,截图如下:

使用truffle与以太坊平台进行交互_第2张图片

exceeds block gas limit的意思是超出了区块最大的gas限制,把创世文件里面的gas limit参数改大一点就好了。

你可能感兴趣的:(以太坊)