本文主要是介绍学习区块链(九)--创建僵尸军团进阶Ⅳ,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一.gas
我们知道,运行在以太坊上的智能合约每一步操作都需要消耗Gas,这些gas是真金白银的,一个 DApp 收取多少 gas 取决于功能逻辑的复杂程度。每个操作背后,都在计算完成这个操作所需要的计算资源,(比如,存储数据就比做个加法运算贵得多), 一次操作所需要花费的gas等于这个操作背后的所有运算花销的总和。所以我觉得学习编写智能合约是真的很有必要的,他强迫每一个程序员去绞尽脑汁的调优代码,如果同样的功能,使用笨拙的代码开发的程序,比起经过精巧优化的代码来,运行花费更高,这显然会给成千上万的用户带来大量不必要的开销,我想白花花的银子因为我们代码结构而损失掉,是大家都不愿意看到的吧!
那么问题来了,以太坊为什么需要gas来运行这些智能合约呢?
以太坊就像一个巨大、缓慢、但非常安全的电脑。当你运行一个程序的时候,网络上的每一个节点都在进行相同的运算,以验证它的输出 —— 这就是所谓的”去中心化“ 由于数以千计的节点同时在验证着每个功能的运行,这可以确保它的数据不会被被监控,或者被刻意修改。
如果我们知道ddos攻击的话就很好理解了,可能会有恶意用户用无限循环堵塞或者攻击网络,抑或用密集运算来占用大量的网络资源,为了防止这种事情的发生,以太坊的创建者为以太坊上的资源制定了价格,想要在以太坊上运算或者存储,你需要先付费,那么当然没人会用真金白银来做这种无意义的事了!
之前我们提到除了基本版的 uint 外,还有其他变种 uint:uint8,uint16,uint32等。
通常情况下我们不会考虑使用 unit 变种,因为无论如何定义 uint的大小,Solidity 为它保留256位的存储空间。例如,使用 uint8 而不是uint(uint256)不会为你节省任何gas。
除非,把 unit 绑定到 struct 里面。
如果一个 struct 中有多个 uint,则尽可能使用较小的 uint, Solidity 会将这些 uint 打包在一起,从而占用较少的存储空间。例如:
struct NormalStruct {uint a;uint b;uint c;
}struct MiniMe {uint32 a;uint32 b;uint c;
}// 因为使用了结构打包,`mini` 比 `normal` 占用的空间更少
NormalStruct normal = NormalStruct(10, 20, 30);
MiniMe mini = MiniMe(10, 20, 30);
我们之前在ZombieFactory有个存储僵尸属性的struct,里面有时间和dna,现在我们加入uint32的僵尸等级level和冷却时间readyTime,这样我们构造新的僵尸就能更节省gas了。
struct Zombie{string name;uint dna;uint32 level;uint32 readyTime;
}
二.时间单位
上面struct定义的level 属性表示僵尸的级别。以后,在我们创建的战斗系统中,打胜仗的僵尸会逐渐升级并获得更多的能力。
readyTime 稍微复杂点。我们希望增加一个“冷却周期”,表示僵尸在两次猎食或攻击之之间必须等待的时间。如果没有它,僵尸每天可能会攻击和繁殖1,000次,这样游戏就太简单了。
为了记录僵尸在下一次进击前需要等待的时间,我们使用了 Solidity 的时间单位。
Solidity 还包含秒(seconds),分钟(minutes),小时(hours),天(days),周(weeks) 和 年(years) 等时间单位。它们都会转换成对应的秒数放入 uint 中。所以 1分钟 就是 60,1小时是 3600(60秒×60分钟),1天是86400(24小时×60分钟×60秒),以此类推。
现在我们给我们dapp设定一个冷却时间,僵尸攻击有1天的冷却时间:
声明一个名为 cooldownTime 的uint,并将其设置为
这篇关于学习区块链(九)--创建僵尸军团进阶Ⅳ的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!