以太坊 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

3.5不做了

猜你喜欢

转载自blog.csdn.net/qq_42306803/article/details/121063212