如何在以太坊上发布自己的智能合约

96
higer
3.3 2017.07.15 11:36* 字数 1912

我们现在基本都知道以太坊是一个区块链应用开发平台,基于以太坊构建的网络和智能合约语言,我们可以实现各种各样的与现实世界接近的分布式应用(DApp)。很多人沉迷于数字货币的炒作以及对部分ICO项目的疯狂投资,但实际上,很多的项目正是利用大家对区块链,特别是智能合约不理解这种“信息不对称”,来实现让大家乖乖交出自己的ETH的。

今天通过下面一场实操告诉大家,智能合约开发没那么难,那些ICO白皮书里面宣传得花里胡哨的内容不要轻信,我们理应在懂得一定原理的基础上再去深入分析其价值是否成立。今天演示一个最简单的众筹合约如何实现。

一、智能合约的演变

先铺垫一下,大家看看从比特币到以太坊,智能合约是如何演变的。注意下方智能合约的位置,这个位置表明上方的应用(APP)必须通过智能合约来实现对应区块链网络的功能。

区块链架构

那么,我们看一个简单的例子,就是A转账给B,在比特币和以太坊中大概都怎么实现的:

比特币脚本语言
智能合约(伪代码)

上面的示例对部分人可能比较难理解,但是也应该有一个大致的感受,就是:以太坊智能合约实现的方式貌似能看懂,比较易读。

事实也是这样的,智能合约使得区块链的扩展性更强,且实现上更简洁,从而让以太坊发展成为目前最大的一个区块链开发平台。为了理解方便,我对智能合约的定义是:

智能合约就是区块链环境里的可执行代码。

二、搭建以太坊私有链(Private-Net)

为了在以太坊上发布智能合约,必须安装以太坊Mist钱包,注意不能是imToken或Myehterwallet这类轻钱包。Mist钱包不仅包含钱包的所有功能,还包含智能合约部署功能,其他钱包目前不支持。

另外,这里有个背景需要说明:

区块链的形态分为三种:公有链,联盟链,私有链。比特币和以太坊目前是最大的公有链,联盟链是企业使用较多的,以IBM hyperledger fabric为代表,私有链是公司内部或者个人需要而搭建的一个网络。

默认情况下,启动Mist钱包会同步所有以太坊区块信息,即连接的是公有链,这会花费非常长的时间及占用大量的硬盘空间,所以除非自己真的需要发布智能合约,否则,尽量避免使用公有链。本次演示是在私有链中进行的,下面是基本的配置方法:

1、安装Ethereum Wallet钱包(即Mist钱包);

2、安装Geth(以太坊挖矿程序);

3、创建私有链:

参考http://blog.csdn.net/sportshark/article/details/51855007

私有链搭建成功后,每次先启动geth,使用命令“geth --identity "PICCetherum" --rpc --rpccorsdomain "*" --datadir "D:\Program Files\Geth\geth\chain" --port "30303"  --rpcapi "db,eth,net,web3" --networkid 95518 console”,然后在打开Ethereum Wallet程序,这样连接的就是私有链,你在启动时和启动后都可以看见“Private-Net”字样。

三、开发一个属于自己的最简单“众筹”合约

假设我是个骗子,我写了一个漂亮的白皮书,然后我需要开发一个众筹的智能合约,让大家往这个智能合约上打ETH,等众筹时间到了,不论资金是否筹集满,我都把资金转移到自己账户上。

现在有一个基本的前提逻辑需要了解:

在给以太坊智能合约发送ETH的时候,这些ETH是被智能合约锁定的。

因此合约在开发时,一方面要支持大家发送货币,另外一方面要支持从这个合约里把锁定的ETH提取出来

打开钱包,进入Private-Net,点击界面“Contracts”,选择“Deploy New Contract”(部署新的智能合约):

部署合约界面

点击后可进入一个合约编辑界面,大家通过“SOLIDITY CONTRACT SOUCE CODE”找到。到了这个关键的地方,我这骗人的合约怎么实现呢?

Contract NBICO {

address public organizer;

event FundTransfer(address backer, uint amount, bool isContribution);

function NBICO() {

organizer = msg.sender;

}

function destory() {

if(msg.sender == organizer) {

suicide(organizer);

}

}

}

上面代码已通过实际操作成功,大家不妨事实。看下面这个截图:

合约概况

如上图所示,上面有三个合约,BIGONE是收到转账后合约锁定了100个ETH的情况,SMALL ONE 是我通过调用合约中的“destory”方法,实现“自杀”(suicide),即合约失效,同时资金转移到合约创建人的账户中,因此显示为灰色,且余额为0。

针对上面的代码解释如下:

1)定义了一个合约名为“牛逼的ICO”:NBICO

2)定义了组织者地址(organizer)和转账方法(FundTransfer)

3)在初始方法(NBICO)中设置organizer的地址;

4)在销毁方法(destory)中判断当前操作是否为组织人organizer发起,如果是,则进行“自杀”(suicide),自杀后,智能合约不可用,智能合约上锁定的资金全部转移到organizer名下。

四、后记

你或许不太懂上面代码的具体含义,或者实际动手操作起来有一定难度,但是通过这么一个演示,你应该明白了:

通过廖廖几行代码,就可以实现一个简单的“众筹”,如果你相信我白皮书里说的。其实,最简单的众筹是:直接给我转账,如果没有白皮书,就依赖于你是否信任我这个人

所以ICO时可信度可以这么描述:

1)白皮书有一定的可信度,主要目的是为了信息透明,以后可以看是不是这么做的,但不能完全相信白皮书;

2)团队的可信度更高,说白了投资一个ICO更多的是看中这个团队,而某些项目看中某个人也是有可能的;

3)众筹智能合约的代码可信度最高,因为通过阅读代码可知道,发起方是否可以随意提取代码。比如我上面这个智能合约,懂行的人一看就知道有问题。

因此,众筹智能合约必须开源!!!


好了,以上就是昨天课程里讲的基本内容,如果对我的课程感兴趣,甚至对我的整个系列感兴趣,都可以点进去看看,相信你会不虚此行。

》》》》戳此进入。


扫描进入
日记本
Web note ad 1