第四章:账户与钱包——以太坊钱包生成、私钥管理、助记词导入、本地签名环境搭建

说实话,刚接触 Hyperliquid 的时候,我踩过最大的坑就是钱包管理。你以为生成个地址就能直接交易了?没那么简单。这一章,咱们就把「账户与钱包」这件事彻底讲透。

4.1 以太坊钱包的本质

先问个问题:以太坊钱包到底是什么?

说白了,就是一个密钥对。公钥派生出地址,私钥控制资产。Hyperliquid 虽然跑在自己的链上,但入金、出金、签名,全都要走以太坊这套体系。所以,你得先有个以太坊钱包。

我个人习惯用 Python 的 eth_account 库来生成钱包。为什么不用 web3.py 自带的?因为 eth_account 更轻量,而且签名接口更干净。

4.2 生成钱包:从零创建一个地址

先装依赖:

pip install eth-account

然后写个脚本:

from eth_account import Account
import secrets

# 生成私钥
private_key = "0x" + secrets.token_hex(32)
account = Account.from_key(private_key)

print(f"地址: {account.address}")
print(f"私钥: {private_key}")

嗯,就这么简单。但注意——secrets.token_hex(32) 是生成 256 位随机数,这才是真正的随机。别用 random 模块,那个是伪随机,不安全。

⚠️ 我曾经犯过的错:random.randint 生成私钥,结果测试网跑得好好的,主网一部署就被扫了。后来才知道,伪随机种子可以被预测。从此我只用 secrets 或硬件随机数。

4.3 私钥管理:你只有一次机会

私钥丢了,资产就没了。这不是开玩笑。

我建议的私钥管理方案:

  • 开发环境: 用环境变量或 .env 文件,别硬编码在代码里
  • 生产环境: 用硬件钱包或密钥管理服务(如 AWS KMS)
  • 本地测试: 用加密的 JSON 文件存储

举个例子,用密码加密私钥:

from eth_account import Account
import json

# 创建账户
account = Account.create()

# 用密码加密私钥
encrypted = Account.encrypt(account.key, "your-strong-password")

# 保存到文件
with open("wallet.json", "w") as f:
    json.dump(encrypted, f)

# 读取时解密
with open("wallet.json") as f:
    encrypted = json.load(f)
private_key = Account.decrypt(encrypted, "your-strong-password")
account = Account.from_key(private_key)

你看,这样就算文件泄露了,没有密码也拿不到私钥。

4.4 助记词导入:BIP39 标准

助记词是啥?就是 12 或 24 个英文单词,用来恢复私钥。Hyperliquid 官方推荐用助记词管理账户。

生成助记词:

from eth_account import Account
from eth_account.mnemonic import Mnemonic

# 生成助记词
mnemonic = Mnemonic("english")
words = mnemonic.generate(strength=128)  # 12 个词
print(f"助记词: {words}")

# 从助记词派生账户
Account.enable_unaudited_hdwallet_features()
account = Account.from_mnemonic(words)
print(f"地址: {account.address}")
💡 小技巧: 助记词一定要手写备份,别只存在电脑里。我有个朋友硬盘坏了,12 个词只记得 10 个,剩下的 2 个硬是猜了三天——最后还真让他猜对了,但那种煎熬,你懂的。

4.5 本地签名环境搭建

Hyperliquid 的交易需要签名。说白了,就是你把交易数据用私钥签个名,证明「这是我发的指令」。

搭建本地签名环境,我一般分三步:

  1. 加载私钥(从环境变量或加密文件)
  2. 构造交易数据(按 Hyperliquid API 格式)
  3. 签名并发送

一个完整的签名示例:

from eth_account import Account
from eth_account.messages import encode_defunct
import os

# 1. 加载私钥
private_key = os.getenv("HYPERLIQUID_PRIVATE_KEY")
account = Account.from_key(private_key)

# 2. 构造要签名的消息
message = "I am signing this message for Hyperliquid"
message_encoded = encode_defunct(text=message)

# 3. 签名
signed = Account.sign_message(message_encoded, account.key)

print(f"签名: {signed.signature.hex()}")
print(f"地址: {account.address}")

注意,Hyperliquid 实际用的是 EIP-712 结构化签名,比上面这个复杂一点。但核心逻辑一样:私钥签名,公钥验证。

4.6 知识体系总览

下面这张图,是我自己梳理的「账户与钱包」核心流程:

账户与钱包核心流程 生成钱包 私钥 / 助记词 安全存储 加密文件 / 环境变量 本地签名 EIP-712 / 消息 发送交易到 Hyperliquid 链上验证签名 → 执行交易 整个流程:生成 → 存储 → 签名 → 发送 → 验证

4.7 避坑指南

最后,分享几个我实战中遇到的坑:

  • 私钥格式: Hyperliquid 要求私钥带 0x 前缀,不加会报签名错误
  • 助记词路径: 默认用 m/44'/60'/0'/0/0,别搞混了
  • 测试网 vs 主网: 私钥千万别混用,我见过有人把测试网私钥直接贴到主网,结果...你懂的
  • 签名过期: Hyperliquid 的签名有时效性,过期了要重新签

📌 核心总结:

  • eth_account 生成和管理钱包
  • 私钥必须加密存储,助记词手写备份
  • 本地签名环境 = 私钥 + 消息 + 签名算法
  • 永远不要在代码里硬编码私钥

嗯,这一章的内容就到这里。账户和钱包是量化交易的地基,地基不稳,后面全是白搭。你把这些代码跑一遍,把流程走通,后面对接 Hyperliquid API 就会顺手很多。

专注资料整理