以太坊智能合约从入门到实战3(智能合约之HelloWorld)

2018-04-24  本文已影响698人  GoMoon

准备工作

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

执行成功后,在工程目录下会生成相应的框架文件和模板代码。

image

2. 编写合约代码

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;
  }
}
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()

挖出一定的区块后,两个命令行窗口都会同步输出一些信息,如果没有报错,则为部署成功。

image

与智能合约交互

智能合约部署成功后,下一步就是和智能合约交互。所谓交互,主要是指通过API的方式执行合约里的方法。比如常见的代币合约,肯定都有获取余额,交易等功能,交互的目标就是要使用这些功能。

在我们的HelloWorld合约里,定义了两个简单的方法:show和plus。下面我们尝试执行这两个方法。

与智能合约交互,有两种方式。

1. 通过truffle console

在PowerShell进入到合约代码的根目录,执行以下命令:

truffle console

进入truffle控制台之后,执行以下命令:

HelloWorld.deployed().then(instance => contract = instance)

这时控制台会输出一大串东西,交互接口启动完成后,即可调用合约里面的方法

contract.show.call()

contact.plus(20,33)

下面是方法的执行结果:

image

补充一点,调用方法的语句如下:contract.方法名.call(),比如上面的show方法。

但plus方法却可以直接调用,不用加call(),是因为我们在代码里定义方法的时候,加了constant关键字。

  1. 通过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")

成功后就可以调用合约里面的方法了。

image

结语

这一章,我们学习了如何创建、编写和部署智能合约,以及如何与合约进行交互。

但这个demo显然无法满足大家的要求,下一章,我们将学习如何创建一个标准的代币合约。

上一篇 下一篇

猜你喜欢

热点阅读