解锁钱包账号姿势二:keystore+密码

一、储备知识

使用web3通过keystore+密码解锁账号

通过keystore+密码解锁账号需要使用web3.js的如下API,相当于解密keystore。

API

web3.eth.accounts.decrypt(keystoreJsonV3, password);

参数:

  • keystoreJsonV3 - String: 要解密私钥的keystore。
  • password - String: 加密keystore文件的密码,一般为创建账号时的密码。

返回值:

Object:解密的帐户对象。

例子

web3.eth.accounts.decrypt({
    version: 3,
    id: '04e9bcbb-96fa-497b-94d1-14df4cd20af6',
    address: '2c7536e3605d9c16a7a3d7b1898e529396a65c23',
    crypto: {
        ciphertext: 'a1c25da3ecde4e6a24f3697251dd15d6208520efc84ad97397e906e6df24d251',
        cipherparams: { iv: '2885df2b63f7ef247d753c82fa20038a' },
        cipher: 'aes-128-ctr',
        kdf: 'scrypt',
        kdfparams: {
            dklen: 32,
            salt: '4531b3c174cc3ff32a6a7a85d6761b410db674807b2d216d022318ceee50be10',
            n: 262144,
            r: 8,
            p: 1
        },
        mac: 'b8b010fff37f9ae5559a352a185e86f9b9c1d7f7a9f1bd4e82a5dd35468fc7f6'
    }
}, 'test!');
> {
    address: "0x2c7536E3605D9C16a7a3D7b1898e529396a65c23",
    privateKey: "0x4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318",
    signTransaction: function(tx){...},
    sign: function(data){...},
    encrypt: function(password){...}
}

二、项目源码

通过keystore+密码解锁账号。

1. account.js

编辑controllers文件夹下的account.js文件,后端实现通过keystore+密码解锁账号。


......

let fs = require("fs")

module.exports = {
    ......

    unlockAccountWithKeystore: async (ctx) => {
        //1. 获取前端传递的数据,包括keystore、密码
        let password = ctx.request.body.password
        console.log(password)
        let keystore = ctx.request.files.file
        console.log(keystore)
        //2.读取缓存文件中keystore的数据
        let keystoreData = fs.readFileSync(keystore.path, "utf8")
        console.log(keystoreData)
        //3. 通过keystore和密码解锁账户
        let account = web3.eth.accounts.decrypt(JSON.parse(keystoreData), password)
        console.log(account)
        //4.将账户信息返回给前端
        ctx.body = await setResponseData(account)
    },
}     

2. router.js

将通过keystore解锁账户的接口绑定到路由。

......

//通过keystore解锁账户
router.post("/unlock/keystore", accountController.unlockAccountWithKeystore)
1
2
3
3. transaction.html
编辑views文件夹下的transaction.html文件,实现前端通过keystore+密码解锁账户的页面。

<div id="unlock-account-keystore" style="display: none">
    <h3>请选择你的keystore文件</h3>
    <input type="file" id="unlock-accoutn-file">
    <br><br>
    <input type="password" id="unlock-account-password">
    <br><br>
    <button onclick="unlockAccountWithKeystore()">解锁</button>
</div>

4. wallet.js

编辑static文件夹下的wallet.js文件,前端处理通过通过Keystore文件+密码解锁账户的网络请求。

......

//通过Keystore解锁账户
function unlockAccountWithKeystore() {
    var filedata = $("#unlock-accoutn-file").val()
    if (filedata.length <= 0) {
        alert("请选择文件!")
        return
    }
    //文件上传通过Formdata去储存文件的数据
    var data = new FormData()
    data.append("file", $("#unlock-accoutn-file")[0].files[0])
    data.append("password", $("#unlock-account-password").val())
    var urlStr = "/unlock/keystore"
    $.ajax({
        url: urlStr,
        type: "post",
        dataType: "json",
        contentType: false,
        data: data,
        processData: false,
        success: function (res, status) {
            alert(JSON.stringify(res)+status)
            if (res.code == 0) {
                //将服务端返回的账户信息显示到页面
                //configAccountInfo(res.data)
            } 
        },
        error: function (res, status) {
            alert(JSON.stringify(res)+status)
        }
    })
}

三、项目运行效果

项目源码Github地址

作者:李旭

来源:http://www.chaindesk.cn

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