新学web3编程的小伙伴经常会被几个问题困扰。 我的助记词有什么用? 我的钱包的私钥是什么? 命令行生成的钱包怎么导入浏览器钱包呢?
新学web3编程的小伙伴经常会被几个问题困扰。
这篇文章就一个一个聊。
助记词遵守 BIP39 标准的一组单词,这组单词对应了分层钱包的种子。
没有助记词之前,是一组 256 以内的数字,称为 seeds。seeds 有什么用呢? 分层钱包,是通过种子加上 path 获取一系列秘钥对的算法。即 种子 -> 可以按照 path 推导出一系列的钱包秘钥对。 每一组秘钥对都对应了一组独立的地址。可以独立使用。
path 怎么设置?
path 是决定 秘钥的另一个变化因子,这部分应该遵循 : SLIP-0010。
SUI 的默认path 如下:
m/44'/784'/0'/0'/0'
各部分介绍如下:
m
:代表这是从主种子(Master Seed)开始的路径。44'
:这个数字表示遵循的是BIP-44标准。这里的撇号('
)意味着这是一个强化的派生,确保了子密钥的生成依赖于父密钥和父链码。784'
:这个数字代表 SUI 的加密货币类型。每种加密货币都有一个唯一的编号,这个编号通常由SLIP-0044标准定义。0'
:这代表用户的账户号码。在同一种加密货币下,用户可以有多个账户(如储蓄、交易等),这里的0'
代表第一个账户。0
:这表示地址的类型,其中0
通常代表外部链,用于接收资金(即公开的接收地址),而1
会代表内部链,用于找零或交易的找零地址。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 的命令行:
地址是什么呢?
这里可以查看对应的地址。
那么他对应的私钥是是什么呢?
这里对应了几个相关的配置文件。
怎么还原呢?
可以用一段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
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!