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 地址。具体步骤如下:
- 将公钥通过 SHA256 哈希函数处理一次。
- 将哈希结果输入 RIPEMD-160 哈希函数。
- 为 RIPEMD-160 结果添加指定区块链的前缀字符(主网为 'D',测试网为 'n')。
- 用 SHA256 对当前字符串(前缀 + RIPEMD-160 结果)进行双重哈希,并将结果保存为 32 字节的校验和。
- 将校验和的前 4 字节附加到当前字符串。
- 使用 base58 对当前字符串进行编码,得到最终的 Dogecoin p2pkh 地址。
现在你有了一个有效的 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 应用。