数字货币正以惊人的速度走进大众视野,而一个安全、易用的 加密钱包 已经成为刚需。本文将以 Python 为主语言,结合 Web3.py 与 CoinGecko API 带你完成一款极简而功能完备的链上钱包 Demo:生成账户、发送交易、实时展示币种行情,全程不到 150 行代码,零基础也能跑通。
为什么要自己写一个加密钱包?
- 完全掌控私钥:自己写、自己托管,资产所有权真正回到手里。
- 练手机会:理解 区块链技术 的最快方式就是动手写一次。
- 二次开发自由:后续无论是做多链、NFT 收藏,还是接入 DeFi,都能平滑扩展。
前置概念梳理
区块链网络
简单来说,区块链网络 就是分布式账本+共识算法的组合。
在以太坊示例中,全网节点共同维护同一份 去中心化数据库,任何人都能验证交易,但无法单方面篡改历史记录。
加密钱包
它并不是真正“存放币”,而是:
- 生成并保管 私钥(用于签名);
- 根据私钥计算 公开地址(用于收款);
- 把已签名的交易广播到链上。
技术雷达:Python·Web3·CoinGecko
| 名称 | 角色 | 关键关键词 |
|---|---|---|
| Python | 主编程语言 | python 钱包 |
| Web3.py | 与以太坊交互的瑞士军刀 | web3 |
| CoinGecko API | 免费实时行情接口 | coingecko api 教程 |
开发实战四步走
1. 环境准备(2 分钟)
# macOS / Linux / Windows PowerShell 均可执行
python -m venv venv
source venv/bin/activate
pip install web3 python-dotenv requests2. 连接以太坊网络
打开你的代码编辑器,新建 wallet.py:
from web3 import Web3, Account
from dotenv import load_dotenv
import requests, os
load_dotenv()
INFURA_KEY = os.getenv("INFURA_KEY") # 在.env文件里填写你的节点 ID
w3 = Web3(Web3.HTTPProvider(f"https://mainnet.infura.io/v3/{INFURA_KEY}"))
print("当前链是否连通?", w3.is_connected())想练习却囊中羞涩?👉 立即领取免费测试 ETH,体验零成本链上实验。
3. 一键生成公私钥对
在钱包正式写入私钥前,先做离线生成:
account = Account.create()
print("地址:", account.address)
print("私钥(保密!):", account.key.hex())只需一行代码,你就得到了:
- 0x 开头的 42 位地址:收款或查余额均用它。
- 64 位十六进制私钥:务必本地存储、切勿上传到 GitHub。
4. 用 CoinGecko API 取行情
CoinGecko Demo 计划目前每月 10,000 次调用,普通教程足够用:
def fetch_price(coin_id="ethereum", vs_currency="usd", days=1):
url = f"https://api.coingecko.com/api/v3/coins/{coin_id}/market_chart"
params = {"vs_currency": vs_currency, "days": days}
return requests.get(url, params=params).json()
prices = fetch_price()
print("过去24h价格列表:", prices["prices"][:5]) # 取前 5 条编写完整交易逻辑
def send_eth(from_acct, to_addr, value_eth):
tx = {
'nonce': w3.eth.get_transaction_count(from_acct.address),
'to': to_addr,
'value': w3.to_wei(value_eth, 'ether'),
'gas': 21000,
'gasPrice': w3.to_wei('30', 'gwei'),
'chainId': 1 # 主网
}
signed = from_acct.sign_transaction(tx)
tx_hash = w3.eth.send_raw_transaction(signed.rawTransaction)
return tx_hash.hex()
# 示例:从本地私钥加载账户后,发送 0.001 ETH
my_account = Account.from_key(os.getenv("PRIVATE_KEY"))
print("交易哈希:", send_eth(my_account, "0x...", 0.001))运行成功,你可以在 Etherscan 输入返回的 tx_hash 查看链上确认。
把钱包做成 CLI 小工具
为了让非开发同学也能玩,额外再加 15 行代码:
import argparse
parser = argparse.ArgumentParser(description='极简以太钱包')
parser.add_argument('--price', action='store_true', help='查看 ETH 价格')
parser.add_argument('--send', nargs=2, metavar=('TO', 'AMOUNT'), help='发送 ETH')
args = parser.parse_args()
if args.price:
fetch_price(coin_id='ethereum', days=0) # 只要最新价
elif args.send:
_to, _val = args.send
tx = send_eth(my_account, _to, float(_val))
print("转账完成!", tx)体验方式:
chmod +x wallet.py
./wallet.py --price
./wallet.py --send 0x123... 0.002FAQ:读者最常见 5 问
问1:Infura 免费节点够用吗?
答:学习阶段完全够用;正式产品建议接入多节点或自建 以太坊全节点,提升稳定性。
问2:私钥泄露会怎样?
答:任何拿到私钥的人都能转移资产,请务必用 硬件钱包 或 HSM 加密存储。
问3:为什么我收到的调用额度报错 429?
答:这是超出 CoinGecko API 限流,尝试本地缓存或使用更短的请求间隔。
问4:交易一直 pending 怎么办?
答:提高 gasPrice 或替换交易(Replace-By-Fee)即可加速。
问5:我只想在测试网玩,需要改哪些参数?
答:把 chainId=1 改为 chainId=5(Goerli),节点换成 https://goerli.infura.io/v3/INFURA_KEY,再到下方按钮免费领取测试币。👉 获取测试币入口
进阶扩展思路
- 多链支持:引入 BNB Chain、Arbitrum 只需换 RPC 即可。
- 代币余额查询:通过 ERC-20
balanceOf合约方法读取。 - 扫码签名:结合 Flask + QR 码,生成移动端离线签名包。
- 行情分级推送:把 CoinGecko 的 1 分钟 K 线加上 Telegram Bot 告警。
结语
完成本教程,你已经拥有:
- 一套离线可运行的 python 加密钱包;
- 随手可调的 Web3.py 模板;
- 稳定免费的 coingecko api 教程 供行情调用。
下一步,你可以把 CLI 包装成 Electron GUI,或丢到树莓派做冷钱包。记住:私钥在手,暗号我有。祝你玩得开心,代码里见!
本文仅供技术研究,投资需谨慎。