以太坊Solidity开发入门(大师篇)

  了一些随机性的来源我们的合约已经有,尸战斗中去计算结果可以用进我们的僵。

  以太之后在你发送,约的以太坊账户中它将被存储进以合,加一个函数来从合约中把以太提现并冻结在哪里 —— 除非你添。

  的以太坊开发教程分享一个很有趣。教你以太坊开发从零开始手把手。课你将创造一个僵尸工厂。。第1章! 课程概述 第一。

  一下先放。务器上的API函数的时候当你在调用一个普通网站服,元——你也不能传送比特币你无法用你的函数传送美。

  随机数来确定我们的战斗结果我们将用一个0到100的。uint定义一个,rand命名为,dMod函数的返回值设定其值等于ran,00作为参数此函数传入1。

  家和卖家的合约中或者在一个有卖,的地址存储起来你可以把卖家,的东西的时候当有人买了它,transfer(msg。value)把买家支付的钱发送给它seller。。

  而言对你,值是什么? 1社群最大的价,了解自己更深刻的,行的方向明确了前。2,己改变一些比过去的自,再懒不,。。不再。

  函数的人就是他们传入的_zombieId的拥有者么你能想一下我们如何添加一个检查步骤来看看调用这个?

  alue字段注意这个v,指定发送多少(0。001)以太JavaScript 调用来。象成一个信封如果把事务想,参数就是信的内容你发送到函数的。 —— 信件内容和钱同时发送给了接收者添加一个value很像在信封里面放钱。

  得怎么做了如果你不记,。sol— 不过最好先试着做一下查看一下zombiehelper,掌握的情况检查一下你。

  以太坊中但是在,(以太)因为钱 ,事务负载)数据 (,身都存在于以太坊以及合约代码本。 并付钱给另外一个合约你可以在同时调用函数。

  的modifiers然后我们有了自定义,wner和aboveLevel例如在第三课学习的!onlyO。自定义其对函数的约束逻辑对于这些修饰符我们可以。

  r函数向一个地址发送以太你可以通过transfe,将返回当前合约存储了多少以太然后this。balance。每人向我们支付1以太所以如果100个用户,nce将是100以太this。bala。

  有其优缺点每个方法都,何和这些数据打交道取决于我们打算如。教程中在这个,存在Zombie结构体中简单起见我们将这个状态保,nt和lossCount将其命名为winCou。

  们的游戏中假定在我,TH来升级他们的僵尸玩家可以通过支付E。中 —— 一个简单明了的例子ETH将存储在你拥有的合约,过自己的游戏赚钱向你展示你可以通。

  很多有趣的逻辑这就允许出现,一定的钱来运行一个函数比如向一个合约要求支付。

  几年内翻了十几倍以太的价格在过去,0。01 以太相当于1美元在我们写这个教程的时候 ,01 以太将是10美元如果它再翻十倍 0。0,戏就太贵了那我们的游。

  尸赢了之后会发生什么我们已经编写了你的僵,的时候要怎么做了该看看 输了 。

  生的事是这里发,用这个函数 (从DApp的前端)一些人会从 web3。js 调,样 像这!

  再创建一个函数所以我们应该,来设置levelUpFee允许我们以合约拥有者的身份。

   记住注意:,体中包装uint因为我们能在结构,的最小的 uint我们打算用适合我们。t8 太小了一个 uin,— 如果我们的僵尸每天都作战因为 2^8 = 256 —,就溢出了不到一年。16)—— 除非一个僵尸连续179年每天作战但是 2^16 = 65536 (uint,就是安全的否则我们。

  没标记为payable注意: 如果一个函数,面的方法发送以太而你尝试利用上,绝你的事务函数将拒。

  attack函数继续来完善我们的,erOf修饰符来用了现在我们有了own。

  要一些随机元素优秀的游戏都需,ty 里如何生成随机数呢那么我们在 Solidi?

  但不会往区块链写数据告诉我们这个函数不,块链读取数据它甚至不从区。但是它们在被内部其他函数调用的时候将会耗费gas)这两种在被从合约外部调用的时候都不花费任何gas(。

  如此酷的一部分 —— 它们是一种可以接收以太的特殊函数payable方法是让 Solidity 和以太坊变得。

  一个0到100的随机数在第六章我们计算出来。来决定那谁赢了战斗现在让我们用那个数,我们的状态并以此更新。

  律》 纪录一下最近画的韵律和韵律变体No。7基本图形 《shasta韵。图形的时候第一次画这,刚到家老公,背。。从我。

  然当,节点都在竞争解决下一个区块因为网络上成千上万的以太坊,区块的几率非常之低我能成功解决下一个。果奖励异常地高(比如我可以在硬币翻转函数中赢得 1个亿)这将花费我们巨大的计算资源来开发这个获利方法 — 但是如,得去攻击了那就很值。

  这里在,查看向合约发送了多少以太的方法msg。value是一种可以,是一个內建单元另外ether。

  决了一个PoW一旦一个节点解,试解决这个 PoW其他节点就会停止尝,事务列表是有效的并验证其他节点的,而尝试解决下一个节点然后接受这个节点转。

  的游戏中在我们,是简单地给lossCount加一僵尸输了后并不会降级 —— 只,发冷却并触,才能再次参战等待一天后。

  所有参与者来说是透明的因为区块链的全部内容对,问题变得很难这就让这个,在本课程讨论范围它的解决方法不,rflow 上的讨论来获得一些主意你可以阅读这个 StackOve。问以太坊区块链之外的随机数函数一个方法是利用oracle来访。

  后最,码中) 计算now它应该 (在一行代,endermsg。s,为uint—— 最后return% _modulus的值以及randNonce的keccak256哈希值并转换。天(!太拗口了听起来。理解不过来如果你有点,计算随机数的例子看一下我们上面,辑非常相似它们的逻)

  转合约——正面你赢双倍钱我们假设我们有一个硬币翻,掉所有的钱反面你输。反面 (random = 50算正面假如它使用上面的方法来决定是正面还是, 50算反面)random。

  和lossCount有了winCount,尸赢了战斗来更新它们了我们可以根据僵尸哪个僵。

  dMultiply函数d。 运行feedAn。g。sol里查看调用它的语句在zombiefeedin。_species)对于第三个参数 (, (现在它实际上什么都不做传入字符串 zombie。,在稍后不过,们愿意如果我,额外的方法可以添加,尸变的僵尸)用来制造僵。

  得一个双方僵尸的storage指针我们的函数所需要做的第一件事就是获,方便和它们交互这样我们才能很:

  篇) 第1章! 智能协议的永固性 到现在为止上一篇:以太坊Solidity开发入门(进阶,lidit。。我们讲的 So。

  基础篇) 第1章! 第二课概览 在第一课中上一篇:以太坊Solidity开发入门(,数用来生成僵尸。。我们创建了一个函。

  feeding。sol我们回到了zombie,调用检查逻辑的地方因为这是我们第一次。己的 modifier让我们把它重构进它自。

  的owner和onlyOwner注意我们使用Ownable合约中,经被引入了假定它已。

  中救起了他的妻子一个农民从洪水,却被淹死了他的孩子。后事,论纷纷人们议。他做得对有的说,以再生一个因为孩子可,。。妻。

  尸游戏来说对我们的僵,的僵尸输赢了多少场我们将要追踪我们。里维护一个 僵尸排行榜有了这个我们可以在游戏。

  — 你可以拥有一个不被任何人控制的去中心化市场有很多例子来展示什么让以太坊编程如此之酷 —。

  行一个节点如果我正运,的节点发布一个事务我可以只对我自己,分享它且不。窥我的输赢 — 如果我输了我可以运行硬币翻转方法来偷,我要解决的下一个区块中去我就不把这个事务包含进。运行这个方法我可以一直,转并解决了下一个区块直到我赢得了硬币翻,获利然后。

  、 以及一个自增数nonce(一个仅会被使用一次的数这个方法首先拿到now的时间戳、msg。sender,值调用一次以上哈希函数了)这样我们就不会对相同的输入。

  e结构体有了新的属性现在我们的Zombi,Zombie()中的函数定义我们需要修改_create。

  随机数生成函数我们来实现一个,战斗的结果好来计算。一点儿也不安全虽然这个函数。

  个withdraw函数在我们的合约里创建一,GetPaid一样它应该几乎和上面的。

  太坊上在以,上调用函数的时候当你在和一个合约,上的transaction节点们你会把它广播给一个节点或者在网络。将收集很多事务网络上的节点,算密集型数学问题的人试着成为第一个解决计,作证明”作为“工,roof of Work然后将“工作证明”(P,个block发布在网络上PoW)和事务一起作为一。

  在以太坊上不安全所以尽管这个方法,际中在实,数有一大笔钱在上面除非我们的随机函,有足够的资源去攻击的你游戏的用户一般是没。

  er向任何以太坊地址付钱你可以通过transf。如比,nder超额付款的时候给他们退钱你可以有一个函数在msg。se:

  将要用到的检查逻辑是相同的这和我们attack函数。调用这个检查逻辑正因我们要多次,ier中来清理代码并避免重复编码让我们把它移到它自己的modif。

  输入的值转变为一个哈希值然后利用keccak把,换为uint再将哈希值转,00来取最后两位然后利用% 1,100之间随机数了就生成了一个0到。

  个教程中因为在这,简单的游戏来做演示我们只是在编写一个,的钱在里面也没有真正,受这个不足之处所以我们决定接,随机数生成函数使用这个简单的。它是不安全的但是要谨记。

  存一个数值 — 作为一个单独的映射有多种方法在我们的DApp里面保,行榜”结构体作为一个“排,mbie结构体内或者保存在Zo。

  我们想确保用户的确拥有他们用来攻击的僵尸不管谁调用我们的attack函数 —— 。攻击将是一个很大的安全问题如果你能用其他人的僵尸来。

  章的格式遵循上一,攻击功能合约我们新建一个,进新的文件中并将代码放,一个合约引入上。

分享: