准备工作
1. PowerShell
这一章我们仍然会大量地使用命令行,但由于有一些命令是Windows系统默认不支持的,因此如果你使用的是Windows系统,应该从cmd改成PowerShell。好在PowerShell是Windows自带的,你很容易就能找到PowerShell的入口。
按“开始”-“运行”,或按WIN键+R,进入『运行』窗口,输入PowerShell即可找到该功能。
2. Truffle
Truffle 是目前最流行的以太坊开发框架,使用的是Solidity编程语言,而其本身是基于JavaScript。因此在安装Truffle之前,确保你的电脑已经成功安装Node.j,具体教程参见本系列教程的第一章。
Truffle安装命令
npm install -g truffle
查看Truffle版本号
truffle -version
3. Sublime Text
这款著名的编辑器就不多介绍了,安装也比较简单,大家自行安装即可。
进入开发
1. 初始化合约
新建一个文件夹作为工程目录,打开PowerShell,cd到该目录下,执行以下命令:
truffle init
执行成功后,在工程目录下会生成相应的框架文件和模板代码。
2. 编写合约代码
- 用Sublime Text编辑器打开上面的工程,在contracts目录下新建文件“HelloWorld.sol”,并编写以下内容。
pragma solidity ^0.4.4;
contract HelloWorld {
function show() returns (string) {
return ("Hello World!");
}
function plus(int a,int b) constant returns (int) {
return a + b;
}
}
- 在migrations文件夹下新建文件“2_deploy_contract.js”,并输入以下内容
var HelloWorld = artifacts.require("HelloWorld")
module.exports = function(deployer){
deployer.deploy(HelloWorld);
};
- 修改配置文件
打开位于根目录的truffle.js文件,改成以下内容。
module.exports = {
networks: {
development: {
host: "localhost",
port: 8545,
network_id: "*" // 匹配任何network id
}
}
};
3. 编译智能合约
编译,就是把合约代码转换成可以运行在以太坊虚拟机上的字节码。整个过程只需要一条命令:
truffle compile
编译成功后,在工程根目录下会自动生成一个build文件夹,存放相关信息。
4. 运行私链网络
上面我们已经写好了合约代码,下一步就是将合约部署到链上,而在这之前,我们需要先启动私链网络。
- 启动私链
geth --datadir "E:\Ether\private" --networkid 15 --port 61910 --rpc --rpcport 8545 --rpcapi "db,eth,net,web3" console
打开一个新的命令行窗口,启动私链网络后保持窗口不关闭,等待合约部署。
注意,参数rpcport的端口号必须和工程中truffle.js里配置的一样(这里是8545)。
- 解锁账户
personal.unlockAccount(eth.accounts[0],"123456")
由于部署合约需要消耗以太币,所以需要解锁账户以提供资金来源,如果你的新账户没有以太币,则需要先挖矿。
5. 部署智能合约
上面的工作都准备好后,才能部署我们的HelloWorld合约。
打开另一个PowerShell窗口(注意这时打开了两个命令行窗口,私链所在的命令行不需管它)。
在命令行cd到工程的根目录,执行以下命令:
truffle migrate
执行命令后,会输出“Deploying Migrations...”,表示正在进行部署,你不管它它会一直卡住,那怎样才能部署成功呢?
答案是通过挖矿。
智能合约的部署也算是某种类型的交易,需要矿工打包进区块链。而我们自己就是私链里唯一的矿工,因此接下来执行挖矿命令:
miner.start()
挖出一定的区块后,两个命令行窗口都会同步输出一些信息,如果没有报错,则为部署成功。
与智能合约交互
智能合约部署成功后,下一步就是和智能合约交互。所谓交互,主要是指通过API的方式执行合约里的方法。比如常见的代币合约,肯定都有获取余额,交易等功能,交互的目标就是要使用这些功能。
在我们的HelloWorld合约里,定义了两个简单的方法:show和plus。下面我们尝试执行这两个方法。
与智能合约交互,有两种方式。
1. 通过truffle console
在PowerShell进入到合约代码的根目录,执行以下命令:
truffle console
进入truffle控制台之后,执行以下命令:
HelloWorld.deployed().then(instance => contract = instance)
这时控制台会输出一大串东西,交互接口启动完成后,即可调用合约里面的方法
contract.show.call()
contact.plus(20,33)
下面是方法的执行结果:
补充一点,调用方法的语句如下:contract.方法名.call(),比如上面的show方法。
但plus方法却可以直接调用,不用加call(),是因为我们在代码里定义方法的时候,加了constant关键字。
- 通过ABI((应用程序二进制接口)的方式
如果不想通过truffle,还可以通过ABI的方式,直接在私链网络里与智能合约交互。
首先打开合约工程下的build文件夹,打开contracts下的HelloWorld.json文件,复制"abi"节点下的内容。
[
{
"constant": false,
"inputs": [],
"name": "show",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "a",
"type": "int256"
},
{
"name": "b",
"type": "int256"
}
],
"name": "plus",
"outputs": [
{
"name": "",
"type": "int256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]
由于里面有很多换行和空格,需要对文本进行格式化,参考以下网址:
文本格式化
最终组合成以下命令
abi = [{"constant":false,"inputs":[],"name":"show","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"int256"},{"name":"b","type":"int256"}],"name":"plus","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"}]
打开运行私链网络的命令行窗口,执行以上命令。
另外,在HelloWorld文件中,还需要提取一个内容:智能合约部署的地址。
"networks": {
"15": {
"events": {},
"links": {},
"address": "0x74194d0c77a7ab79d003f7492f2298347458efbb",
"transactionHash": "0x889d7d7d5ab525ac79fca2ab52d2a09b534d24e89afa203d07e4e8ac94028253"
}
},
上面只是一个示例,你可以在文件末尾处找到相关信息,笔者的address是:0x74194d0c77a7ab79d003f7492f2298347458efbb
拿到地址后,回到命令行,输入以下命令:
contract=eth.contract(abi).at("0x74194d0c77a7ab79d003f7492f2298347458efbb")
成功后就可以调用合约里面的方法了。
结语
这一章,我们学习了如何创建、编写和部署智能合约,以及如何与合约进行交互。
但这个demo显然无法满足大家的要求,下一章,我们将学习如何创建一个标准的代币合约。