使用solidity和web3.js实现登录,注册的权限管理的代码
时间: 2023-11-28 15:51:29 浏览: 132
以下是使用 Solidity 和 Web3.js 实现登录、注册和权限管理的示例代码:
Solidity 代码:
```
pragma solidity ^0.8.0;
contract Auth {
mapping(address => bool) public isAdmin;
mapping(address => bool) public isUser;
mapping(address => string) public username;
mapping(string => address) public usernameToAddress;
event NewAdmin(address admin);
event NewUser(address user, string username);
constructor() {
isAdmin[msg.sender] = true;
emit NewAdmin(msg.sender);
}
function register(string memory _username) public {
require(usernameToAddress[_username] == address(0), "Username already exists");
require(!isUser[msg.sender], "Already registered");
isUser[msg.sender] = true;
username[msg.sender] = _username;
usernameToAddress[_username] = msg.sender;
emit NewUser(msg.sender, _username);
}
function grantAdmin(address _admin) public {
require(isAdmin[msg.sender], "Not authorized");
isAdmin[_admin] = true;
emit NewAdmin(_admin);
}
function revokeAdmin(address _admin) public {
require(isAdmin[msg.sender], "Not authorized");
isAdmin[_admin] = false;
}
}
```
该合约维护了三个映射表:
- `isAdmin`:存储管理员地址和其是否为管理员的状态。
- `isUser`:存储用户地址和其是否为用户的状态。
- `username`:存储用户地址和其用户名的映射关系。
合约提供了以下功能:
- `constructor`:在合约部署时将合约创建者设为管理员。
- `register`:用户注册函数,将用户地址和用户名存储到映射表中。
- `grantAdmin`:授予管理员权限函数,只有管理员可以调用该函数。
- `revokeAdmin`:撤销管理员权限函数,只有管理员可以调用该函数。
Web3.js 代码:
```
const Web3 = require('web3');
const contractABI = require('path/to/contract-abi.json');
const web3 = new Web3('http://localhost:8545');
const contractAddress = '0x123456789abcdef';
const contractInstance = new web3.eth.Contract(contractABI, contractAddress);
async function register(username) {
const accounts = await web3.eth.getAccounts();
await contractInstance.methods.register(username).send({ from: accounts[0] });
}
async function grantAdmin(address) {
const accounts = await web3.eth.getAccounts();
await contractInstance.methods.grantAdmin(address).send({ from: accounts[0] });
}
async function revokeAdmin(address) {
const accounts = await web3.eth.getAccounts();
await contractInstance.methods.revokeAdmin(address).send({ from: accounts[0] });
}
async function getUsername(address) {
return await contractInstance.methods.username(address).call();
}
async function getAddress(username) {
return await contractInstance.methods.usernameToAddress(username).call();
}
module.exports = {
register,
grantAdmin,
revokeAdmin,
getUsername,
getAddress
};
```
该代码包括以下功能:
- `register`:调用合约的 `register` 函数,将用户名注册到合约中。
- `grantAdmin`:授权管理员权限。
- `revokeAdmin`:撤销管理员权限。
- `getUsername`:根据地址获取用户名。
- `getAddress`:根据用户名获取地址。
这些函数可以用于网站的登录和注册功能,以及管理员权限管理。
阅读全文