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

来源:互联网 发布:怎么在淘宝客上推广 编辑:程序博客网 时间:2024/05/29 12:05

今天研究了一上午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参数改大一点就好了。

阅读全文
1 0
原创粉丝点击