VueBloghyhero6

插件钱包登录业务上升到实践

2025-03-16 / 2025-03-16 / 72次浏览
上一篇简单的分析一下业务点,现在把这个业务点落到实际,

首先是密码加密 npm install browser-passworder

第二个要寻找的点是 chrome.storage.local 存储位置

以及该API的特性:
// chrome.storage.local 是异步的
await chrome.storage.local.set({key: 'value'});
const data = await chrome.storage.local.get('key');

chrome.storage.local 在同一个扩展的不同组件间(popup、background、content script)可以共享

一个是异步一个是使用的方法
所以这个存储方案:

是专门为浏览器扩展设计的
数据是持久化的(存在硬盘上,不是内存)
有更好的安全性和隔离性
支持扩展内部各组件共享数据
实现了内存缓存来提高读取性能
这就是为什么它适合用在浏览器扩展中存储配置和加密数据。

所以API 也有了然后就可以进行具体实操了,下一篇文章,代码详解实现的核心逻辑,起码浏览器插件钱包的一个业务层就在本地实现了。
由于换电脑折腾了几个小时的环境。
plasmo 就不多介绍了,Chrome 自己原生的话是支持创建配置文件和构建页面代码,但是要继承整个打包工具需要一些时间调试,当时追加进度直接采用plasmo了当时为了合乎需求专门研究了它相应的文档。

在命令行里 plasmo init,会自动的构建 tsconfig.json 里面的应用

{
  "extends": "plasmo/templates/tsconfig.base.json",
  "exclude": ["node_modules"],
  "include": [".plasmo/index.d.ts", "./**/*.ts", "./**/*.tsx"],
  "compilerOptions": {
    "paths": {
      "~*": ["./*"]
    },
    "baseUrl": "."
  }
}

更新vscode的时候出现一个报错
重点在  extends": "plasmo/templates/tsconfig.base.json",  这个电脑重构项目的时候,这个 tsconfig.base.json 文件老是会进行报错,重新关开vscode就好了。

根据 plasmo 框架协议,在pages文件夹下建大量的tsx组件文件。
直接上代码吧
import encryptor from "browser-passworder"

使用这个浏览器加密包

export const samplePasswordEncrypted = async (password: string) => {
  let encrypted = await encryptor.encrypt(password, "true")
  await chrome.storage.local.set({ ["userData"]: encrypted })
  return true
}

核心业务上注意这个 true,这个字符串,只要核心可以解析出true这个字段那么这个逻辑就是正确的。

对密码进行加密, 存储空间是 chrome.storage.local 浏览器控制的硬盘空间里,

export const samplePasswordDecrypted = async (password: string) => {
  // 读取解密信息
  let encrypted = await chrome.storage.local.get(["userData"])
  // 之后解密验证
  try {
    const decrypted = await encryptor.decrypt(password, encrypted.userData)
    if (decrypted === "true") {
      return true
    }
  } catch (error) {
    return false
  }
}
解谜业务的逻辑也相对简单,拿到 api 使用 decrypt 的方法,解密,

最后还需要追加方法,
export const samplePasswordExist = async () => {
  let encrypted = await chrome.storage.local.get(["userData"])
  if (encrypted["userData"]) {
    return true
  } else {
    return false
  }
}
验证是否存在。
这个加解密系统可以说是贯穿钱包体系的所有的核心业务了,因为后面的私钥存储,以及身份验证都会使用该方法进行业务验证。直接钱包业务庞大逻辑中的其中一环分支。

在分电脑重启项目的时候,碰到过几个小毛病,一个 vscode 需要不断重新重启,因为每次安装 node_modules 之后,vscode的tsx 都多少会显示报错信息。

第二个小的毛病点是,node 版本20 使用 pnpm 安装包死活报错,重新删除了几次 package.json 和包文件都不行,
最后还是使用 npm 成功安装。

钱包都有一个缓存多长时间解锁的功能,那么我之前翻遍unisat的代码并没有发现它这个时间锁和服务器有任何关联性,
所以项目初始考虑自己实现一个,不取自区块链接口,也不取自后端接口,因为有些钱包需求是断网的情况下依旧可以本地生成助记词,反正这个解锁功能的话也算钱包的核心需求之一。

太长了关于时间戳解锁的功能就暂时留到下篇在搞。                                                              

kms