Skip to content

区块链技术学习salon dapp #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 15 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,26 @@
# AHBCSalon
安徽区块链技术沙龙的代码版本,用来满足沙龙自身管理和技术演示

------------------------------ 合约部分 ------------------------------

合约分为三大块,第一块是沙龙token合约部分,第二块是沙龙合约本身的部分,第三块是辅助合约部分。

### 沙龙token合约

1. 主合约在SalonToken.sol中,部署的时候只需要部署这一个合约即可。其他相关的部分,包括storage,impl等会在合约中自动部署。

2. 沙龙token遵循erc20,但是开有更多的接口。包括实现了管理员挖矿,实现步骤可升级等一系列功能。其中最重要的是可升级功能,该功能可以保证即使token合约有漏洞,也可以升级成最新代码,并且用户无感知。

3. 升级步骤:先单独部署SalonTokenImpl.sol中的实现方法合约,再调用这个合约中的修改管理员方法,把管理员改成SalonToken.sol中的接口合约,最后调用SalonToken.sol的升级接口,传入新部署的实现合约的地址即可。

### 沙龙合约

1. 主合约在Salon.sol中,部署的时候只需要部署这一个合约即可。

2. 为了和沙龙token合约配合使用,部署之后,需要在沙龙token合约中调用接口,把沙龙合约配置成管理员。

3. 每个接口的说明请参见Salon.sol中的注释。

### 辅助部分

辅助部分主要是一些接口以及数学库等。没什么单独用处,就是为了设计的时候做到接口和实现分开,使逻辑更加清晰而已。有兴趣可以自己看下源码。
11 changes: 11 additions & 0 deletions dapp/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
VUE_APP_SALONABI = '[{"constant":true,"inputs":[],"name":"registerFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"campaigns","outputs":[{"name":"ID","type":"uint256"},{"name":"end","type":"bool"},{"name":"topic","type":"string"},{"name":"speaker","type":"address"},{"name":"sponsor","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"speakerPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"salonToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"questionPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAdministrator","type":"address"}],"name":"transferAdministrator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"participantPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"administrator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"sponsorPercent","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"salonTokenAddr","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"campaignID","type":"uint256"},{"indexed":false,"name":"topic","type":"string"},{"indexed":true,"name":"speaker","type":"address"},{"indexed":true,"name":"sponsor","type":"address"}],"name":"LogNewCampaign","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"}],"name":"LogRegister","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"}],"name":"LogCheckedIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"questioner","type":"address"},{"indexed":true,"name":"replier","type":"address"}],"name":"LogQuestion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"campaignID","type":"uint256"},{"indexed":false,"name":"numOfParticipants","type":"uint256"},{"indexed":false,"name":"questions","type":"uint256"}],"name":"LogClose","type":"event"},{"constant":false,"inputs":[{"name":"_campaignID","type":"uint256"},{"name":"_topic","type":"string"},{"name":"_speaker","type":"address"},{"name":"_sponsor","type":"address"}],"name":"newCampaign","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_speakerP","type":"uint256"},{"name":"_sponsorP","type":"uint256"},{"name":"_participantP","type":"uint256"},{"name":"_questionP","type":"uint256"}],"name":"changePercentage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"changeRegisterFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaignID","type":"uint256"}],"name":"register","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaignID","type":"uint256"},{"name":"_who","type":"address"}],"name":"checkin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaignID","type":"uint256"},{"name":"_questioner","type":"address"},{"name":"_replier","type":"address"}],"name":"addQuestion","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_campaignID","type":"uint256"}],"name":"closeCampaign","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]'
VUE_APP_TOKENABI = '[{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function","signature":"0x8da5cb5b"},{"constant":true,"inputs":[],"name":"tokenStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function","signature":"0xb199efb5"},{"constant":false,"inputs":[{"name":"newAdministrator","type":"address"}],"name":"transferAdministrator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function","signature":"0xc648a3a2"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function","signature":"0xf2fde38b"},{"constant":true,"inputs":[],"name":"administrator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function","signature":"0xf53d0a8e"},{"constant":true,"inputs":[],"name":"tokenImpl","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function","signature":"0xffc4992f"},{"inputs":[{"name":"name","type":"string"},{"name":"symbol","type":"string"},{"name":"decimals","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"constructor","signature":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newAddress","type":"address"},{"indexed":true,"name":"oldAddress","type":"address"}],"name":"Upgrade","type":"event","signature":"0xd23ce5645530506727523fe6d7939e72bb49102454460bc72f0f5baec60ac718"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event","signature":"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event","signature":"0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function","signature":"0x06fdde03"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function","signature":"0x95d89b41"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function","signature":"0x313ce567"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function","signature":"0x18160ddd"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function","signature":"0x70a08231"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function","signature":"0xdd62ed3e"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function","signature":"0xa9059cbb"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function","signature":"0x095ea7b3"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function","signature":"0x23b872dd"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function","signature":"0x39509351"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function","signature":"0xa457c2d7"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"value","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function","signature":"0x40c10f19"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"value","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function","signature":"0x9dc29fac"},{"constant":false,"inputs":[{"name":"newImpl","type":"address"}],"name":"upgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function","signature":"0x0900f010"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferByAdministrator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function","signature":"0x9fea2d53"}]'
VUE_APP_NETWORK = 'MOAC'
VUE_APP_TOKEN_ADDRESS = '0xa2652f741448d99b8b3085721aedb102a1b88d3A'
VUE_APP_SALON_ADDRESS = '0x5a8347056c9712994a694A27d3b017eEc7a60e40'
VUE_APP_SALON_VNODE ='https://ropsten.infura.io/v3/2413e0137d6b4a3181d29c8f7727fcf6'
VUE_APP_GAS = '8000000'
VUE_APP_GASPRICE = '20000000000'
VUE_APP_TOKEN_ADDRESS_MOAC = '0x077e3f63f3252399c9730d6a8b17aab26ded8a47'
VUE_APP_SALON_ADDRESS_MOAC = '0x2cdcb347ab1826a604bd909e8c6862580ef536eb'
VUE_APP_SALON_VNODE_MOAC = 'https://moac1ma17f1.jccdex.cn'
23 changes: 23 additions & 0 deletions dapp/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
.DS_Store
node_modules
/dist
/package-lock.json

