• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

竹千代

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

去中心化钱包的登录设计

 

一、创建钱包

创建钱包有多种交互形式: 助记词、强密码。 他们的好处都是既通过多重加密保护了密钥的安全,又降低记忆密码的难度。

  • 强密码: 会把用户输入强密码转成keystore文件。 这步可以使用@wallet/client包实现。
  • 助记词: 会把自动生成的密钥转换成12个单词。

二、访问钱包

连接钱包,有开放标准协议。 主要实现了开放标准协议,就可以把它集成到任何钱包软件中。有以下两种协议:

  • WalletConnect
    • 使用@walletconnect/ethereum-provider库进行连接,相对于web协议优势: 支持二维码扫码、多端
  • walletlink
  • web3: 适用于浏览器extension
const web3 = new Web3(providedProvider);  // 区块链节点
await providedProvider.enable();   // 请求用户授权连接
const acc = await web3.eth.requestAccounts();   // 获取账户列表
const wallet = new Web3Wallet(acc[0]);   // 获取账户实例,可以用于签署交易

三、新建和访问钱包

通过助记词、个人密码来创建新钱包

  • 由个人密码,生成keystore文件,用户要自己管理好keystore文件
import Wallet from 'ethereumjs-wallet';        
const wallet = new Wallet.generate();        
wallet
   .toV3(password, {
      kdf: keystoreConfig.kdf,
      n: keystoreConfig.n
   })
   .then(res => {
       createdWallet.blobUrl = createBlob(res);   // 下载链接
       createdWallet.name = wallet.getV3Filename();
       resolve(createdWallet);
   });     

<a
ref="downloadLink"
:href="blobUrl"
rel="noopener noreferrer"
:download="name"
class="link"
/>

  • 助记词

通过bip39协议生成一组助记词;  登入时候,助记词可以固定算法生成一串seed,根据seed+索引顺序index能算出很多组公钥和私钥

// 创建助记词
const bip39 = require('bip39'); function phrase12() { return bip39.generateMnemonic(128).split(' '); } function phrase24() { return bip39.generateMnemonic(256).split(' '); } 
// 助记词生成seed
  this.hdKey = HDKey.fromMasterSeed(
    bip39.mnemonicToSeedSync(this.mnemonic, this.password)
  );
  // seed和索引值算出公私钥
  const derivedKey = this.hdKey.derive(this.basePath + '/' + idx);
  derivedKey.privateKey
  • WalletConnect V2协议
const signClient = await EthereumProvider.init({
   chainId: '',
});
signClient.on('connect', evt => {
    const { chainId } = evt;
    // 然后signClient就相当于是一个etherum实例,可以用于发送(包含做签名)交易
});

 三、交易

  1. 查询各货币的交易汇率

    从changelly等聚合器的api上,用axios发送请求

   2. 发送方式

    使用web3.js的api

       3. 交易记录

             可以直接用web3.js在链上从当前区块currentBlock一直往前查,过滤出交易地址等于自己的

            从区块链浏览器的api上, 如etherscan等。 etherscan本身就是利用1个全节点收集了全部数据到中心化服务,所以它支持分页等功能

四、区块链网络

  区块链网络之间的切换

五、安全性

  最重要的就是私钥、助记词的安全性。 既要做到保证安全性,又要登陆简便(不用每次输入助记词)

  1. UI交互要强调提示用户记录私钥、助记词; 或者提供一键保存功能,会保存成keystore文件,下载到本地(注意保存前要加密)。
  2. 为了避免每次都要输入或者导入私钥、助记词; 可以在浏览器缓存,但是也要必须先输入强密码(用于加密)。  之后用户进来,输入这个强密码,即可自动解密得到私钥
  3. 如果再为了避免每次刷新后,都要输入强密码,需要借助中心化服务。 但是中心化服务,也不应该存私钥。 
    1. 登录/创建成功后,把强密码传递到中心化服务端
    2. 中心服务,通过jwt的认证方式,生成token返回到前端; 前端把token放置到localstorage或者cookie中
    3. 以后每次刷新或者重新进来,前端发请求到中心化服务; 该服务返回强密码,前端根据强密码解密暂存在localstorage中的私钥信息
  4. multi-sig方法

     总之,都是要至少有双重保护。  app端,生物识别+移动设备;  web端:keystore文件+密码;  extension: 设备+密码

六、会用到的库

  • bip39: 生成助记词
  • hdkey: 派生地址
  • @walletconnect/ethereum-provider: 支持walletconnect协议登录
  • ethers.js: 交易签名、合约交互
  • crypto.js:对称加/解密助记词
  • idb: 保存到indexdb

posted on 2024-02-15 16:39  竹千代  阅读(88)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3