以太坊 day (5)
一、彩票系统
1.1 字段
- 彩票管理者,负责彩票的开奖与退订
- 彩民池,参与买彩票的玩家
- 当前期数,指的是彩票是第几期
二、代码实现
2.1 remix端代码实现
pragma solidity ^0.4.26;
contract lottory{
//彩票管理者
address public admin;
//参与玩家
address[] public players;
//彩票期数
uint public round;
//合约部署者
constructor() public {
admin = msg.sender;
}
//参与买彩票
function play() public payable{
require(msg.value == 1 ether);
players.push(msg.sender);
}
//获取当前合约的余额
function getBalance() public view returns(uint256){
return address(this).balance;
}
//获取当前参与的人数
function getPlayers() public view returns (address[]){
return players;
}
}
2.2 投注函数
- 投注函数
参与者参与购买彩票,然后将参与者加入彩民池中 - 开奖函数
2.3 开奖函数
- 从参与者中随机选择一位参与者,方法是:对(当前时间,参与者人数,挖矿难度)作哈希,然后对参与人数求余
- 将合约中的钱9成转给中奖者,剩下的一成转给参与者
- 期数加1,保存本期中奖者,且清空此次参与人的信息,即清空players
function lucky() public {
bytes memory v1 = abi.encodePacked(block.timestamp, block.difficulty,players.length);
bytes32 res = keccak256(v1);
uint256 index = uint256(res) % players.length;
lucky = players[index];
uint256 contractMoney = address(this).balance;
uint256 money1 = contractMoney / 100 * 90;
uint256 money2 = contractMoney / 100 * 10;
lucky.transfer(money1);
admin.transfer(money2);
round ++;
delete(players);
}
2.4 退奖函数
- 遍历奖池数组,给每个参与者退回参与资金
- 删除彩民池
function reject() onlymanager public{
for (uint256 i = 0; i < players.length; i++){
players[i].transfer(1 ether);
}
delete players;
}
三、前端页面实现
3.1 react脚手架搭建
- 安装脚手架
npm install create-react-app
- 创建react项目
create-react-app lottery-pro
- 启动项目
npn run start
3.2 获取用户的metamask的provider
let Web3 = require('web3')
let web3 = new Web3()
//这里的provider是用户自己的provider,好比用户自己的卡,我们提供手机
web3.setProvider('http//localhost:7545')
//window.web3.currentProvider已经被deprecated,暂时还未找到替代的
console.log(web3.currentProvider)
module.exports = web3
3.3 简单页面的实现
- app.js
import React from 'react';
import Show from "./showMsg";
//let web3 = require('./utils/initweb3')
//let contractInstance = require('./eth/lotteryInstance')
class App extends React.Component{
constructor(){
super()
this.state = {
admin:'kkkk',
name:'jack',
address: '西安'
}
}
componentDidMount(){
}
async componentWillAmount(){
//let myadmin = await contractInstance.methods.admin().call()
this.setState({
name:'jack',
admin:'admin'
})
}
render() {
return (
<div>
<Show name ={
this.state.name} admin = {
this.state.admin}/>
<p>address = {
this.state.address}</p>
</div>
);
}
}
export default App;
- index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render(
<React.StrictMode>
<App/>
</React.StrictMode>,
document.getElementById('root')
);
3.4 数据在不同组件中的传播
- 通过props传播
app.js中的内容:
<div>
<Show name ={
this.state.name} admin = {
this.state.admin}/>
<p>address = {
this.state.address}</p>
</div>
showMsg.js