如何用PyOpenCL在AMD Radeon GPU上运行并优化BTC助记词校验脚本
现有脚本的核心瓶颈
你提供的原始脚本性能低下主要有3个原因:
- 纯Python单线程运行,BIP39校验运算效率极低
- 每次命中有效助记词都重复打开写入文件,IO开销极大
- 代码本身存在缩进错误,实际运行会直接报错
基于PyOpenCL的AMD GPU实现方案
AMD Radeon显卡对OpenCL兼容性极好,只需安装官方显卡驱动即可自带OpenCL运行环境,无需额外配置。实现核心思路是把无依赖的助记词校验逻辑放到GPU并行执行,具体步骤如下:
前置准备
- 安装依赖:执行
pip install pyopencl bip-utils - 提前预处理数据:把
combo.txt的所有模板读入内存,将BIP39词表的每个词映射为0~2047的整数索引,GPU只处理数字运算,字符串拼接和转换全部提前在CPU完成
核心实现逻辑
OpenCL内核代码(完成BIP39校验逻辑)
内核代码需要实现:接收助记词对应的索引数组,转换为二进制熵,计算SHA256校验和并比对,输出有效助记词的位置索引。
// 内核代码示例,省略内置SHA256实现,可以直接复用公开的OpenCL SHA256代码 __kernel void bip39_check(__global const uint* mnemonic_indices, __global uint* valid_mask, const int mnemonic_len) { int idx = get_global_id(0); // 1. 将当前索引对应的12/24个助记词索引转换为二进制熵数据 // 2. 计算熵的SHA256哈希,取前N位作为校验和 // 3. 比对助记词最后几位和校验和是否匹配 // 4. 匹配则把valid_mask[idx]设为1,否则设为0 }
Python调用代码框架
import pyopencl as cl import numpy as np from bip_utils import Bip39WordsListGetter # 初始化OpenCL上下文,选择AMD GPU platforms = cl.get_platforms() devices = [d for p in platforms for d in p.get_devices() if 'AMD' in d.name] ctx = cl.Context(devices) queue = cl.CommandQueue(ctx) # 加载词表和模板 words = Bip39WordsListGetter.Instance().GetEnglish().GetWords() word_to_idx = {w:i for i,w in enumerate(words)} with open("combo.txt", "r") as f: templates = [l.strip() for l in f if l.strip()] # 批量生成待校验的助记词索引数组,一次生成100万条可根据显存调整 batch_size = 1000000 valid_res = [] for tpl in templates: # 提前把模板转换为固定索引,替换x的位置为每个词的索引 fixed_part = [word_to_idx[w] for w in tpl.replace("{x}", "").split()] x_pos = tpl.split().index("{x}") # 分批处理2048个词的组合 for batch_start in range(0, len(words), batch_size): # 构建待校验的索引数组,传入GPU mnemonic_arr = np.zeros((min(batch_size, len(words)-batch_start), len(fixed_part)+1), dtype=np.uint32) for i in range(mnemonic_arr.shape[0]): mnemonic_arr[i] = fixed_part[:x_pos] + [batch_start + i] + fixed_part[x_pos:] # 调用OpenCL内核跑校验,拿到valid_mask # 把valid_mask为1的索引对应的助记词转成字符串,加入结果列表 valid_indices = np.where(valid_mask == 1)[0] for idx in valid_indices: mnemonic = " ".join([words[i] for i in mnemonic_arr[idx]]) valid_res.append(mnemonic) # 最后一次性写入文件 with open("print.txt", "w") as f: f.write("\n".join(valid_res))
其他优化思路
- CPU侧基础优化:先修改原始脚本的缩进错误,把文件写入逻辑移到循环外,所有结果存在内存列表最后一次性写入,避免重复IO开销。将
cryptotools的校验替换为C实现的bip-utils库,速度至少提升10倍。用multiprocessing多进程拆分模板列表,充分利用CPU多核性能,单CPU就能提升数倍效率。 - 运算逻辑剪枝:如果你的模板只缺1个词,可提前计算模板固定部分对应的熵,只需遍历计算缺词部分的校验和,不需要每次重新计算整个助记词的哈希,运算量直接降低80%以上。
- 批处理优化:不管用CPU还是GPU,都不要单条生成单条校验,批量生成十万到百万条之后统一校验,大幅降低函数调用和数据传输开销。
内容的提问来源于stack exchange,提问作者X_strong
相关产品推荐
相关产品推荐

