去中心化竞猜游戏dapp系统开发智能合约功能定制技术分析

简介: 去中心化竞猜游戏dapp系统开发智能合约功能定制技术分析

去中心化应用在游戏领域遍地开花,下面就带着大家一起开发一款简单有趣的 DApp 游戏,帮助大家熟悉 DApp 开发。

​实现的合约功能:用户从 0-6 的数字中,任意组合三位数进行投注,合约计算出 3 位随机数,根据随机数的组合规则分别给予用户不同倍数的奖励,如随机数为 AAA ,A 等于 6 则奖励至少 20 倍投注金额,即奖池所有余额;A 不等于 6 则奖励 5 倍投注金额;随机数为 AAB,则奖励 2 倍投注金额;随机数为 ABC 则不奖励,同时用户可查看奖池余额和个人投注记录。

合约编写

可以看出合约需要实现用户投注、生成随机数、发放奖励、奖池余额查询的功能,接下来编写我们的合约代码。

新建Lottery.sol合约文件,声明合约版本,^表示合约编译版本为 0.4.0 至 0.5.0(不含 0.5.0)。

pragma solidity ^0.4.0;

定义合约基本内容,同时声明最低投注金额。

contract Lottery {
uint public betMoney = 10 finney;
}

生成随机数,通过区块难度block.difficulty和内置函数keccak256生成随机数,在EVM中常用的数据存储位置:memory、storage,函数的参数、返回值默认存储在memory中,状态变量默认存储在storage中,我们可以通过声明memory、storage改变默认存储位置,两者的存储都需要消耗gas,但storage的开销远大于memory。

contract Lottery {
... function generateRandomNumber() private view returns(uint[]) {
uint[] memory dices = new uint[](3); for (uint i = 0; i < 3; i++) {

 dices[i] = uint(keccak256(abi.encodePacked(block.difficulty, now, i))) % 6 + 1;

} return dices;
}
...
}

获取合约余额,address类型比较重要的成员属性主要有balance、transfer,分别为获取地址余额、转移eth至该地址,默认eth单位是wei。

contract Lottery {
... function getBankBalance() public view returns(uint) { return address(this).balance;
}
...
}

用户投注,投注方法需要使用payable关键字描述,用来表示可以接收eth;通过msg.sender和msg.value获得交易发送者地址和当前交易附带的eth。通常使用require来校验外部输入参数,当判定条件为false时,则会将剩余的gas退回,同时回滚交易;assert则用来处理合约内部的逻辑错误,当错误发生时会消耗掉所有gas,同时回滚交易。

contract Lottery {
... function bet() public payable {
uint amount = msg.value; require(amount >= betMoney, 'bet money not less than 10 finney'); require(address(this).balance >= amount * 20, 'contract money not enough to pay reward');

uint[] memory dices = generateRandomNumber(); require(dices.length == 3, 'dices illegal');

address addr = msg.sender;
bool isReward = false;
uint reward = 0; if ((dices[0] == dices[1]) && (dices[1] == dices[2]) && (dices[0] == 6)) {

 isReward = true;
 reward = address(this).balance;

} else if ((dices[0] == dices[1]) && (dices[1] == dices[2]) && (dices[0] != 6)) {

 isReward = true;
 reward = amount * 5;

} else if ((dices[0] == dices[1]) || (dices[0] == dices[2]) || (dices[1] == dices[2])) {

 isReward = true;
 reward = amount * 2;

} if (isReward) {

 addr.transfer(reward);

}
}
...

定义事件,通过合约内部触发事件,web3 监听到事件回调进行相应逻辑处理,从而进行页面 UI 更新;同时前端也可以通过对应事件名称获取日志信息。

contract Lottery {
...
event BetList(
address addr,
uint amount,
bool isReward,
uint reward,
uint[] dices
); function bet() public payable {
...
emit BetList(addr, amount, isReward, reward, dices);
}
...

相关文章
|
6月前
|
安全 编译器 区块链
区块链代币 DAPP 通缩燃烧模式系统开发技术方案
合约代码部署流程可能因区块链技术的不同实现而略有不同,但基本步骤如下:
|
安全 区块链
DAPP去中心化系统开发|DAPP质押模式系统开发(方案需求)
智能合约是一种以代码形式存在的合约,旨在在去中心化网络上执行和实施
|
存储 安全 区块链
DAPP互助公排智能合约系统开发方案与需求
智能合约是需要区块链开发者用区块链编程语言写出来的一串代码,根据不同场景构思逻辑后开发出来的信任机制
|
算法 区块链 数据安全/隐私保护
区块链去中心化交易所系统开发成熟技术|开发指南与流程
Web3算法革命将会在多个领域产生深远的影响。首先,它将会对数据安全和隐私保护产生积极的作用
|
存储 安全 算法
DAPP合约系统开发|DAPP去中心化模式系统开发(成熟技术)
透明度和灵活性:任何区块链用户都可以评估合约逻辑和底层机制
|
存储 区块链 数据安全/隐私保护
DAPP链上合约游戏系统开发技术详细丨dapp农场养成种植种树游戏项目系统开发成熟技术/规则详细/源码平台
  DAPP智能合约技术又称之为加密合约技术,是在一定的条件直接控制数字的技术,在各方之间转移的一种计算机程序。智能合约不同于传统的技术方式定义了协议处罚和规则,还定义了自动强制执行的义务。
|
存储 负载均衡 前端开发
dapp区块链游戏开发功能版丨区块链游戏dapp链游系统开发技术方案/玩法规则/项目案例/源码程序
  区块链游戏系统开发是区块链技术在游戏领域的应用之一。通过区块链技术,游戏系统可以实现更加公平、透明、安全的游戏环境,同时提高游戏的运营效率和用户满意度。下面我们将详细介绍区块链游戏系统开发实现的技术和方案
|
存储 算法 区块链
GRETT格莱特智能合约系统开发|格莱特质押模式系统开发DAPP技术搭建
“去中心化”是区块链的典型特征之一 The liquidity providers provide the pool with the two
DAPP去中心化交易所系统开发详细功能丨DAPP去中心化钱包系统开发规则详细/成熟技术/源码说明
 A smart contract is a computer program that runs on a blockchain. Programs include functions and data (also known as variables or parameters), which operate on data. The data used by the function needs to be stored in the computer's memory