前言
上一篇我们介绍了Geth的安装,今天我们介绍如何部署智能合约。如果你还没有看上一篇介绍的内容,我建议你先看看上一篇从零开始以太坊区块链开发指南一。部署智能合约首先需要一个由solidity编写的合约文件以及用于开发以太坊的框架Truffle
安装Solc
solc是用来编译智能合约文件的编译器。
npm install -g solc
安装完成之后检查是否安装成功。
$solcjs --version
0.4.19+commit.c4cbbb05.Emscripten.clang
输出版本号则表示安装成功。
安装Truffle
npm install -g truffle
安装完Truffle之后,我们运行命令。
truffle version
输出
Truffle v4.0.3 (core: 4.0.3)
Solidity v0.4.18 (solc-js)
表示我们Truffle安装成功。
创建solidity工程
- 我们选择一个目录创建一个solidity工程,在该目录下运行
truffle init
该命令会自动创建一个工程和相关文件。并且给我们创建了一个自带的合约文件Migrations.sol
- 创建vote.sol
在上面由truffle init
创建的contracts文件夹下添加Voting.sol文件,这是一个投票应用,只要你有过编程经历,我相信solidity的语法对你来说毫无难度,将下面的solidity代码copy进去
pragma solidity ^0.4.2;
contract Voting{
//voter struct
struct Voter{
bytes32 name;
bool voted;//is voted or not
uint vote;//vote who
uint givenRightTime;//aurth time
uint votetime;//vote time
}
struct Proposal{
bytes32 name;
uint voteCount;
}
address public chairperson;//vote initiator
mapping(address=>Voter)public voters;//voters
Proposal[] public proposals;//can vote to who
//constructor
function Voting(bytes32[] proposalNames) public{
chairperson = msg.sender;
//init proposals
for(uint i = 0;i<proposalNames.length;i++){
proposals.push(Proposal({name:proposalNames[i],voteCount:0}));
}
}
function giveRightToVote(address voter,bytes32 voterName) public{
if(msg.sender != chairperson || voters[voter].voted){
revert();
}
voters[voter].name = voterName;
voters[voter].voted = false;
voters[voter].votetime = 0 ;
voters[voter].givenRightTime = now;
}
//vote
function vote(uint proposalIndex)public{
Voter storage sender = voters[msg.sender];
//check is voted
if(sender.voted){
revert();
}
//modify sender status
sender.voted = true ;
sender.votetime = now;
sender.vote = proposalIndex;
proposals[proposalIndex].voteCount += 1;
}
//get winner
function winningProposalIndex()public constant returns(uint winningProposalIndex){
uint winningVoteCount = 0;
for(uint p = 0 ;p<proposals.length;p++){
if(proposals[p].voteCount > winningVoteCount){
winningVoteCount = proposals[p].voteCount;
winningProposalIndex = p ;
}
}
}
function winnerName()public constant returns(bytes32 winnerName){
winnerName = proposals[winningProposalIndex()].name;
}
}
- 利用Truffle编译合约
打开工程里面的truffle.js,将下面的配置复制进去。
module.exports = {
// See <http://truffleframework.com/docs/advanced/configuration>
// to customize your Truffle configuration!
networks: {
development: {
host: "localhost",
port: 8081,
network_id: "*", // Match any network id
gas: 1000000
}
}
};
host和port是你本地一个以太坊节点的IP地址和端口,gas是部署需要花费的coin,接着打开工程文件的migrations文件夹下的1_initial_migration.js将你要部署的文件改成Voting.sol
// var Migrations = artifacts.require("./Migrations.sol");
var Voting = artifacts.require("./Voting.sol");
module.exports = function(deployer) {
deployer.deploy(Voting,['hexo','tfboys']);
};
- truffle部署合约
运行
truffle compile
运行 truffle migrate
truffle migrate
对应的以太坊节点上可以看到对应的输出
这证明我们的合约已经部署到我们的私有链上去了。
运行命令
txpool.status
我们运行
miner.start()
之后truffle会出现
表面我们的合约部署成功了。
好了,我们已经成功部署了一个合约,下一章我们将说明如何调用这个合约。