Libdogecoin:构建 Dogecoin 应用的 C 语言库指南

·

Libdogecoin 是一个用 C 语言编写的轻量级库,为开发者提供了一系列构建 Dogecoin 应用的核心功能。它简化了地址生成、密钥管理和交易验证等复杂过程,是开发钱包、交易工具和区块链服务的理想选择。

本文将深入探讨 Libdogecoin 的核心功能,特别是其地址生成 API,帮助你快速上手并集成到自己的项目中。

Dogecoin 地址基础

Dogecoin 地址是一个非对称密钥对的公钥部分,用于在网络上标识持有 Dogecoin 的位置。持有对应私钥的用户能够对交易进行签名,从而转移该地址下的 Dogecoin。

根据使用场景的不同,Dogecoin 地址有多种生成方式,每种方式都有其独特的优势。

简单地址

简单地址是最常见的 Dogecoin 地址形式,由一个私钥和一个公钥(地址)组成。交易所通常使用这种地址来为用户托管钱包,而简单的桌面或移动钱包也采用这种基础地址管理方式。

分层确定性(HD)地址

与简单地址不同,HD 地址(分层确定性地址)从一个种子短语生成,通常是 12 个随机独特的单词,而不是一个 256 位的私钥。通过这个种子短语(加上一个简单的递增数字),可以生成无限多的 Dogecoin 公钥地址,而持有种子短语的人都能进行签名。

种子短语

种子短语(也称为助记词短语)是创建和备份 HD 地址的常用方法。这些短语由 12 或 24 个随机单词组成,分别从 128 位或 256 位的熵源生成。种子短语可用于生成 HD 地址。

使用种子短语时,务必确保其安全性:

在选择钱包类型时,HD 钱包(使用种子短语生成地址)通常比简单钱包(所有地址使用同一个私钥)更安全。热钱包(连接互联网)使用方便但更容易受到攻击;冷钱包(保持离线)更安全,但对于频繁交易可能不太方便。请根据你的安全需求谨慎选择适合项目的钱包类型。

简单地址生成过程

创建简单的支付到公钥哈希(p2pkh)地址的第一步是生成私钥,这是一个随机生成的 256 位(32 字节)无符号整数。这必须在 secp256k1 上下文中完成,以确保密钥的有效性可以被其他验证者数学证明。

随机私钥随后被编码为钱包导入格式(WIF),使其可读且易于复制。切勿向他人泄露此私钥!该私钥授予你使用与此私钥关联的任何公钥花费 Dogecoin 的能力,分享它将危及钱包中的所有资金。

下一步是利用 secp256k1 椭圆曲线的数学特性从私钥派生公钥(由 Libdogecoin 内部完成)。这应在会话开始时创建的同一上下文中进行,以避免重新生成所有加密信息所需的额外计算。

需要注意的是,这个公钥并不等同于 Dogecoin 地址。地址生成的最后一步是将公钥(看似随机的字节形式)转换为可读的有效 Dogecoin 地址。具体步骤如下:

现在你有了一个有效的 Dogecoin 地址!其有效性可通过 verifyPrivPubKeypair() 函数检查,该函数评估地址在 base58 解码后校验和是否有效。请注意,无法从该 p2pkh 地址派生出公钥,因为它经过了不可逆的哈希处理。但该地址现在可以用于接收资金,并最终使用最初生成的私钥进行花费。

这些步骤可能非常复杂,但 Libdogecoin 在调用 generatePrivPubKeyPair() 时会为你完成所有步骤,从私钥生成到公钥派生,再到 p2pkh 地址转换。HD 密钥对的生成过程类似,但在生成原始密钥对时涉及更多复杂性。有关如何调用上述函数的更多信息,请参阅下面的基本 API 说明。

👉 查看实时地址生成工具

基本地址 API

这些函数实现了 Libdogecoin 地址生成和验证的核心功能。你可以通过 C 程序访问它们,只需在源代码中包含 libdogecoin.h 头文件,并在编译时包含 libdogecoin.a 库。

使用基本或高级地址 API 中的函数时,请在链接过程中包含 -lunistring 标志。这是因为高级地址 API 使用 GNU libunistring 库进行 Unicode 字符串操作。要在链接时包含 -lunistring 标志,只需在构建项目时将其添加到链接器命令中:

gcc -o example example.c -ldogecoin -lunistring

确保系统已安装 libunistring 库。

generatePrivPubKeypair

