主页 > 华为手机安装imtoken > 比特币钱包创建和地址获取
比特币钱包创建和地址获取
前言
在比特币钱包的开发中,需要搭建比特币节点来同步交易数据等怎么创建比特币账户,完成转账余额查询等相关操作。本文介绍比特币节点搭建完成后如何在节点服务器上创建账户,以及如何获取地址。
比特币账户通过 bip 协议播种,然后扩展为多个子地址。这些子地址都可以衍生自同一个种子,知道其中一个子账户的私钥不能推导出兄弟节点和父节点的私钥,所以同一种子扩展生成的子账户是统一的入一个账户,其新的子地址可用于每笔交易。这更安全,也更难追踪。这个大账户通常被称为钱包。一旦我们有了一个大钱包,我们就可以创建一系列钱包地址。
官网bitcoin-cli中有多达53个钱包API。本文只讲解bitcoin-cli常用的几个命令
1. 创建钱包/CreateWallet
CreateWallet 命令参数创建并加载一个新的钱包。
语法:createwallet "wallet_name" ( disable_private_keys blank )
参数:
1. "wallet_name" (字符串,必须项) 钱包名称。如果是路径,将会在指定路径创建钱包。
2. "disable_private_keys" (布尔值, 可选项, 缺省值为false) 禁止私钥可能性(这种模式下只有watchonlys可能). 本项一般不用。
3. "blank" (布尔值, 可选项, 缺省值为false) 创建空白钱包。 空白钱包没有私钥也没有HD种子。可以后面用sethdseed来设置。
返回值:
{
"name" : <wallet_name>, (string) 如果创建成功就是钱包名字。路径的情况下显示路径。
"warning" : <warning>, (string) 如果钱包没有完好创建会在这里给出警告信息。
}
例子:
> bitcoin-cli createwallet "testwallet"
> curl --user myusername --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "createwallet", "params": ["testwallet"] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/
2. 加密钱包/加密钱包
encryptwallet 调用使用指定的密文加密钱包。这个操作只需要调用一次,一旦开启加密,每次需要使用钱包中的密钥时都需要输入密文。如果您在命令行上使用此调用,请注意您使用的 shell 可能会保存输入的命令(包括输入的密文)。此外,一旦钱包启用了加密,目前没有其他 RPC 接口可以禁用其加密。如果你需要一个未加密的钱包,你只能创建一个新的钱包,然后使用 dumpwallet 调用的输出来恢复加密钱包中的密钥。
语法:encryptwallet "Passphrase"
参数:
"Passphrase":用于加密钱包的密文,最短1个字符
返回值:
encryptwallet 调用将返回一个提醒信息,提示钱包已加密、节点重启。
示例代码:
下面命令使用密码test加密钱包:
~$ bitcoin-cli -testnet encryptwallet "test"
输出如下:
wallet encrypted; Bitcoin server stopping, restart to run with encrypted
wallet. The keypool has been flushed, you need to make a new backup.
3. 获取钱包信息/GetWalletInfo
getwalletinfo 可以获取账户相关信息。也可以验证之前的加密。
语法: getwalletinfo
参数:
无
返回值:
getwalletinfo调用返回钱包总体信息,结构如下:
walletversion:钱包版本
balance:钱包余额
txcount:钱包内交易数量
keypoololdest:密钥池内最早密钥创建时间
keypoolsize:密钥池大小
unlocked_until:钱包解锁至何时,仅当钱包加密时有效
示例代码:
下面的命令返回节点钱包的总体信息:
~$ bitcoin-cli getwalletinfo
输出结果如下:
{
"walletname": "",
"walletversion": 169900,
"balance": 0.00001,
"unconfirmed_balance": 0.00000000,
"immature_balance": 0.00000000,
"txcount": 7,
"keypoololdest": 1563790626,
"keypoolsize": 2000,
"keypoolsize_hd_internal": 2000,
"unlocked_until": 0,
"paytxfee": 0.00000000,
"hdseedid": "f2ce9cb076bd4d1021a3ba4ed3193573bd....",
"private_keys_enabled": true
}
4. 生成新地址/getnewaddress
返回用于接收付款的新比特币地址。
语法:getnewaddress ( "label" "address_type" )
参数:
1. "label" :字符串,可选。要链接到的地址的标签名称,若未指定,默认为空。label可以不存在
2. "address_type" :字符串,可选。若使用本选项,可用选项为"legacy", "p2sh-segwit", 和"bech32"。默认值为bitcoind运行时-address_type指定的值。
运行结果:
"address" #字符串,新的bitcoin地址
5. 获取地址信息/GetAddressInfo
此方法在 0.17.0 之后启用。
因为地址唯一但账户名可以重复,一个账户名对应多个地址
语法:getaddressinfo "address"
参数:
"address": 字符串,必须项。比特币地址。
返回值:
地址关联信息。
{
"address" : "address", (string)验证过的比特币地址
"scriptPubKey" : "hex", (string) 地址生成的十六进制编码scriptPubKey
"ismine" : true|false, (boolean) 地址是否是你的
"iswatchonly" : true|false, (boolean) 地址是watchonly的
"solvable" : true|false, (boolean) 我们是否知道如何花费发送到该地址的硬币,忽略可能缺少私钥的情况。
"desc" : "desc", (string, optional) 发送至该地址的比特币消费的描述(仅在可解决时)
"isscript" : true|false, (boolean) 如果key是脚本
"ischange" : true|false, (boolean) 如果该地址用于更改输出
"iswitness" : true|false, (boolean) 如果该地址是见证人地址
"witness_version" : version (numeric, optional) 见证程序的版本号
"witness_program" : "hex" (string, optional) 见证程序的十六进制值
"script" : "type" (string, optional) 输出脚本类型。仅在“ isscript”为真且知道重新命名的情况下。可能的类型: nonstandard, pubkey, pubkeyhash, scripthash, multisig, nulldata, witness_v0_keyhash, witness_v0_scripthash, witness_unknown
"hex" : "hex", (string, optional) p2sh地址的兑现脚本
"pubkeys" (string, optional) 与已知兑现脚本关联的公钥数组(仅当“ script”为“ multisig”)
[
"pubkey"
,...
]
"sigsrequired" : xxxxx (numeric, optional) 花费多重签名输出所需的签名数(仅当“脚本”为“多重签名”时)
"pubkey" : "publickeyhex", (string, optional) 原始公共密钥的十六进制值,用于单密钥地址(可能嵌入在P2SH或P2WSH中)
"embedded" : {...}, (object, optional) 如果相关且已知,则为有关嵌入在P2SH或P2WSH中的地址的信息。它包括嵌入式地址的所有getaddressinfo输出字段,但不包括元数据(“ timestamp”,“ hdkeypath”,“ hdseedid”)
"iscompressed" : true|false, (boolean, optional) 如果pubkey被压缩
"label" : "label" (string) 与地址关联的标签,“”是默认标签
"timestamp" : timestamp, (number, optional) 密钥的创建时间(自纪元开始,以秒为单位)(格林尼治标准时间1970年1月1日)
"hdkeypath" : "keypath" (string, optional) HD密钥路径(如果密钥是HD且可用)
"hdseedid" : "" (string, optional) HD种子的Hash160值
"hdmasterfingerprint" : "" (string, optional) 万能钥匙的指纹。
"labels" (object) 与地址关联的标签数组。
[
{ (json object of label data
"name": "labelname" (string) 标签
"purpose": "string" (string) 地址的用途(“发送”用于发送地址,“接收”用于接收地址)
},...
}
6. 获取余额/getbalance
getbalance 调用返回钱包中所有账户(或指定账户)的比特币数量。此调用需要节点启用钱包功能。
语法:getbalance "Account","Confirmations","WatchOnlyIncl"
参数:
"Account":要查看余额的钱包账户,可选,默认值为*,表示全部账户
"Confirmations": 可计入余额的UTXO所需要的最小确认数,可选,默认值:6
"WatchOnlyIncl": 是否包含那些仅用于跟踪的地址,可选,默认值:true
返回值:
getbalance调用返回以bitcoin为单位的余额。
示例代码:
下面的命令统计账户test1中包含至少一个确认的UTXO的总金额:
~$ bitcoin-cli -testnet getbalance "test1" 1 true
输出结果如下:
0.00010000
7. 用密码解锁钱包/钱包密码
在设置的超时时间内将钱包解密密钥存储在内存中。在执行与私钥相关的交易之前,这是必需的。
语法:walletpassphrase "passphrase" timeout
参数:
"passphrase":字符串,必须项。钱包密码。
"timeout":数值,必须项。保存解密密钥的时间(以秒为单位)。限制在最多1073741824(2^30)秒。任何大于1073741824秒的值将被设置为1073741824秒。
注意:
在钱包已经解锁时发出walletpassphrase命令将设置一个新的解锁时间并覆盖旧解锁时间。
比特币节点常用命令
#运行节点(conf参数有默认值,可以省略)
bitcoind -conf=/data/bitcoin/bitcoin.conf -daemon
#停止节点
bitcoin-cli stop
#其它常用命令
bitcoin-cli getnetworkinfo #查看网络状态
bitcoin-cli getpeerinfo #查看网络节点
bitcoin-cli getblockchaininfo #查看区块链信息:如同步进度
bitcoin-cli help #查看所有命令
笔记:
bitcoin.conf的默认路径如下:
linux: bitcoin.conf的默认路径为$HOME/.bitcoin/bitcoin.conf
windows: bitcoin.conf的默认路径为%APPDATA%\bitcoin\bitcoin.conf
mac: bitcoin.conf的默认路径为$HOME/Library/Application Support/Bitcoin/bitcoin.conf
补充 1
如果比特币节点有多个钱包怎么创建比特币账户,在获取钱包信息时,会出现“未分配钱包文件”的错误信息。如下:
ubuntu@xxx:~/bitcoin-0.18.0/bin$ ./bitcoin-cli getwalletinfo
error code: -19
error message:
Wallet file not specified (must request wallet RPC through /wallet/<filename> uri-path).
Try adding "-rpcwallet=" option to bitcoin-cli command line.
原因是节点上有多个钱包。请按照以下步骤卸载钱包。
ubuntu@xxx:~/bitcoin-0.18.0/bin$ ./bitcoin-cli listwallets
[
"",
"mywallet"
]
ubuntu@xxx:~/bitcoin-0.18.0/bin$ ./bitcoin-cli listwalletdir
{
"wallets": [
{
"name": "mywallet"
},
{
"name": ""
}
]
}
ubuntu@xxx:~/bitcoin-0.18.0/bin$ ./bitcoin-cli unloadwallet ""
ubuntu@xxx:~/bitcoin-0.18.0/bin$ ./bitcoin-cli listwallets
[
"mywallet"
]
ubuntu@xxx:~/bitcoin-0.18.0/bin$ ./bitcoin-cli getwalletinfo
{
"walletname": "mywallet",
"walletversion": 169900,
"balance": 0.00000000,
"unconfirmed_balance": 0.00000000,
"immature_balance": 0.00000000,
"txcount": 0,
"keypoololdest": 1575551886,
"keypoolsize": 2000,
"keypoolsize_hd_internal": 2000,
"paytxfee": 0.00000000,
"hdseedid": "f70531cccac5be23c0870d9a84cc02bcf3xxx",
"private_keys_enabled": true
}
补充2 更换默认比特币钱包
其实也比较简单,三步。
首先停止比特币节点
覆盖默认钱包目录的数据文件
钱包所在的目录是~/.bitcoin/wallets。确保进行备份。
ubuntu@xxx:~/.bitcoin$ ls wallets/
database/ db.log mywallet/ wallet.dat
移动文件并进行备份。
cd ~/.bitcoin/wallets
cp mywallet/* .
只需重启比特币节点
bitcoind -daemon
参考:
6.
7.比特币bitcoin-cli操作示例
8.【比特币钱包开发5】新钱包:生成子账户地址和路径