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

如何不使用HD Keys从ec_private通过libbitcoin-system 3.8.0获取Bech32地址

从ec_private直接生成Bech32(原生SegWit)比特币地址

要实现从ec_private直接生成原生SegWit的Bech32地址,核心是构建P2WPKH见证脚本并通过Bech32编码,以下是完整的修改代码及关键步骤说明:

完整代码

#include <bitcoin/system.hpp>

using namespace bc;
using namespace std;
using namespace wallet;

int main()
{
    data_chunk seed(16);
    pseudo_random_fill(seed);

    ec_secret secretKey = bitcoin_hash(seed);
    ec_private wif(secretKey, 0x8000, true);

    ec_compressed publicKey = wif.to_public().point();

    // 1. 计算公钥的SHA256-RIPEMD160哈希(P2WPKH所需的公钥哈希)
    short_hash pubKeyHash = bitcoin_short_hash(publicKey);

    // 2. 构建P2WPKH见证脚本:版本字节(0x00) + 哈希长度字节(0x14) + 公钥哈希
    data_chunk witnessScript;
    witnessScript.push_back(0x00);
    witnessScript.push_back(0x14);
    extend_data(witnessScript, pubKeyHash);

    // 3. Bech32编码生成主网地址(测试网前缀改为"tb")
    string bech32Address = encode_base32(witnessScript, "bc");

    cout << "Bech32原生SegWit地址: " << bech32Address << endl;

    return 0;
}

关键步骤说明

  • 公钥哈希计算:使用bitcoin_short_hash直接完成SHA256+RIPEMD160的组合哈希,得到P2WPKH需要的20字节公钥哈希。
  • 见证脚本构建:原生SegWit的P2WPKH脚本格式固定为0x00 0x14 <20-byte-pubkey-hash>,其中0x00是见证版本,0x14表示后续哈希的长度(20字节)。
  • Bech32编码:调用encode_base32将脚本数据编码为Bech32地址,主网使用前缀"bc",测试网替换为"tb"即可。

内容的提问来源于stack exchange,提问作者Lakshitha Kanchana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:28:15