第四章:账户与钱包——以太坊钱包生成、私钥管理、助记词导入、本地签名环境搭建
说实话,刚接触 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}")
4.5 本地签名环境搭建
Hyperliquid 的交易需要签名。说白了,就是你把交易数据用私钥签个名,证明「这是我发的指令」。
搭建本地签名环境,我一般分三步:
- 加载私钥(从环境变量或加密文件)
- 构造交易数据(按 Hyperliquid API 格式)
- 签名并发送
一个完整的签名示例:
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 知识体系总览
下面这张图,是我自己梳理的「账户与钱包」核心流程:
4.7 避坑指南
最后,分享几个我实战中遇到的坑:
- 私钥格式: Hyperliquid 要求私钥带
0x前缀,不加会报签名错误 - 助记词路径: 默认用
m/44'/60'/0'/0/0,别搞混了 - 测试网 vs 主网: 私钥千万别混用,我见过有人把测试网私钥直接贴到主网,结果...你懂的
- 签名过期: Hyperliquid 的签名有时效性,过期了要重新签
📌 核心总结:
- 用
eth_account生成和管理钱包 - 私钥必须加密存储,助记词手写备份
- 本地签名环境 = 私钥 + 消息 + 签名算法
- 永远不要在代码里硬编码私钥
嗯,这一章的内容就到这里。账户和钱包是量化交易的地基,地基不稳,后面全是白搭。你把这些代码跑一遍,把流程走通,后面对接 Hyperliquid API 就会顺手很多。