深入浅出Ethereum 3 ----- 我们来写一个智能合约

更多信息可以前往 www.94eth.com

今天要讲的就是干货了,我们来写一个最简单的智能合约!

预备条件

  1. 你要有nodejs开发环境
  2. 对以太坊系统有一个最基本的了解

一个超级简单的智能合约

我们先写一个超级简单的智能合约--加法计算器。

  • IDE
    目前写智能合约比较通用的语言是solidity,我们的教学也从solidity开始。
    既然写code,第一个需要的就是一个顺手的IDE,这里推荐Remix,一个online的IDE。
    打开Remix后,其它的也不用看了,开始写我们的第一个contract.

  • Coding

    pragma solidity ^0.4.1;  //编译器要求
    contract Set {  
          address public owner;    //合约创建者
          uint result;
          function Set(){
              owner = msg.sender;
          }
    
          function assign(uint x, uint y) returns (uint){
              result = x + y;
          }
    }
    

Code的解释如下:

  1. 第一行是编译器需求,照样填写就行。
  2. contract XX {} 就是合约定义的语法,这里我们定义了一个叫做Add的合约。
  3. 合约里有一个owner字段,类型是address,我们的eth账号的地址就是这种类型,设置为public,这样其它用户可读。
  4. function Add为合约的初始化函数,创建合约其实就是用户往一个空地址发送了一条消息,然后就会执行这个初始化函数。
  5. 在Add里,将owner设置为msg.sender,msg.sender为一个预置变量,表示这个消息的发送者,在这里就是该智能合约的创建者的地址。
  6. function Go就是我们之后暴露给外部调用者的函数,接收两个uint,返回加和之后的值。

code写完后,我们可以复制到add.sol文件中.

  • 编译
    编译solidity程序需要对应的编译器,我们可以安装solc编译器。

      npm install -g solc
    

    然后编译我们刚刚写好的文件。

     solcjs --abi --bin add.sol     //add.sol就是刚刚写的程序
    

    这里--abi表示生成合约的abi文件,--bin表示生成代码文件, 编译成功后会在当前目录下生成一个abi文件和一个bin文件,两个文件的意思我之后会讲。

准备部署环境

  • testrpc
    讲道理,部署到真实线上我们是需要连接公共的区块链的,但这里我们只是做实验,所以部署一个仿真的单机区块链就行了。
    下载testrpc,它会替我们准备一个单机的区块链环境:

     npm install -g ethereumjs-testrpc
    

    然后单独启动一个命令行,输入:

     testrpc
    

    它会显示出一堆内容,最后一行应该是:

     Listening on localhost:8545
    

    ok,testrpc就在你本机启动了一个区块链,在8545端口上等待rpc请求。

  • 连接到testrpc
    首先,连接testrpc需要web3.js,继续在刚才那个sol源程序文件的路径,安装web3.js

      npm install web3.js@0.20.1    //我的机器安装最新版本有问题,所以安装的0.20.1版本
    

    然后,启动node,连接上我们单机的区块链:

      node
      >var Web3 = require("web3");
      >var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
      >eth = web3.eth
      >eth.accounts    //显示当前的账号
    

    现在web3对象就是我们的区块链连接了,我们就是要通过这个web3将我们刚写的合约部署到本机上的区块链里。

  • abi文件和bin文件
    现在该回头了解下我们刚编译生成的abi和bin文件了。
    abi文件是我们的合约对外的接口描述,以后其它人要调用我们部署的智能合约的话,就需要知道我们的合约有哪些方法可以调用,这个就靠abi文件。
    bin文件是我们的智能合约的源码,这个是要部署到区块链里,以后让挖矿程序帮你执行的。
    所以我们需要做的事,是首先根据abi文件创建一个contract的类,然后将这个类结合源码一起部署到区块链上,最后会得到部署的区块链实例的地址。
    当其它人需要调用我们部署的合约的时候,首先需要根据abi文件创建一个类,然后将这个类指到我们刚部署的地址上,这样他们就有了一个指向智能合约的代理,通过这个代理,他们就可以调用智能合约的函数了。

部署

  • 读取abi文件和bin文件

     >abi = JSON.parse(fs.readFileSync("xxxx.abi").toString())
     >code = fs.readFileSync("xxxx.bin").toString()
    

    abi文件是json格式的,读出来后用JSON解析下,bin文件就是编译源码,直接保留

     >contract = eth.contract(abi)
     >deployed = contract.new({from: eth.accounts[0], data: code, gas: 470000})
    

    deployed就是部署的实例了,contract.new就是部署,接收的参数里from表示用哪个账号去创建,这个账号的地址就会是contractg构造函数里的那个msg.sender,也就是这个合约以后的owner了

      >eth.accounts[0]
      >deployed.owner()
    

    发现没有,我们创建合约时填入的eth.accounts[0]就是deployed.owner(),这就是我们的合约Add的构造函数执行的结果。

      >deployed.address
    

    这样可以获取部署的实例的地址,请复制下这个地址值,每个人运行之后的地址值应该都不一样,我这里是0xd0248b7c71bce1400f595ee818a7a619db58b4b2。

    我们现在可以把自己当做另外一个使用者,获取了abi文件和合约地址,现在我们要调用该合约。

      >c = eth.contract(abi)
      >instance = c.at("0xd0248b7c71bce1400f595ee818a7a619db58b4b2")
    

    首先根据abi文件构造合约接口,然后指向合约部署的地址

    >instance.owner()
    >instance.Go.call(1, 2)
    >instance.Go(1, 2, {from:eth.accounts[0]})
    

    看,我们可以调用部署的合约了,这里我们就调用了合约的Go函数,注意这里使用了两种调用方法Go.call()和Go(),这两种有什么区别呢?

    Go.call()只是在本地运行环境里调用了Go方法,并不会实际对区块链产生影响。这里我们只是做一个加法运算,所以本地调用就可以得到Go.call(1, 2) = 3了。
    直接调用Go()是会真实发出消息,最后加到区块链上的,因此必须指明发送者账号。而且返回值是一个长长的地址,这个地址是刚发出的消息最后在区块链上的编码位置。有些接口的调用是会改变智能合约的状态的,这个时候就必须直接调用Go方法。

    只要之前运行的testrpc不退出,当前这个区块链上就一直有我们刚刚部署的智能合约在。

    发送到真实的区块链网络上和发送到测试区块链上有稍许不同,这个我们之后再谈,小伙伴们,快来写下自己的第一个智能合约吧!


QQ群:654894791

微信公众号: 94ETH

官网: https://www.94eth.com

头条号: 周期与泡沫


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