博客
关于我
边学边用--使用React下的Material UI框架开发一个简单的仿MetaMask的网页版以太坊钱包(一)
阅读量:854 次
发布时间:2019-03-25

本文共 4363 字,大约阅读时间需要 14 分钟。

开发一个简单的以太坊钱包:仿MasterMask的网页版钱包

随着区块链技术的快速发展,以太坊的推广和应用越来越受到重视。近年来,国家和各地政府都在积极推动区块链技术的发展,央行数字货币的研发也在逐步推进。以太坊作为区块链技术的升级版,其应用场景无处不在。然而,现有的以太坊钱包大多需要依赖浏览器插件,比如MetaMask,使用时又需翻墙下载,使用体验较差。作为一个学习Material UI的开发者,本文旨在开发一个简单易用的以太坊钱包。

1. 功能设计

我们的目标是开发一个功能基础但实用性强的以太坊钱包,满足以下需求:

  • 私钥加密管理:私钥加密存储,本地解密使用密码
  • 支持多网络:主网、测试网(如Ropsten、Rinkeby、Kovan)
  • 用户管理:新建账号、导入钱包
  • 基本交易功能:ERC20代币转账、ETH转账、签名交易
  • 界面友好:适配电脑和手机端

本文将重点介绍用户新建钱包时的界面设计与实现过程。

2. 技术实现

开发过程选用React框架与Material UI组件,确保界面简洁且易用。以下是主要技术要点:

2.1 消息条优化

为了提升用户体验,我们自定义消息条显示,将enqueueSnackbar封装为SimpleSnackbar,并新增Provider供跨组件调用。代码如下:

import React, { createContext, useContext } from 'react'import { useSnackbar } from 'notistack'const SnackbarContext = createContext()export function useSimpleSnackbar() {    return useContext(SnackbarContext)}const VARIANTS = ['default', 'success', 'error', 'warning', 'info']export default function Provider({ children }) {    const { enqueueSnackbar } = useSnackbar()    const showSnackbar = (message, variant = 'default', closeNotification) => {        // 判断是否为有效的variant        const finalVariant = VARIANTS.includes(variant)             ? variant             : 'default'                enqueueSnackbar(message, {            variant: finalVariant,            onClose: closeNotification        })    }    return (        
{children}
)}

2.2 网络选择

在钱包选择网络时,需支持多种网络环境,我们开发了一个网络上下文管理器:

import React, { useState, createContext, useMemo } from 'react'const NetworkContext = createContext()export default function NetworkProvider({ children }) {    const [network, setNetwork] = useState('homestead')        const value = useMemo(() => ({        network,        updateNetwork: setNetwork    }), [network])        return (        
{children}
)}export function useUpdateNetwork() { const [, setNetwork] = useNetworkContext() return setNetwork}export function useNetwork() { const [network] = useNetworkContext() return network}

2.3 界面设计

新建钱包界面遵循扁平化设计理念,主要分为Logo和网络选择模块,以及密码设置模块。

2.3.1 Logo展示

为提升品牌识别度,我们开发了Logo组件,支持布局自适应:

import React from 'react'import Typography from '@material-ui/core/Typography'import { makeStyles } from '@material-ui/core/styles'import WalletIcon from './components/Logo'const useStyles = makeStyles((theme) => ({    icon: {        width: 50,        height: 50    },    grow: {        marginTop: theme.spacing(-0.5),        fontSize: 15    }}))export default function Logo() {    const classes = useStyles()    return (        
KHWallet
KHWallet
)}

2.3.2 网络选择按钮

通过Material UI菜单组件实现,支持多种网络切换。

import React, { useState, useEffect } from 'react'import { makeStyles, withStyles } from '@material-ui/core/styles'import MenuItem from '@material-ui/core/MenuItem'import CloseIcon from '@material-ui/icons/Close'import { purple, green } from '@material-ui/core/colors'const useStyles = makeStyles((theme) => ({    root: {        display: 'flex'    },    btnIcon: {        fontSize: 15,        height: 40,        fontWeight: 'solid',        border: '1px solid black',        borderRadius: 25    },    btnContext: {        marginTop: theme.spacing(-0.7)    },    btnText: {        position: 'relative',        top: theme.spacing(-1)    }}))

2.3.3 密码设置

使用Material UI的Form组件进行密码管理,支持12位及以上密码:

import React, { useState } from 'react'import { makeStyles } from '@material-ui/core/styles'import TextField from '@material-ui/core/TextField'import Typography from '@material-ui/core/Typography'const useStyles = makeStyles((theme) => ({    form: {        width: '100%',        marginTop: theme.spacing(1),        textAlign: 'center'    },    submit: {        fontSize: 20,        width: '50%',        marginTop: theme.spacing(5)    }}))

3. 页面布局

将各模块组合成一个统一的钱包页面,使用React的Grid布局:

import { Grid } from '@material-ui/core'import WalletBar from './components/WalletBar'import CreateWallet from './CreateWallet'import Paper from '@material-ui/core/Paper'const useStyles = makeStyles((theme) => ({    root: {        marginTop: theme.spacing(isMobile ? 8 : 10),        display: 'flex',        justifyContent: 'center'    }}))

4. 上线与优化

完成开发后,对代码进行最终优化和部署:

4.1 代码优化

去除冗余代码,优化UI组件,提升运行效率。

4.2 部署环境

将项目部署至CodeSrium云端,作为开发调试基础。

4.3 首次运行

检查运行时依赖,安装必要的第三方库,确保钱包界面呈现预期效果。

5. 总结

开发本以太坊钱包项目遵循"开发者优先"原则,注重易用性和简洁性。虽然功能还处于基础阶段,但从设计到实现的每一步都体现了对Material UI的熟练掌握。未来计划完善交易历史和多用户支持等功能。

转载地址:http://mtpyk.baihongyu.com/

你可能感兴趣的文章
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Nginx配置负载均衡到后台网关集群
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>