int generatePrivPubKeypair(char* wif_privkey, char* p2pkh_pubkey, bool is_testnet)

此函数将填充提供的字符串变量(privkey, pubkey)为新生成的各自私钥和公钥,特别是通过网络标志(is_testnet)指定的主网或测试网。函数成功返回 1,失败返回 0。

C 用法示例:

#include "libdogecoin.h"
#include <stdio.h>

int main() {
    int privkeyLen = PRIVKEYWIFLEN;
    int pubkeyLen = P2PKHLEN;
    char privKey[privkeyLen];
    char pubKey[pubkeyLen];
    dogecoin_ecc_start();
    generatePrivPubKeypair(privKey, pubKey, false); // 生成主网密钥对
    dogecoin_ecc_stop();
    printf("我的主网私钥是:%s\n", privKey);
    printf("我的主网公钥是:%s\n", pubKey);
}

generateHDMasterPubKeypair

int generateHDMasterPubKeypair(char* hd_privkey_master, char* p2pkh_pubkey_master, bool is_testnet)

此函数将填充提供的字符串变量(privkey, pubkey)为分层确定性钱包新生成的各自私钥和公钥,特别是通过网络标志(is_testnet)指定的主网或测试网。函数成功返回 1,失败返回 0。

generateDerivedHDPubKey

int generateDerivedHDPubkey(const char* hd_privkey_master, char* p2pkh_pubkey)

此函数接受给定的 HD 主私钥(hd_privkey_master)并将其加载到提供的派生公钥(p2pkh_pubkey)指针中。此私钥输入应来自 generateHDMasterPubKeypair() 的结果。函数成功返回 1,失败返回 0。

verifyPrivPubKeypair

int verifyPrivPubKeypair(char* wif_privkey, char* p2pkh_pubkey, bool is_testnet)

此函数需要先前生成的密钥对(wif_privkey, p2pkh_pubkey)以及它们生成的网络(is_testnet)。然后验证给定的公钥是否确实从给定的私钥派生,如果密钥关联则返回 1,否则返回 0。这在签名之前或在某种钱包恢复工具中匹配密钥时非常有用。

verifyHDMasterPubKeypair

int verifyHDMasterPubKeypair(char* hd_privkey_master, char* p2pkh_pubkey_master, bool is_testnet)

此函数验证给定的主私钥是否与给定的主公钥匹配。这在签名之前或在某种钱包恢复工具中匹配密钥时非常有用。

verifyP2pkhAddress

int verifyP2pkhAddress(char* p2pkh_pubkey, uint8_t len)

此函数接受现有的公钥(p2pkh_pubkey)及其字符长度(len),执行一些基本验证以确定它是否看起来像有效的 Dogecoin 地址。如果地址有效则返回 1,否则返回 0。这对于想要检查收款地址是否合法的钱包非常有用。

getHDNodePrivateKeyWIFByPath

char* getHDNodePrivateKeyWIFByPath(const char* masterkey, const char* derived_path, char* outaddress, bool outprivkey)

此函数通过提供扩展主密钥、derived_path、outaddress 和 outprivkey 来派生分层确定性子密钥。如果成功,它将返回 dogecoin_hdnode 的 WIF 格式序列化私钥,如果未提供正确的参数则退出。

getHDNodeAndExtKeyByPath

dogecoin_hdnode* getHDNodeAndExtKeyByPath(const char* masterkey, const char* derived_path, char* outaddress, bool outprivkey)

此函数通过提供扩展主密钥、derived_path、outaddress 和 outprivkey 来派生分层确定性子密钥。主密钥可以是私钥或公钥,但如果是公钥,则必须将 outprivkey 标志设置为 false,且 derived_path 必须是公钥派生路径。如果成功,它将返回 dogecoin_hdnode,如果未提供正确的参数则退出。

getDerivedHDAddress

int getDerivedHDAddress(const char* masterkey, uint32_t account, bool ischange, uint32_t addressindex, char* outaddress, bool outprivkey)

此函数通过提供扩展主密钥、账户、ischange 和 addressindex 来派生分层确定性地址。如果函数成功则返回 1,否则返回 0。

getDerivedHDAddressByPath

int getDerivedHDAddressByPath(const char* masterkey, const char* derived_path, char* outaddress, bool outprivkey)

此函数通过字符串格式的自定义路径(derived_path)派生扩展 HD 地址。如果地址有效则返回 1,否则返回 0。

高级地址 API

