首页 > 热点资讯 > 正文

科普|从零开始学习比特币开发:生成地址

2024-04-18 01:46 来源:网络

欲接收他人发送的比特币或购买比特币,您需要提供一个地址,以便对方将款项汇入指定账户。本文将为您揭示如何生成比特币地址,并深入探讨其实现原理与相关代码逻辑。

科普|从零开始学习比特币开发:生成地址

一、使用getnewaddress RPC生成新地址

比特币核心提供了丰富的RPC(远程过程调用)接口供客户端调用,其中getnewaddress便是用于生成新地址的关键命令。通过调用此RPC,用户即可得到一个全新的比特币地址,用于接收来自他人的转账。

getnewaddress RPC接受两个参数:一是地址标签,用于标识该地址用途;二是地址类型,目前支持legacy、p2sh-segwit、bech32三种类型。若未指定标签,则默认为空;地址类型默认为p2sh-segwit,由启动参数-addresstype决定。

若需查看该RPC的帮助文档,只需执行如下命令:

./src/bitcoin-cli -regtest help getnewaddress

即可展示详细的帮助信息。

此RPC对应的方法实现位于src/wallet/rpcwallet.cpp文件中,方法名即为RPC名。接下来,我们将逐步剖析其内部实现流程。

二、生成地址流程

根据请求参数获取对应的钱包实例。通过调用GetWalletForJSONRPCRequest方法,从请求对象中提取钱包名称(如有指定),并从钱包集合vpwallets中检索相应钱包。若未指定或找不到指定钱包,则返回默认钱包(系统启动时创建)。


确保所选钱包处于可用状态。若钱包不可用,则返回NullUniValue对象。


若请求包含help参数或参数数量超过2个,显示钱包的帮助信息。


检查钱包是否禁用私钥(即只读/watch-only模式)。若禁用私钥,则抛出异常。


处理地址标签(若有提供)。若标签为"*",则抛出异常。


解析并验证地址类型(若有提供)。默认类型为p2sh-segwit,须确保为上述支持的三种类型之一。


若钱包未锁定,调用TopUpKeyPool方法填充密钥池。由于密钥池已满,此步实际无操作,直接返回真。


调用GetKeyFromPool方法从密钥池中生成公钥。若无法生成,抛出异常。


调用LearnRelatedScripts方法处理公钥对应的脚本。具体包括:根据公钥和地址类型生成不同类型的脚本模板,将其保存至数据库,并处理WitnessV0KeyHash对象等。


调用GetDestinationForKey方法,根据公钥和地址类型确定CTxDestination对象(交易输出脚本模板)。可能为CNoDestination、CKeyID、CScriptID、WitnessV0ScriptHash、WitnessV0KeyHash、WitnessUnknown等类型。


调用SetAddressBook方法保存公钥地址及标签至钱包数据库。


调用EncodeDestination方法,对目的地址进行编码并返回结果。



至此,一个完整的比特币地址生成流程已详细呈现。通过深入理解上述步骤及其背后的代码逻辑,用户不仅能够顺利生成自己的比特币地址,更能对整个比特币系统的运作机制有更深层次的认识。

作者:区小白

来源:巴比特

[说明]以上内容采编自互联网,如内容侵犯您的版权,请联系邮箱:[email protected],我们会在24小时内删除相关内容。

文章内容来源于网络,不代表本站立场,若侵犯到您的权益,可联系多特删除。(联系邮箱:[email protected]