15分钟搞定以太坊智能合约开发

比特币带火了区块链,而号称区块链2.0的以太坊现在已然成为了比特币的接班人.都是区块链,以太坊的区块中不仅可以存储交易记录,还可以存储代码,其实比特币也有一个脚本语音,但是它其实只能执行几个动作,比如转账之类的.以太坊它有一个图灵完备的EVM虚拟机,这意味着可以用它来执行所有可能的指令.当你写好智能合约之后可以部署在区块链网络中,需要执行合约的时候,只需要对合约地址发送一笔交易即可.简单理解以太坊智能合约就是可以被EVM执行的一段代码,这段代码会被部署到区块链上.下面我们来学习如何开发一个以太坊上的智能合约.

如果你还不太了解区块链,可以点击这里查看上一篇文章.

今天会提到一下内容:

  • 以太坊开发环境搭建和合约部署
  • 如果获取以太坊测试网络Rinkeby的ether代币
  • solidity语音和普通编程语音的差异
  • 一个简单的智能合约
  • 合约部署之后的执行和管理

开发环境搭建

在开发之前,我建议可以先下载一个以太坊官方钱包,Ethereum Wallet并且同步一下最新的测试网络的区块,我们会在测试网络Rinkeby中进行开发.下载以太坊官方钱包不是必须的,主要是我觉得使用以太坊官方钱包进行合约部署比较直观方便,使用MyEtherWallet或者Metamask或者Parity钱包都可以进行合约的部署.部署方式大家可以在网上搜索一下.

下载以太坊官方钱包:

以太坊官方钱包Mist以及切换到Rinkeby测试网络

选择一个喜欢的代码编辑器

2.我使用的是Visual studio code.然后在vscode中下载了一个Solidty插件.

vscode中的solidity插件,提供solidity代码高亮功能

如果你不喜欢vscode可以选择Ethereum官方开发的remix在线编程环境地址在这里:http://remix.ethereum.org/

获取测试网络免费的以太坊代币

我们先获取一点以太坊方便我们后面的部署,测试网络中的以太坊可以免费获得.在以太坊钱包中找到你的钱包地址. 私用Twitter或者facebook或者Google+发送一条消息,消息内容是你的以太坊地址.例如我发的Google+的.

复制这个地址

在设计网络上发布一下地址

获取到你发布的链接,比如我的是这个链接:https://plus.google.com/u/1/102443899388937419223/posts/Sub4L88DKSd
然后到 https://www.rinkeby.io/ 选择Crypto Faucet输入上面这个链接,你就可以获得免费到测试网络的以太坊.
在这里输入你社交网络的链接

Solidity的语法有何不同

如果你是以为很有经验的程序员,我只需要提出它和常见编程语音的差异,这样基本只需要几分钟就可以理解Solidity这一门语音了,如果你是一位从来没有接触过任何开发的人,这里有一篇指南详细介绍了Solidity的语法.点击这里查看完整solidity文档
Solidity的语法和我们常用的编程语音其实很相似,下面是一些差异

  • 基本数据类型:
address: 存储以太坊钱包地址,比如当有用户调用你的合约的时候,你要获取调用者的地址,就是一个该类型的数据
mapping: 相当于一个二维数组,比如 mapping (address => uint) public balances; 可以设置mapping[地址]=xxxx

事件声明:
当你需要保留一些日志的时候,可以用事件声明 比如:

event Transfer(address indexed from, address indexed to, uint256 value);

这里声明了一个转账事件,这个本身没有什么作用,不会影响合约的执行,是用来生成日志数据的,但是对于一个代币合约,这种事件通常是必要的,一个是方便开发者查看日志,二是很多网站是通过这种转账日志来显示你代币的相关信息的,包括有一些交易所代币是否到账,是否成功转账,也会参考这个日志数据.

当你明白上面的之后我们来看一个合约,其实就很容易明白了.


