如下内容全是都是创建在MacOS X平台上,在正式开始此以前,但愿你对BlockChain的内容有所了解,对truffle,contract,Solidity,web3.js等概念有所认识,假如毫无概念,那么请严格按照如下步骤顺序操做html
Truffle安装教程node
安装truffle以前确保你已经安装了Nodejs环境,推荐NodeJS 5.0+。新建终端,执行:git
$ npm install -g truffle
github
Ethereum安装教程web
安装以前确保你安装了Homebrewnpm
新建终端,执行:json
brew tap ethereum/ethereum brew install ethereum
新建文件夹,命名为 truffleProject
,而后新建一个终端,咱们将其命名为终端1,从终端1进入此文件夹下,执行:api
truffle init
网络
此时 truffleProject
文件夹下会出现 contracts
migrations
test
三个文件夹和 truffle.js
文件cors
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合约部署在我创建的私有链上。如今终于解决这个问题,下一步就是研究如何与合约进行通讯。