当前位置:   article > 正文

以太坊dapp应用--福利彩票 IDEA+React(简单版)

dapp lottery

1.应用程序骨架(脚手架)

  1. npm install -g create-react-app
  2. create-react-app lottery-react
  3. npm run start 启动应用程序
  4. 复制代码

2.初始化web3环境

  1. npm install --save web3
  2. 复制代码

3.编译器

  1. npm install --save solc
  2. 复制代码

src/App.js

  1. import React,{Component} from "react" ;
  2. import {Message,Contract,Card,Image,Icon,Statistic,Button,Label} from"semantic-ui-react";
  3. import Web3 from "./web3";
  4. import lottery from "./lottery";
  5. class App extends Component{
  6. state = {
  7. manager:"",
  8. playersCount:0,
  9. balance:0,
  10. loading:false,
  11. showbutton:"none"
  12. };
  13. }
  14. 复制代码

src/index.js

  1. //1.导入react
  2. import React from "react";
  3. //2.导入ReactDom
  4. import ReactDOM from "react-Dom";
  5. //3.导入App
  6. import App from "./App";
  7. //4.用ReactDom调用render
  8. ReactDOM.render(<App/>,document.getElementById("root"));
  9. 复制代码

src/lottery.js

  1. //直接获取区块链上的彩票的智能合约
  2. import web3 from './web3'; //装好了 用户provider的web3
  3. const address = '0x8f6B03a0DdA6397343A3e0B8CeC78c9BBfB4bba8';
  4. //ctrl + shift + J
  5. const abi = [{
  6. "constant": true,
  7. "inputs": [],
  8. "name": "getBalance",
  9. "outputs": [{"name": "", "type": "uint256"}],
  10. "payable": false,
  11. "stateMutability": "view",
  12. "type": "function"
  13. }, {
  14. "constant": true,
  15. "inputs": [],
  16. "name": "manager",
  17. "outputs": [{"name": "", "type": "address"}],
  18. "payable": false,
  19. "stateMutability": "view",
  20. "type": "function"
  21. }, {
  22. "constant": false,
  23. "inputs": [],
  24. "name": "refund",
  25. "outputs": [],
  26. "payable": false,
  27. "stateMutability": "nonpayable",
  28. "type": "function"
  29. }, {
  30. "constant": false,
  31. "inputs": [],
  32. "name": "pickWinner",
  33. "outputs": [{"name": "", "type": "address"}],
  34. "payable": false,
  35. "stateMutability": "nonpayable",
  36. "type": "function"
  37. }, {
  38. "constant": true,
  39. "inputs": [],
  40. "name": "getPlayersCount",
  41. "outputs": [{"name": "", "type": "uint256"}],
  42. "payable": false,
  43. "stateMutability": "view",
  44. "type": "function"
  45. }, {
  46. "constant": true,
  47. "inputs": [],
  48. "name": "getManager",
  49. "outputs": [{"name": "", "type": "address"}],
  50. "payable": false,
  51. "stateMutability": "view",
  52. "type": "function"
  53. }, {
  54. "constant": false,
  55. "inputs": [],
  56. "name": "enter",
  57. "outputs": [],
  58. "payable": true,
  59. "stateMutability": "payable",
  60. "type": "function"
  61. }, {
  62. "constant": true,
  63. "inputs": [],
  64. "name": "getAllPlayers",
  65. "outputs": [{"name": "", "type": "address[]"}],
  66. "payable": false,
  67. "stateMutability": "view",
  68. "type": "function"
  69. }, {
  70. "constant": true,
  71. "inputs": [{"name": "", "type": "uint256"}],
  72. "name": "players",
  73. "outputs": [{"name": "", "type": "address"}],
  74. "payable": false,
  75. "stateMutability": "view",
  76. "type": "function"
  77. }, {"inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor"}]
  78. const lottery = new Web3.eth.Contract(abi,address);
  79. export default lottery;
  80. 复制代码

src/web3.js

  1. //1.导入Web3
  2. import Web3 from "web3";
  3. //2.定义web3
  4. const web3 = new (window.web3.currentProvider);
  5. //3.导出web3
  6. export default web3;
  7. 复制代码

