上一篇简单的分析一下业务点,现在把这个业务点落到实际,
首先是密码加密 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的代码并没有发现它这个时间锁和服务器有任何关联性,
所以项目初始考虑自己实现一个,不取自区块链接口,也不取自后端接口,因为有些钱包需求是断网的情况下依旧可以本地生成助记词,反正这个解锁功能的话也算钱包的核心需求之一。
太长了关于时间戳解锁的功能就暂时留到下篇在搞。
文章采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接。