004 以太坊钱包开发-创建用户

安装模板引擎

$ cd myWallet

# 安装koa模板使用中间件
$ npm install --save koa-views

# 安装ejs模板引擎
$ npm install --save ejs

引入模版引擎

修改 myWallet/index.js,加载模版引擎

const Koa = require('koa');
const routers = require('./routers/index')
const koaBody = require('koa-body');
const views = require('koa-views')
const path = require('path')

const app = new Koa();

// 引入 koa-body 中间件
app.use(koaBody({
  multipart: true
}));

// 加载模板引擎
app.use(views(path.join(__dirname, './view'), {
    map : {html:'ejs'}
  }))

// 初始化路由中间件
app.use(routers.routes()).use(routers.allowedMethods())
app.listen(3000);
console.log('server is starting at port 3000')

新建 view 页面

进入项目目录,新建 view 文件夹,新建 account.html

$ cd myWallet
$ mkdir view
$ vi account.html

account.html 代码如下:




    
    
    fujinliang.top
    


    account


修改 controllers/account.js ,调用 ctx.render("account") 实现页面的跳转

module.exports = {
    async getAccountList (ctx) {
        await ctx.render("account")
    }
}

通过 node index.js 启动项目, 通过访问 http://localhost:3000 查看结果,页面显示如下:

account

引入 Bootstrap css框架

进入 https://getbootstrap.com/ 下载 bootstrap

如何存放 bootstrap 的样式文件?

需要引入静态文件目录

引入静态文件目录

$ cd myWallet
$ npm install koa-static

修改 index.js 引入koa-static

...

const static = require('koa-static')

const app = new Koa();

// 静态资源目录对于相对入口文件index.js的路径
const staticPath = './static'

app.use(static(
  path.join( __dirname,  staticPath)
))

...

通过 web3 实现用户创建

用户创建的主要流程:通过 web3.eth.accounts.create() 创建用户,会得到 account 的 地址及私钥。通过 account.encrypt(pwd) 生成keystore 的内容,同时通过 fs.writeFile 方法将内容写入到文件之中。

async createAccount (ctx) {
        let returnResult = {
            code: 0,
            msg: '成功!',
            data: {}
        }
        
        let data = ctx.request.body
        const pwd = data.pwd

        // 调用 web3 创建账户
        let account = await web3.eth.accounts.create();

        // encrypt 返回一个JSON 对象
        const keystoreJson = await account.encrypt(pwd)
        
        // 将 JSON 对象转为字符串
        const keystoreStr = JSON.stringify(keystoreJson)

        // 生成随机文件存储 keystore 的字符串
        const randFilename = "UTC--"+new Date().toISOString()+"--"+account.address
        
        // 设置存储文件的目录
        const filePath =path.join(__dirname,"../static/keystore/"+randFilename)
        
        // 将 keystore 的内容写入文件中
        await fileUtil.writeFile(filePath,keystoreStr)
        
        // 将 用户地址、私钥、keystore 数据返回
        const result = {"account":account.address,"privateKey":account.privateKey,"keystore": config.keystoreUrl+randFilename}
        returnResult.data = result
        ctx.body = returnResult
    },

将 keystore 的内容写到文件之中。

const fs = require("fs")

module.exports = {
    
    readFile(fPath) {
        return new Promise(function (resolve, reject) {
            fs.readFile(fPath, function(err, data) {
                if (err) reject(err);
                else resolve(data);
            });
        });
    },
    
    writeFile(fPath, content) {
        return new Promise(function(resolve, reject) {
            fs.writeFile(fPath, content, function(err, data) {
                if (err) reject(err);
                else resolve("Successed");
            });
        });
    }
}

添加路由的配置

修改 routers/index.js ,添加如下代码:

router.post('/account/create',accountController.createAccount)

创建账户的前端页面

创建钱包的页面主要包含以下功能:

  1. 输入密码生成 keystore
  2. 下载 keystore 文件
  3. 下载私钥



    
    
    fujinliang.top
    
    
    


    

演示效果

启动私链网络

使用 geth 启动私有网络

$ geth --datadir ~/privatechain/data0 --networkid 110  --rpc console

启动项目

$ cd myWallet
$ node index.js

访问 http://localhost:3000 查看项目:

004 以太坊钱包开发-创建用户_第1张图片
image

源码下载

https://github.com/didianV5/web3EthWallet/tree/master/004_myWallet

关注公众号


004 以太坊钱包开发-创建用户_第2张图片
关注公众号

你可能感兴趣的:(004 以太坊钱包开发-创建用户)