这些函数实现了 Libdogecoin 地址生成和验证的高级功能。你可以通过 C 程序访问它们,只需在源代码中包含 libdogecoin.h 头文件,并在编译时包含 libdogecoin.a 库。

generateRandomEnglishMnemonic

int generateRandomEnglishMnemonic(const ENTROPY_SIZE size, MNEMONIC mnemonic);

此函数生成随机的英语助记词短语(种子短语)。函数成功返回 0,失败返回 -1。

generateRandomEnglishMnemonicTPM

dogecoin_bool generateRandomEnglishMnemonicTPM(MNEMONIC mnemonic, const int file_num, const dogecoin_bool overwrite);

此函数使用 TPM(可信平台模块)生成随机英语助记词。它将生成的助记词存储在提供的 mnemonic 缓冲区中。file_num 参数指定加密存储文件编号,overwrite 参数指示是否覆盖加密存储中的现有助记词。函数成功返回 TRUE,失败返回 FALSE

getDerivedHDAddressFromMnemonic

int getDerivedHDAddressFromMnemonic(const uint32_t account, const uint32_t index, const CHANGE_LEVEL change_level, const MNEMONIC mnemonic, const PASS pass, char* p2pkh_pubkey, const bool is_testnet);

此函数从助记词和 slip44 密钥路径生成新的 Dogecoin 地址。函数成功返回 0,失败返回 -1。

getDerivedHDAddressFromEncryptedSeed

int getDerivedHDAddressFromEncryptedSeed(const uint32_t account, const uint32_t index, const CHANGE_LEVEL change_level, char* p2pkh_pubkey, const dogecoin_bool is_testnet, const int file_num);

此函数从加密种子和 slip44 密钥路径生成新的 Dogecoin 地址。函数成功返回 0,失败返回 -1。

getDerivedHDAddressFromEncryptedMnemonic

int getDerivedHDAddressFromEncryptedMnemonic(const uint32_t account, const uint32_t index, const CHANGE_LEVEL change_level, const PASS pass, char* p2pkh_pubkey, const bool is_testnet, const int file_num);

此函数从加密助记词和 slip44 密钥路径生成新的 Dogecoin 地址。函数成功返回 0,失败返回 -1。

getDerivedHDAddressFromEncryptedHDNode

int getDerivedHDAddressFromEncryptedHDNode(const uint32_t account, const uint32_t index, const CHANGE_LEVEL change_level, char* p2pkh_pubkey, const bool is_testnet, const int file_num);

此函数从加密 HD 节点和 slip44 密钥路径生成新的 Dogecoin 地址。函数成功返回 0,失败返回 -1。

👉 获取进阶开发方法

常见问题

Libdogecoin 是什么?

Libdogecoin 是一个用 C 语言编写的轻量级库,专门为 Dogecoin 开发提供核心功能。它简化了地址生成、密钥管理和交易验证等复杂过程,使开发者能够轻松构建 Dogecoin 相关应用。

简单地址和 HD 地址有什么区别?

简单地址由一个私钥和一个公钥组成,适合简单场景。HD 地址(分层确定性地址)从一个种子短语生成,可以派生无限多个地址,更适合需要管理多个地址的应用,如钱包服务。

如何确保种子短语的安全?

种子短语应离线存储在不连接互联网的安全设备上,如硬件钱包或纸钱包。不要与他人分享,并使用强密码进行保护。避免在可能被恶意软件感染的设备上输入种子短语。

Libdogecoin 支持哪些编程语言?

Libdogecoin 主要是用 C 语言编写的,但可以通过绑定在其他语言中使用。它提供了 C 接口,可以直接集成到 C 和 C++ 项目中,其他语言可以通过包装器调用其功能。

如何验证生成的地址是否有效?

Libdogecoin 提供了 verifyP2pkhAddress() 函数来验证地址的有效性。该函数会检查地址的格式和校验和,确保它是有效的 Dogecoin 地址。

什么是 TPM 支持?

TPM(可信平台模块)是一种硬件安全模块,用于安全地生成和存储加密密钥。Libdogecoin 的 generateRandomEnglishMnemonicTPM() 函数利用 TPM 生成更安全的助记词,适合高安全需求的应用场景。

Libdogecoin 为 Dogecoin 开发者提供了强大而灵活的工具集,无论是构建简单的钱包应用还是复杂的安全交易系统,都能找到合适的解决方案。通过合理利用其 API 功能,你可以创建安全、高效的 Dogecoin 应用。