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

准备工作

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. 编写合约代码

  • 用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()

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

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显然无法满足大家的要求,下一章,我们将学习如何创建一个标准的代币合约。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容