Lottery/app.js

  1. var createError = require('http-errors');
  2. var express = require('express');
  3. var path = require('path');
  4. var cookieParser = require('cookie-parser');
  5. var logger = require('morgan');
  6. var indexRouter = require('./routes/index');
  7. var usersRouter = require('./routes/users');
  8. var app = express();
  9. // view engine setup
  10. app.set('views', path.join(__dirname, 'views'));
  11. app.set('view engine', 'pug');
  12. app.use(logger('dev'));
  13. app.use(express.json());
  14. app.use(express.urlencoded({ extended: false }));
  15. app.use(cookieParser());
  16. app.use(express.static(path.join(__dirname, 'public')));
  17. app.use('/', indexRouter);
  18. app.use('/users', usersRouter);
  19. // catch 404 and forward to error handler
  20. app.use(function(req, res, next) {
  21. next(createError(404));
  22. });
  23. // error handler
  24. app.use(function(err, req, res, next) {
  25. // set locals, only providing error in development
  26. res.locals.message = err.message;
  27. res.locals.error = req.app.get('env') === 'development' ? err : {};
  28. // render the error page
  29. res.status(err.status || 500);
  30. res.render('error');
  31. });
  32. module.exports = app;
  33. 复制代码

Lottery/compile.js

  1. // 在这里是编译智能合约的脚本
  2. //获取path
  3. const path = require("path");
  4. //获取fs
  5. const fs = require("fs");
  6. //获取solc
  7. const solc = require("solac");
  8. //调用path.resolve
  9. const srcPath = path.resolve(__dirname,"contracts","Lottery.sol");
  10. //调用fs.readFileSync
  11. const source = fs.readFileSync(srcPath,"utf-8");
  12. //调用solc.compile
  13. const result = solc.compile(source,1);
  14. //导出合约
  15. module.exports = result.contracts[":Lottery"];
  16. 复制代码

Lottery/deploy.js

  1. // 在这里是编译智能合约的脚本
  2. //获取path
  3. const path = require("path");
  4. //获取fs
  5. const fs = require("fs");
  6. //获取solc
  7. const solc = require("solac");
  8. //调用path.resolve
  9. const srcPath = path.resolve(__dirname,"contracts","Lottery.sol");
  10. //调用fs.readFileSync
  11. const source = fs.readFileSync(srcPath,"utf-8");
  12. //调用solc.compile
  13. const result = solc.compile(source,1);
  14. //导出合约
  15. module.exports = result.contracts[":Lottery"];
  16. 复制代码

Lottery.sol

  1. pragma solidity ^0.4.17;
  2. contract Lottery{
  3. address public manager;
  4. address[] public players;
  5. address public winner;
  6. function Lottery{
  7. mannager = msg.sender;
  8. }
  9. function getMannager() public returns(address){
  10. return manager;
  11. }
  12. function enter() public payable{
  13. require(msg.value == 1 ether);
  14. players.push(msg.sender);
  15. }
  16. function getAllPlayers() public view returns(address[]){
  17. return players;
  18. }
  19. function getBalance() public view returns(uint){
  20. return this.balance;
  21. }
  22. function getPlayersCount() public view returns(uint){
  23. return player.length;
  24. }
  25. function random() private view returns(uint){
  26. return uint(keccak(block.difficulty,now,players));
  27. }
  28. function pickWinner() public onlyMangerCanCall{
  29. uint index = random()% players.length;
  30. winner = players[index];
  31. players = new address[](0);
  32. winner.transfer(this.balance);
  33. }
  34. function refund() public onlyMangerCanCall{
  35. for(uint i=0;i<players.length;i++){
  36. players[i].transfer(1 ether);
  37. }
  38. players = new address[](0);
  39. }
  40. modifier onlyManagerCanCall(){
  41. require(msg.sender == manager);
  42. _;
  43. }
  44. }
  45. 复制代码

info普通文件

  1. 0x8f6B03a0DdA6397343A3e0B8CeC78c9BBfB4bba8
  2. [{"constant":true,"inputs":[],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"manager","outputs":[{"name":"","type":"ad
  3. dress"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name
  4. ":"pickWinner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getPlayersCount","outputs":[{"name":"","type":"uint256"}],"payable":fa
  5. lse,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"
  6. name":"enter","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getAllPlayers","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","typ
  7. e":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"players","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMuta
  8. bility":"nonpayable","type":"constructor"}]
  9. 复制代码
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/717088
推荐阅读
相关标签
  

闽ICP备14008679号