pragma solidity ^0.4.16;
//用contract声明一个合约,现在我们声明了一个Coin合约
contract Coin {
    //声明了一个minter的地址类型的变量,public表示可以被外部访问
    address public minter;

    //声明了一个二维数组变量balances 
    //比如初始化的时候 我给地址A的balance设置为100,B的balance设置为200
    //可以这样些 balances[a] = 100; balances[b] = 200;
    mapping (address => uint) public balances;

    //声明一个转账的事件
    event Sent(address from, address to, uint amount);
    
    //这个构造函数的代码仅仅只在合约创建的时候被运行。
    function Coin() public{
        minter = msg.sender;
    }
    
    //挖矿的方法,就是可以给某个人的账户增加余额
    function mint(address receiver, uint amount) public{
        if (msg.sender != minter) return;
        balances[receiver] += amount;
    }
    
    //发送方法 比如A发送金额给B
    function send(address receiver, uint amount) public {
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Sent(msg.sender, receiver, amount);
    }
}

合约部署

上面就是一个建的代币合约了,现在我们进行部署这个合约
打开Ethereum wallet的或者mist,点击合约


image.png
image.png
image.png
image.png

点击部署,这个合约就被部署到区块链网络上了.

image.png

部署合约和发送普通交易是类似到,需要等待矿工打包部署,所以需要一点事件进行打包.等待带包完成,确认成功之后,我们可以回到合约管理页面,点击刚刚部署的合约,就可以对合约进行管理,或者执行它对应的方法,刚刚我们写了2个方法,一个mint和一个send方法,现在我们可以去执行一下对应的方法.
image.png

点击刚刚部署的合约,进入合约管理界面

image.png

我们执行一下mint方法,mint方法就是给创建者账户的余额增加金额的方法,我们给创建者增加500的余额,然后再在左边查询一下创建者的地址下余额是多少.

  //挖矿的方法,就是可以给某个人的账户增加余额
    function mint(address receiver, uint amount) public{
        if (msg.sender != minter) return;
        balances[receiver] += amount;
    }
image.png

执行之前账户余额:


image.png

执行之后账户余额:


image.png

然后我们勾选上watchEvent可以看到我们的代码 event已经执行有一个event输出.

上面就是完整的一个最简单的以太坊的代币合约的开发和部署了,但是以太坊上的代币合约其实都是符合ERC20标准的ERC20是以太坊社区的规范,具体可以查看这里,就是它定义了几个标准接口.只需要实现这几个标准接口就可以发布一个ERC20的代币.https://github.com/ethereum/EIPs/issues/20

其实在上面和合约的交互中,我们都是使用以太坊官方钱包来执行一个合约方法的,其实还可以使用其他方式,比如您写了一个应用,只要能够和区块链交互,可以封装一些界面和UI就可以执行智能合约了.

好了,由于篇幅有限,今天就写到这里,其实我最开始是打算写如果实现一个类似一个Cryptokitties的简易版合约的介绍,由于篇幅关系,大家可以尝试自己去实现一下,其实非常简单.现在国内很多它的模仿者,比如小米的加密兔它的实现其实真的是非常简单的,代码都差不多.这个东西也并没有什么用,可能在营销上有一点用,个人觉得是没有一点其他的实际意义.

智能合约有什么用?
智能合约解决了信任问题.当年我们在淘宝买东西,怕付款之后卖家不发货,所以有了支付宝,支付宝担任中间人角色.

买家先付款给支付宝==》支付宝通知卖家发货 ==> 买家收到货之后通知支付宝 ==> 支付宝放款给卖家.

如果我们有智能合约的话,其实我们可以实现一个买卖商品的合约,比如买家需要购买商品,就向合约发送一笔资金,合约资金收到之后,自动发送消息卖家,卖家发货给买家,买家再通知合约放款即可.智能合约就是根据你预先设定好的规则,比如触发某个条件,就执行某个动作.同时合约一旦部署就无法更改(一旦写入到区块链的数据是无法更改的),它的就是定义一套规则,永远按照这一套规则执行.

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

推荐阅读更多精彩内容