You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PyOpenCL在AMD Radeon GPU上运行并优化BTC助记词校验脚本

现有脚本的核心瓶颈

你提供的原始脚本性能低下主要有3个原因:

  1. 纯Python单线程运行,BIP39校验运算效率极低
  2. 每次命中有效助记词都重复打开写入文件,IO开销极大
  3. 代码本身存在缩进错误,实际运行会直接报错

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:30:00