# local env files
.env.local
.env.*.local

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*

45 changes: 45 additions & 0 deletions dapp/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# 安徽区块链技术沙龙 DAPP

主要实现功能:1)沙龙报名,沙龙token转账;2)管理员特权:沙龙创建,人员签到,修改报名费和奖金比例,保存提问人员地址,关闭沙龙

## .env文件配置

### MOAC
```
VUE_APP_NETWORK = 'MOAC'
VUE_APP_TOKEN_ADDRESS_MOAC = '' // 沙龙token地址
VUE_APP_SALON_ADDRESS_MOAC = '' //沙龙合约地址
VUE_APP_SALON_VNODE_MOAC = '' //节点url
```

### ETH
```
VUE_APP_NETWORK = 'ETH'
VUE_APP_TOKEN_ADDRESS = '' // 沙龙token地址
VUE_APP_SALON_ADDRESS = '' //沙龙合约地址
VUE_APP_SALON_VNODE ='' //节点url
```

## Project setup
```
npm install
```

### Compiles and hot-reloads for development
```
npm run serve
```

### Compiles and minifies for production
```
npm run build
```

### deploye salon contracts in moac node
```
npm run deploy
```


### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).
5 changes: 5 additions & 0 deletions dapp/babel.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/app'
]
}
80 changes: 80 additions & 0 deletions dapp/moac_deploy.js

Large diffs are not rendered by default.

70 changes: 70 additions & 0 deletions dapp/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
{
"name": "salondapp",
"version": "0.1.0",
"description": "Anhui blockchain salon dapp project",
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"deploy": "node ./moac_deploy.js"
},
"author": "https://github.com/gwang74",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/JCCDex/AHBCSalon.git"
},
"bugs": {
"url": "https://github.com/JCCDex/AHBCSalon/issues"
},
"homepage": "https://github.com/JCCDex/AHBCSalon",
"dependencies": {
"chain3": "^0.1.16",
"qrcode": "^1.3.3",
"tp-js-sdk": "^3.0.1",
"vue": "^2.6.6",
"vue-clipboard2": "^0.3.0",
"vue-router": "^3.0.1",
"vuetify": "^1.5.5",
"vuex": "^3.0.1",
"web3": "^1.0.0-beta.34"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^3.4.0",
"@vue/cli-plugin-eslint": "^3.4.0",
"@vue/cli-service": "^3.4.0",
"babel-eslint": "^10.0.1",
"eslint": "^5.8.0",
"eslint-plugin-vue": "^5.0.0",
"stylus": "^0.54.5",
"stylus-loader": "^3.0.1",
"truffle-hdwallet-provider": "^1.0.5",
"vconsole": "^3.3.0",
"vue-cli-plugin-vuetify": "^0.5.0",
"vue-template-compiler": "^2.5.21",
"vuetify-loader": "^1.0.5"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
}
},
"postcss": {
"plugins": {
"autoprefixer": {}
}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
Binary file added dapp/public/ahbc.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
25 changes: 25 additions & 0 deletions dapp/public/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="zh-Hans">

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>ahbc.png">
<title>AHBC SALON</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900">
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/3.5.95/css/materialdesignicons.min.css">
</head>

<body>
<noscript>
<strong>We're sorry but dapp doesn't work properly without JavaScript enabled. Please enable it to
continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>

</html>
31 changes: 31 additions & 0 deletions dapp/src/App.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<template>
<v-app>
<v-content>
<router-view/>
</v-content>

<v-footer dark height="auto">
<v-card class="flex" flat tile>
<v-card-title class="teal justify-center">
<strong class="subheading">安徽区块链技术学习沙龙</strong>
</v-card-title>

<v-card-actions class="grey darken-3 justify-center">&copy;2019 —
<strong>AHBC SALON</strong>
</v-card-actions>
</v-card>
</v-footer>
</v-app>
</template>

<script>
export default {
name: "App",
data() {
return {
//
};
}
};
</script>

Binary file added dapp/src/assets/salon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading