区块链结合游戏火爆模式:Fomo3d区块链游戏开发【纪如,137、9436、2OI4,可薇可电】,在Solidity中,与合约有些不同,Library不能处理ether。你可以把它当作一个EVM中的单例,又或者是一个部署一次后不再部署,然后能被做任意其它合约调用的公共代码。
这带来的一个显然好处是节省大量的gas(当然也可以减少重复代码对区块链带来的污染),因为代码不用一而再,再而三的部署,不同的合约可以依赖于同一个已部署的合约。
Fomo3d区块链游戏开发规则:
“fomo3D系统”参与方式:
一、玩家在“fomo3D系统”中注册并登陆;
二、玩家进入“财务中心”-“fomo3D系统币转入”中,进行“fomo3D系统币DOGE”的充值操作;
三、玩家进入“fomo3D系统”首页-“立即参与”(或“fomo3D系统”-“加入战场”),进行相对于操作后即可参与游戏。
“fomo3D系统”的游戏参数诠释:
一、“fomo3D系统”的奖池:
1.“fomo3D系统”奖池资金计量单位为“fomo3D系统币DOGE”;
2.该数额为所有玩家参与“fomo3D系统”所使用的“fomo3D系统币DOGE”总合的40%;
(例:A用户已10000DOGE加入游戏,其中4000DOGE直接累加进入奖池)
FOMO3D系统开发
3.“fomo3D系统”奖池奖金将在游戏结束后,分发给最后参与游戏的10名用户(依据用户的fomo3D系统权益KEY的相应比例进行分发)。
(例:最终奖池为1000000DOGE,最后10名用户为A1用户、A2用户、A3用户——·A10用户,其中A1-A9用户都持有1000fomo3D系统KEY,A10用户持有9000KEY。那么A1-A9用户均获得1000000DOGE1000/(10009+9000)=55555.56 DOGE A10用户获得1000000DOGE9000/(10009+9000)=500000DOGE)
二、“fomo3D系统”的游戏时间:
1.游戏初始结束倒计时限时为86400秒(即24小时),并且按照自然时间逐秒递减,当时间为0秒时,本轮游戏结束;
2.用户每参与一次游戏,游戏时间会增加60秒,封顶值为86400秒(即24小时)。
三、“fomo3D系统”fomo3D系统权益(KEY):
1.fomo3D系统权益(KEY)作为游戏用户分红的凭证;
2.fomo3D系统权益(KEY)获得方式一,用户参与游戏的40%“fomo3D系统币DOGE”;
(例:用户参与游戏使用了5000枚fomo3D系统币DOGE,即可获得2000fomo3D系统权益(KEY))
库是一个特殊的合约,不允许payable的函数,不允许fallback函数(这些限制是在编译期间强制执行的,由此我们不能使用库来操作ether)。库通过关键字library定义,如library C{},与合约定义类似contract A{}。
调用库函数时,将使用一个特殊的指令DELEGATECALL,这会将调用时的上下文信息传入到library中,就好像代码在合约自身中执行一样。我非常赞同Soldity文档中所说的,“库可以被看作是使用它的合约的一个隐式的父类”。
library C{
function a()returns(address){
return address(this);
}
}
contract A{
function a()constant returns(address){
return C.a();
}
}
库的linked
与显式的继承contract A is B{}不同的是,合约与之依赖的库是如何关联起来不是很清楚。如前面合约A在a()方法中调用库C,那引用库C使用的是什么地址呢,C又是如何与A的字节码产生关系的呢。
库的关联是发生在字节码层级。当合约A编译后,它会对需要库地址的地方保留。
库连接实际上则非常简单,即是替换所有库占位符为部署后的区块链上的库地址。一旦合约已经关联好了对应的库,那么它也可以正式部署了。
using结构体和方法
尽管库并没有storage,他们可以使用关联合约的storage。当传递一个库调用,库所进行的修改,将会保存在合约中的storage中。这有点类似于向函数中传递了C语言一样的指针,只有通过这种方式,库才可能是一个已经被部署过的,或已经存在于区块链上了。
使用using提供的语法糖,可以让这一切实现得简洁和好懂。我们来看一个下面的例子,这是基础,也可参考:http://me.tryblockchain.org/blockchain-solidity-Libraries.html。
library CounterLib{
struct Counter{uint i;}
function incremented(Counter storage self)returns(uint){
return++self.i;
}
}
contract CounterContract{
using CounterLib for CounterLib.Counter;
CounterLib.Counter counter;
function increment()returns(uint){
return counter.incremented();
}
}
using关键字,在CounterLib数据结构Counter上附着了CounterLib库中定义的方法。CounterLib.Counter的实例在使用时,就好像它自己有了incremented(),调用方法时,会直接把这个实例作为第一个参数传入了函数。
这个结构体的语法非常类似于Go语言中的结构体上执行方法,虽然不是完整意义上的对象。
原文地址:http://blog.51cto.com/13499321/2300475