如何不使用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
相关产品推荐
相关产品推荐

