用 Python + Web3 + CoinGecko API 十分钟打造出个人加密钱包

·

数字货币正以惊人的速度走进大众视野,而一个安全、易用的 加密钱包 已经成为刚需。本文将以 Python 为主语言,结合 Web3.pyCoinGecko API 带你完成一款极简而功能完备的链上钱包 Demo:生成账户、发送交易、实时展示币种行情,全程不到 150 行代码,零基础也能跑通。


为什么要自己写一个加密钱包?


前置概念梳理

区块链网络

简单来说,区块链网络 就是分布式账本+共识算法的组合。
在以太坊示例中,全网节点共同维护同一份 去中心化数据库,任何人都能验证交易,但无法单方面篡改历史记录。

加密钱包

它并不是真正“存放币”,而是:

  1. 生成并保管 私钥(用于签名);
  2. 根据私钥计算 公开地址(用于收款);
  3. 把已签名的交易广播到链上。

技术雷达: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 requests

2. 连接以太坊网络

打开你的代码编辑器,新建 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())

只需一行代码,你就得到了:

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.002

FAQ:读者最常见 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,再到下方按钮免费领取测试币。👉 获取测试币入口


进阶扩展思路

  1. 多链支持:引入 BNB Chain、Arbitrum 只需换 RPC 即可。
  2. 代币余额查询:通过 ERC-20 balanceOf 合约方法读取。
  3. 扫码签名:结合 Flask + QR 码,生成移动端离线签名包。
  4. 行情分级推送:把 CoinGecko 的 1 分钟 K 线加上 Telegram Bot 告警。

结语

完成本教程,你已经拥有:

下一步,你可以把 CLI 包装成 Electron GUI,或丢到树莓派做冷钱包。记住:私钥在手,暗号我有。祝你玩得开心,代码里见!

本文仅供技术研究,投资需谨慎。