00:00
我把这个全部删掉,重新来来看一下这个完整的过程啊,大家第一次进入到re页面的时候,其实看到的应该是这个合约,大家都看到了,对吧?这是昨天我们已经跟大家说过了,这是,呃,相当于也是官方给出的一个投票的合约事例,所以remix里面也把它集成进去了,打开之后就有这一个投票的例子,呃。哦,这为什么会突然刷新?好,这个例子其实是比较简单的,大家如果有同学感兴趣,已经把它认真看过的话,会发现它的逻辑其实也不难,但是这个因为涉及到solidity里边比较多的一些语法规则,所以现在我们还不讲,那我们现在是要写一个简单的水龙头合约,那我们肯定就是要新建一个文件,直接点点这里的加号,我们就可以新建一在remix上新建一个文件,它默认的后缀已经有了sol的文件,那这就是solidity的原文件。
01:08
我们给他一个名字叫做水龙头for,然后进入到这一个合约里边,我们开始敲代码,首先我们需要做的是,大家还记得啊,昨天我们已经大概的看了一下那个合约的样子,对不对?首先我们要定义的是一个它的指定的编译器版本,它的语法是problem solidil。然后我们看到有一个这样的小符号,它是表示就是要求这个版本以上如果不加这个符号的话,那就相当于是指定版本,就必须用这个版本的编译器,大家可以自己去试啊,我们现在还是按照就是给的示例一样,零点四点多少我忘记了,这个没关系,应该我们随便给一个版本就可以。0.4.17现在的,呃,我们网络这么慢吗?大家看到这边的编译器好像还在loading中啊,大家那边的编译器下下来了吗?好吧,那可能我们这个编译这一块的演示可能要等到网络稍微比较好一些的时候,至少得把编译器下下来,大家看到它是在动态加载编译器的,呃,现在这个状况肯定是不行啊。
02:26
好,那我们先不管编译的这个事情,我们就先写把我们的代码前面第一行programma solidity,这个0.4.17,我们就定义了编译器版本一定要在00.4.17以上,接下来就是我们的合约主体,那大家还记得啊,它的定义,定义一个合约其实很简单,就是contract。关键字合约就相当于是一个类一样,然后它的类名,这个大家如果要是有有学Java的同学应该发现这个跟Java的类的。
03:00
这个定义是一样的对吧,要求它的名字都是一样的啊,然后后面用一个花括号括起来,下面就是整个这个合约的内容。合约起。然后在里边呢,我们就想到我们这个合约的主要功能是什么呢?其实就是要转一个,呃,就是有一个水龙头的功能,点一下能够发一个币出来。那这样的话,我们就很自然的想到我们就定义一个函数嘛,函数关键字方式,这个跟我们熟悉的所有的编程语言都是这么定义,呃,Function,我们随便给一个名字吧,呃,比如说这个实现的叫叫提取,叫withdraw,后面跟上函数,函数的参数。我们点一下的时候要传什么参数,肯定就是说我点一下是发多少币,或者说就是我们这里可以定义成不发,就是不给参数,那就是点一下我们就给它固定的B,这样也是可以对吧?呃,那我们昨天那个直接大家看到的是把那个参数传进去了,那我们先实现一个更简单的,那就是我直接不给参数也是可以的,就直接就是withdraw,然后后面会有一个public定义,就是表示这是一个公共可见的函数,如果我们不定义public的话。
04:22
那我们在外面就看不到这个函数,也就是说我们不能从外部去调用。大家如果其实学过其他的编程语言,肯定都有类似的定义,对吧?Public private,所以对大家来讲都不陌生。好,里边就是我们要的这个函数题了,函数题主要是干什么呢?那肯定就是说发币嘛。那我我们在这里假如说参数也不传,什么都没有的话,那其实就是一点就直接调用,那其实也不需要有什么条件判断,直接发就好了,那当然这个安全没有什么安全性可言啊,就是我们现在什么都不考虑,那最简单的一种方式就是直接发一个B,比方说我们就MSG.sander这个昨天跟大家提过一句,这相当于都是solid里边本身的关键字,它表示的它可以理解成是有点像不能可能不能叫全局变量,大家可以认为它就是一个,呃,一个固定的一个标志符,指定的就是这个合约调用的地址,调用者的地址message s发币也是一个固定的内置函数,叫做transfer。
05:33
然后我们就把要传的数量传进去就可以了,那比方说我们传一个,呃,大家可能想我我要发一个以太的话,我传一个一,大家要注意肯定不是这么写的啊,如果要是这里写一的话,每一次发会发发发什么东西,大家说一个一个伪,对就是十的负18次以态,然后我们在余额里面可能都看不出来的,因为那个位小数位实在太多了,根本显示不出来,手续费都比这个贵,所以大家如果要是想发一个以太的话,也我没没数这个零啊。
06:10
是六个了,对吧。这多少个了,我这眼神不好使。是18个吗?大家可以帮我校验一下啊,这没关系,其实就是我们指定一个数数而已,然后它的单位是。假如说我写的没有问题,那一后面18个零,那我们这一次的转账。就是这一次的发送仪态,就是发送一个仪态对吧?呃,昨天我们可能是给的17个零,那就是发0.1仪态了,就是这个大家都可以随便去设计,如果觉得这个水龙头我们给的太多的话,就给的少一点。呃,大家看,其实这就是最简单的一个实现,这就已经实现我们要的功能了。我们可以,哎哟,这个它不能在线编译,这个很很耽误我们来来学习它的这个过程啊。
07:08
其实如果它可以编译的话,我们直接就可以看一下它的效果了。嗯,咱们这边我看看我开一个热点啊,会不会好一点,但是我开热点会不会大家连不上我VPN,呃,那个VNC。应应该是连不上的是吧,除非大家都连我的热点。好,那呃,大家可以先试着自己先敲一下这个代码,先熟悉一下它的语法结构,大家不要看这个,就这么几行,非常简单,这其实就是可能其他老师也跟大家说过啊,就是不要看着代码简单,呃,有些老师可能讲课风格不一样,就是有些老师是喜欢贴代码,有些老师可能是喜欢手手敲代码,我还是比较主张手敲代码的,而我觉得就是如果是自己是学习的话,老师讲课没关系,就是贴代码可能会速度更快一点,讲的更明明白一些,但是自己学习的话,一定是手巧,这个就是大家就是千万不要看着那个,因为文档里面都已经有了嘛,大家直接一粘粘过来就好了,呃,这个学习的时候不要养成这个习惯。
08:34
嗯,好OK,我现在切换热点之后,已经这里显示到这个我的编译器了,大家可以波板,哎哟,大家这么多人连我的热点可能也可能也不行啊,可能可能也会比较卡,大家先试一下吧,连上来之后大家可以就是。先先试一下,我我把这个分享给大家,就是大家搜一下WiFi,大家的电脑应该都有无线吧,嗯,搜一下一个叫做block chain的sid,然后密码就是2018BLOCK chain。
09:10
大家连上我的热点,然后先看一下我们是不是可以把这个编译器下下来,其实只要可以把编译器下下来就是,之后我们直接在这里能做编译也就可以了,只不过就是有可能我们那个要部署的时候没有把它,没有办法把它直接部署到区块链上。大家看一下可以吗?大概的说一下这个合约吧,大家可以看到啊,就是正常来讲,这一个合约版本是对的,那应该是可以通过的,应该是没有问题的啊呃,但是大家可能可以看到,就是这个跟咱们昨天写的那个函数是不太一样的。呃,具体有哪些不一样呢?首先一个就是说它里边根本就没有传参数嘛,啊这个其实也是非常理解,本来我们定义的函数肯定就是可以传参,也可以不不传参,那如果传参的话,就要把它的数据类型也带在前面,好现在我们把这个合约再做一个改动,就是我们传一个参数进去,现在是点一下固定的发一个数,那现在我们改成比方说要传一个到底多少的一个amount。
10:33
这就是说我们点一下这个按钮之后,我们想要的是把我们需要的这个数量要传过传过去,传给这个合约,然后合约把它作为入参拿进来,然后给我们水龙头发的这个币的数量呢,就是传进来的这个数量。那接下来大家应该还记得,就是如果我们有这个数量的话,基本的一个考量就是说我们肯定不能说别人输多大的数,我们都给都给发币啊,所以我们一定要有一个条件判断,这也是之后我们去设计智能合约的一个相当于是一个准则吧,就是一定要注意各种各样的边界条件,各种各样的安全性的检查和条件判断。呃,那我们再跟大家回顾一下它的条件判断用什么呢?用一个叫做require的一个关键词来定义它,其实就就像什么呢?可以直接说这样if amount大于。
11:38
比方说咱们昨天定义的就是啊,就是这么多对吧,我们随便写一个啊,然后就直接return。这就相当于有一个条件判断在这里,对吧,但是这样的条件判断其实是作为智能合约而言是不够安全的,所以整个小的开发,它就把这些所有的这种基于条件判断的这种安全检查全部都封装起来,块就是其中一个最常用的,它其实就相当于我要判断后面的那个条件一定是真的。
12:12
所以我们现在的写法一般就是啊,这个我们不要把它改了。刚才好像写了一个中文的。那这个条件我们肯定是要改,因为require的条件要求是里边必须为针,我们当然就不是说它大于的时候不行,对吧。好,大家可以看到,有了前面这一句条件判断之后,下面我们就可以继续给他发币了,那发币的就不是一个写死的定值,一个常量,而是我们前面传进来的这个amount,这就是我们写好的,诶现在啊,它只是取消了那个那个编译错误的检查而已,还是没有把编译器下载下来啊。
13:04
这个可能需要稍等一下,大家可能看到,就是我们编译成功之后,下面是有一个蓝绿色的小条,上面写的我们的何跃明水龙头,但是上面好像还有两个warning对吧?那个警告是什么东西呢?大家点开之后会发现它会跳到后边的一页里边去。就是后边的那个an analysis就是分析那个那个选项选项页里面去,大家可以看一下啊,我我就切到这一瓶来给大家简单的说一下啊,我已经切到了第三项。Analysis它分析什么东西呢?大家可以看到上面勾了这么多东西啊。然后下面有好多个选项都打着勾,然后最下边还有两个是我们的warning的那个具体内容,大家看到这一项了是吧,这一项其实就是在对我们的智能合约做一些细致的分析。第一个第一栏的这一个选项,它叫做security,就是安全性,我们就看一个吧,就看它上面说的是什么东西啊,第一个说的是transaction or if transaction origin is use。
14:15
这这是什么东西,是一个特殊的一个属性,特殊的一个对象。这个东西是很底层的东西,平常是不能用的,如果要是用了的话,他就会报一个警告你,他认为这个东西不安全,其实简单说就是这样,或者我们看一下下面它还有一个叫gas and economy,就是跟GA相关的,跟费用相关的一个警告设置,第一个选项叫GA cost,就是我们要花费的GA。后面说one,警告if,如果我们我们写好了这个函数,它需要的guess量太大的话,他就会报警告。
15:00
各种各样的,像可能跟我们的性能有关,可能跟我们的安全性有关,也就是说我们有可能出问题的地方,他全给我们警告出来回,当然大家如果不想看警告的话,可以把这些勾都打掉啊,像我刚才这样,呃,那这样的类型,如果我们再出现的话,那他就不会警告了,因为有些同学可能大家是一个编程习惯,是就是就是很完美主义,就是只要看到的warning,所有的东西都要去处理啊,都觉得应该是要要0WARNING才可以,呃,如果大家是这样习惯的话,那就把这个东西可以再去熟悉一下,再去看一下,但是这个东西我们现在不会去专门讲啊,因为我们现在只是简单的先去理解一下智能合约是怎么跑,呃,怎么跑起来的,怎么玩的。好,刚才大家已经都已经看到了,就像我现在的这个页面,呃,刚才我们这个合约已经写完了,而且没有语法错误编译成功,那接下来编译成功的一个合约我们应该干什么呢?怎么样能让它真正生效呢?我们不是想实现一个水龙头吗?这个水龙头怎么样才能让我们点一下就就发一个币呢?大家应该想到就是我们写程序都是一样的步骤,先编译完了之后肯定要就是就是打包发布,发布我们的可执行程序嘛,对吧,就是像如果在c Java之类的。
16:20
不同的编程语言可能有不同的方式,那在我们的智能合约里边,它编译之后。我们之前给大家提到过,编译之后,编译成的也是字节码。所以有了自检码之后,我们只要把它部署到区块链上,然后它就可以直接去应用,我们可以看一下怎么样去部署呢?第二个选项卡。下面有一个红色的按钮叫做deploy,对,这就是我们可以去选择的一个部署的按钮啊,当然我现在因为这个网络很差,他似乎他似乎都没有检测出我的账号啊。
17:04
好,是因为我没有登录,对不起啊,错怪他了,好诶好,我的瑞克测试网络大家还记得吗?昨天我在那个RI的水龙头上去点了一个,就分享了一个我的呃,Google plus的一个链接,然后我去要求他发给我18.75个以测试以态,大家还记得吗?啊,现在终于到账了啊,当时这个网络很卡,我们都没有看到它的效果,但今天我们看到,呃,大家如果要是也感兴趣的话,也想在那个riba上去玩一玩的话,其实也是很好玩的,而且他这个给的以态比较多,大家可以直接申请了之后这个可以挥霍一笔啊,大家看这个18.75个以太值3883刀啊,还是很值钱的是吧?呃,好,那现在我们如果登录这个ma ma之后,就会发现这里的账号就出现了,它会自动把我们的账号是就是账户识别出来,地址写在这里,这个。
18:05
之后我就可以去点deploy,现在我们可以去点deploy,就是部署的意思,它的作用就是把我们刚才已经编译好的合约自解码直接部署到区块链上,它部署到哪个链呢?就是我们现在选的这个链去deploy。哦,确实有点慢啊,就现在他还没有等到交易确认的这个打开的这个页面就那么慢,确实是好吧,那那我觉得这个我还是先断开网,然后给大家看看结果吧,呃。大家可以先把我刚才就是给大家看的第三个选项卡分析的analysis,还有第二个这个wrong,这里的这个deploy可以看一下,然后看一看在这个要部署的这一页上面,上面的环境自己选择的网络是是哪个网络,然后下面自己的账户是不是现在自己mama登录的那个账户,后面他会把我们的那个账户里边的余额也显示出来,大家看一下是不是都一致啊,然后确认了之后,下面它还有一个GA limit,这个其实也是自己可以调的。
19:20
大家想调也可以调一调,然后大家可以像我刚才那样去点一下这个deploy去试一下,看看是一个什么效果。
我来说两句