Let's Move (聊一聊 sui 的秘钥)

  • xing.sir
  • 更新于 2024-04-01 09:41
  • 阅读 317

新学web3编程的小伙伴经常会被几个问题困扰。 我的助记词有什么用? 我的钱包的私钥是什么? 命令行生成的钱包怎么导入浏览器钱包呢?

新学web3编程的小伙伴经常会被几个问题困扰。

  1. 我的助记词有什么用?
  2. 我的钱包的私钥是什么?
  3. 命令行生成的钱包怎么导入浏览器钱包呢?

这篇文章就一个一个聊。

助记词:

助记词遵守 BIP39 标准的一组单词,这组单词对应了分层钱包的种子。

没有助记词之前,是一组 256 以内的数字,称为 seeds。seeds 有什么用呢? 分层钱包,是通过种子加上 path 获取一系列秘钥对的算法。即 种子 -> 可以按照 path 推导出一系列的钱包秘钥对。 每一组秘钥对都对应了一组独立的地址。可以独立使用。

path 怎么设置?

path 是决定 秘钥的另一个变化因子,这部分应该遵循 : SLIP-0010。

SUI 的默认path 如下:

m/44'/784'/0'/0'/0'

各部分介绍如下:

  1. m:代表这是从主种子(Master Seed)开始的路径。
  2. 44':这个数字表示遵循的是BIP-44标准。这里的撇号(')意味着这是一个强化的派生,确保了子密钥的生成依赖于父密钥和父链码。
  3. 784':这个数字代表 SUI 的加密货币类型。每种加密货币都有一个唯一的编号,这个编号通常由SLIP-0044标准定义。
  4. 0':这代表用户的账户号码。在同一种加密货币下,用户可以有多个账户(如储蓄、交易等),这里的0'代表第一个账户。
  5. 0:这表示地址的类型,其中0通常代表外部链,用于接收资金(即公开的接收地址),而1会代表内部链,用于找零或交易的找零地址。
  6. 0':这是该账户下的具体地址索引号,表示这是第一个生成的地址。撇号(')在这个位置是不常见的,因为地址索引通常是非强化的,但这里的使用表明一个特定的强化派生。

结论应该是这样的:

泄露助记词,即泄露了包含path 的一系列秘钥。 所以,某些层面,助记词的安全性远大于秘钥。 不过助记词记忆方便一些。所以,大部分的 wallet 都支持助记词导入。

助记词推导默认的秘钥的一段代码:

const mnemonic = ".. .. ... " ; // 助记词
const path = "m/44'/784'/0'/0'/0'"; // 固定推导
const pair = Ed25519Keypair.deriveKeypairFromSeed(seedHex, path);  // 获得秘钥
console.log(pair.toSuiAddress());  // 将获得 cli 钱包的默认地址

接下来,如果你想批量进行某些 合约操作。 可以按照这种形式来管理秘钥,保存好你的助记词,你就可以操作你的所有资产。

那又有同学要问了,既然助记词是一堆单词列表,那么谁规定的用哪些单词呢?

这个问题特别好。 bip39 官方定义了一组各种语言的 wordlist ,用来作为单词。 各个分层钱包,按照相应的标准导入、导出。

不过,有意思的是,通过 相关代码逻辑,你也可以自定义你的wordlist 。 看着自己熟悉东西的助记词更好记吧。 😄

自定义wordlist 的代码如下:

  import { generateMnemonic } from "bip39";
  import * as mywordlist from "./mywordlist.json";
  const mnemonic = generateMnemonic(256, undefined, mywordlist);
  console.log(mnemonic);

私钥

按照以上助记词部分的描述, 助记词可以推导出私钥。 某些时候,我不想把整个的 秘钥体系都告诉别人,我只想告诉他相关的一个。这个时候,我将助记词推导出的一个 秘钥对告诉对方即可。也遵循安全体系中的最小化原则。 大部分的钱包也支持私钥导入,一个私钥对应一个地址。无法通过私钥反推助记词。

私钥在web3世界里是安全系数顶级的存在,一个私钥对应了一个地址,也对应了在上边绑定的资产。 web3安全体系依托于私钥的签名功能,来保证资产的所有权。 泄露私钥你的web3资产也将不复存在。 所以,无论任何时候,请保证你的私钥不被第三方知道,除非你知道你在做什么?

命令行钱包

命令行钱包生成以后,会将私钥或者助记词加密保存。大多数不提供助记词存储。所以,助记词要谨记。 一般会将当前地址相关的秘钥加密保存。保存为keystore。

参考下 sui 的命令行:

image.png

  1. sui 支持几种秘钥,现在 ed25519 居多。
  2. Secret Recovery Phrase 这一部分对应了助记词,只显示一次。 你可以将这个导入 wallet 扩展,即可完成 cli 和 扩展的同步操作。

地址是什么呢?

image.png

这里可以查看对应的地址。

那么他对应的私钥是是什么呢?

image.png

这里对应了几个相关的配置文件。

  1. client.yaml 中包含了网络信息 , rpc 节点等,某些情况下,你可能需要修改这个文件。
  2. sui.keystore 这里保存了 protect key 即 私钥的 base64 编码信息。

怎么还原呢?

可以用一段js 脚本来还原,打印:

    const keystore = ["AG64dEEUuWLZNQqS1OvBFKlLmIcuKYPYWCR927sJaGSY"];
    const data = Buffer.from(keystore[0], "base64");
    const items = new Uint8Array(data);
    // 跳过第一个字节,这个是 sui 用来标识秘钥类型的。 
    const pair = Ed25519Keypair.fromSecretKey(items.subarray(1));
    console.log(pair.toSuiAddress());
    console.log(pair.getSecretKey());

telegram: <https://t.me/move_cn> QQ群: 79489587

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
xing.sir
xing.sir
0x427f...39a8
web3 让世界更美好。