动手实践以太坊智能合约——分歧终端机

一、准备工作

本教程所用环境:windows 7 64bits

安装geth: https://ethfans.org/wikis/Ethereum-Geth-Mirror

安装Mist钱包浏览器: https://ethfans.org/wikis/Mist-Mirror

安装truffle开发框架:

首先要安装nodejs: https://nodejs.org/en/

Cmd命令安装truffle: npm install -g truffle

二、实践过程

1.geth创建私有链,采用rpc方式

geth –datadir chain –rpc

以太坊私有链沿用上一篇文章《手把手教你搭建以太坊私有链》

2.启动mist钱包浏览器

mist -rpc http://127.0.0.1:8545

注:geth创建的私有链,其默认端口就是8545

该命令会拉起带界面mist钱包浏览器,如下:

3.Geth attach并解锁帐号0

geth attach ipc:\.\pipe\geth.ipc

然后用命令personal.unlockAccount解锁帐号0

4.Truffle启动智能合约

首先下载智能合约代码: https://github.com/lspbeyond/eth_terminator

注:非常勿扰电影里有个分歧终端机,这个智能合约的点子来自与此,智能合约代码细节本篇不展开讲,会在后续文章中单独讲智能合约工程和solidity

Cmd进入eth_terminator代码所在目录,如下命令编译智能合约并迁移到私有链网络中:

truffle migrate --network ourTestNet

注:你可能奇怪上面的命令是如何跟私有链网络关联起来的,奥妙在truffle-config.js 的ourTestNet配置,如下:

module.exports = {
  // See 
  // for more about customizing your Truffle configuration!
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*" // Match any network id
    },
    ourTestNet: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*" // Match any network id
    }
  }
};

上述命令执行完毕后,迁移会处于如下卡住状态,原因是没有启动挖矿。

Using network 'ourTestNet'.

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

在geth attach的窗口启动挖矿miner.start(),通过miner.stop()停止挖矿。

5.进入控制台,获取合约地址和描述

truffle console --network ourTestNet

然后在控制台下分别获取合约地址及合约ABI描述

truffle(ourTestNet)> terminator.address
'0x97f16374aea6568a405441bbc0740b59792e201e'
truffle(ourTestNet)> JSON.stringify(terminator.abi)
'[{"constant":true,"inputs":[],"name":"addrWinner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"addrPlayer1","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"addrPlayer2","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"GameDrawEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"winner","type":"address"}],"name":"GameOverEvent","type":"event"},{"constant":false,"inputs":[{"name":"chosen","type":"uint8"}],"name":"playGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]'

6.在mist中操作合约

在mist中"新增观察合约",如下:

然后在弹出框输入合约地址、合约名称、合约描述,合约名称随意,如下:

如下进入合约详情页面,左边是合约读信息,右边是合约写信息:

我们的合约非常简单,只有一个Play Game写操作,其中参数Chosen的值0,1,2分别表示锤子、剪刀、布。

你可以选择Main Account,Chosen选择0,点击执行;

再选择Account 1, Chosen选择1,点击执行;

这个时候左边合约读信息并没有发生变化,原因是我们没有启动挖矿。

启动挖矿后,我们就可以看到Main Account获得了胜利(锤子赢了剪刀),如下:

三、小结

做个形象一点的类比,如果把智能合约程序和Web端程序类比,那么:

Geth创建的私有链——nginx的Web服务器

Mist浏览器——Chrome浏览器
Truffle开发框架——Dreamweaver

本教程只介绍了如何动手运行一个智能合约,如果想进一步学习编写智能合约,需要学习solidity语言以及多看智能合约源码,比如前段时间很风靡的加密猫游戏,《教程 | 如何在Ethereum上编写自己的CryptoKitties风格的游戏》

你可能感兴趣的:(区块链)