Truffle 3.0部署智能合约至Ethereum节点

smilejiasmile 2018-06-28

以下内容全是都是建立在MacOS X平台上,在正式开始此之前,希望你对BlockChain的内容有所了解,对truffle,contract,Solidity,web3.js等概念有所认识,假如毫无概念,那么请严格按照以下步骤顺序操作

准备工作

Truffle 3.X安装

Truffle安装教程

安装truffle之前确保你已经安装了Nodejs环境,推荐NodeJS 5.0+。新建终端,执行:

$ npm install -g truffle

Ethereum安装

Ethereum安装教程

安装之前确保你安装了Homebrew

新建终端,执行:

brew tap ethereum/ethereum
 brew install ethereum

建立节点和账户

  • BlockChain-在一台电脑上部署多个节点
  • BlockChain --- 账号间的交易

正式开始

新建项目

新建文件夹,命名为 truffleProject ,然后新建一个终端,我们将其命名为终端1,从终端1进入此文件夹下,执行:

truffle init

此时 truffleProject 文件夹下会出现 contracts migrations test 三个文件夹和 truffle.js 文件

编写合约

contracts 就是智能合约存放的目录,默认情况下已经帮你创建好 ConvertLib.sol MetaCoin.sol Migrations.sol 合约,不用管它

在 contracts 文件夹下创建一个新文件 Test.sol ,文件内容如下:

pragma solidity ^0.4.4;
contract Test {
 function multiply(uint a) returns(uint d) {
 return a * 7;
 }
}

合约内容很简单,就是输入一个整数,返回它乘以7的结果

修改配置

修改 migrateions 文件中 2_deploy_contracts.js 的内容,如下:

var Test = artifacts.require("./Test.sol");
module.exports = function(deployer) {
 deployer.deploy(Test);
};

修改 truffle.js 的文件内容如下:

module.exports = {
 networks: {
 live: {
 host: "localhost", //本地地址,因为是在本机上建立的节点
 port: 8545, //Ethereum的rpc监听的端口号,默认是8545
 network_id: 999 // 自定义网络号
 }
 }
};

我们把合约部署在自己的私有网络上,所以自定义网络号。解释一下,Ethereum本身有一个主网络,假如你的节点没有连接到这个网络上去,那意味着你建立的是私有的Ethereum网络。network_id的设置可参见: https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options

启动节点

新建一个终端,我们称为终端2,输入:

geth --identity "newEth" --rpc --rpccorsdomain "*" --datadir "你的节点的path" --port 30303 --rpcapi "db,eth,net,web3" --networkid 999 console

把上面命令中的 “你的节点的path” 替换成你自己建立的节点的目录,例如 “/Users/JerryMissTom/Documents/blockchain/node1” 。注意, network-id 后的内容 999 和你上面在 truffle.js 文件中设置的保持一致

解锁账户:

部署之前必须先解锁账户,不然会报错 Error encountered, bailing. Network state unknown. Review successful transactions manually.

在终端2上输入如下命令来解锁账户:

personal.unlockAccount("0x4c00224faec439c08abe669bd2b15e3530a6e754", "111111", 10000)

其中 "0x4c00224faec439c08abe669bd2b15e3530a6e754" 是账户地址,需要替换成你的,假如不知道,可先在终端2上输入:

personal.listAccounts

会返回你当前所有的账户,选择第一个就好,假如不存在,则新建账户,见准备工作中的 建立节点和账户 的内容。 "111111" 是账户相对应的密码, 10000 是解锁时间。

部署合约

切换到终端1,编译合约,输入:

truffle compile

此时 truffleProject 文件夹下会多出一个 build 文件夹

然后部署合约,输入:

truffle migrate --network live

没有错误的话,终端1上会出现:

Running migration: 1_initial_migration.js
 Deploying Migrations...

geth的控制台,也就是终端2上,会出现:

I0421 10:29:58.671910 internal/ethapi/api.go:1141] Tx(0x66643d8dd37a4d8c8b13ad6aa933cb069fb30eae5e3a6e1b4309496d34b9c17a) created: 0x8b6deb996f11d9d463d5db3d2bd4de9193c1a14f

合约正在部署,在终端2上输入: txpool.status

结果是

{
 pending: 1,
 queued: 0
}

表明有一个交易在等待确认,需要继续挖矿,把交易打包到下一个区块,在终端2上继续执行:miner.start()

现在等待一段时间,成功部署后,会在终端1上出现:

Running migration: 1_initial_migration.js
 Deploying Migrations...
 Migrations: 0x8b6deb996f11d9d463d5db3d2bd4de9193c1a14f
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
 Deploying Test...
 Test: 0x98cd084074fe3f15890c55822070ac8274d8f7f6
Saving successful migration to network...
Saving artifacts...

表明部署成功

在终端2上执行: miner.stop() ,停止挖矿

调用合约

打开 truffleProject/build/contracts/Test.json 文件,内容如下:

{
 "contract_name": "Test",
 "abi": [
 {
 "constant": false,
 "inputs": [
 {
 "name": "a",
 "type": "uint256"
 }
 ],
 "name": "multiply",
 "outputs": [
 {
 "name": "d",
 "type": "uint256"
 }
 ],
 "payable": false,
 "type": "function"
 }
 ],
 "unlinked_binary": "0x6060604052346000575b6077806100176000396000f300606060405263ffffffff60e060020a600035041663c6888fa181146022575b6000565b34600057602f6004356041565b60408051918252519081900360200190f35b600781025b9190505600a165627a7a72305820cf7ecb7716fc2496cf81a1249a8d74354554a193016fbeb30b18f473a6b989090029",
 "networks": {
 "999": {
 "events": {},
 "links": {},
 "address": "0x98cd084074fe3f15890c55822070ac8274d8f7f6",
 "updated_at": 1492742008225
 }
 },
 "schema_version": "0.0.5",
 "updated_at": 1492742008225
}

把abi内容拿出来先在线压缩,然后在终端2中输入:

abi=[{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"type":"function"}]

结果显示:

[{
 constant: false,
 inputs: [{
 name: "a",
 type: "uint256"
 }],
 name: "multiply",
 outputs: [{
 name: "d",
 type: "uint256"
 }],
 payable: false,
 type: "function"
}]

创建合约的实例,在终端2中继续输入:

test=eth.contract(abi).at("0x98cd084074fe3f15890c55822070ac8274d8f7f6")

其中 "0x98cd084074fe3f15890c55822070ac8274d8f7f6" 就是合约存储的地址,可以在 truffleProject/build/contracts/Test.json 中找到.

在终端2中输入:

test.multiply.call(3)

结果会显示:

21

总结

之前已经知道如何使用Truffle编写和编译智能合约,在TestRPC上运行官方的例子,也知道如何建立Ethereum节点和账户,最后卡在如何使用Truffle合约部署在我建立的私有链上。现在终于解决这个问题,下一步就是研究如何与合约进行通信。

Truffle 3.0部署智能合约至Ethereum节点

相关推荐

XinLianOrg / 0评论 2017-12-04