比特币钱包地址 比特币钱包创建及地址获取

如何获得比特币钱包地址_比特币交易网钱包地址_比特币钱包地址

前言

在比特币钱包的开发中,有必要构建一个比特币节点来同步交易数据等,并完成相关的操作,例如转移余额查询。本文介绍了在设置比特币节点后如何在节点服务器上创建帐户并获取地址。

比特币帐户通过bip协议植入种子,然后扩展为多个子地址。这些子地址可以从同一种子派生,并且知道其中一个子帐户的私钥无法派生兄弟和父密钥的私钥,因此由同一种子扩展名生成的子帐户是统一的到一个帐户中,其新的子地址可用于每笔交易,交易更安全,更难追踪。这个大帐户通常称为“钱包”。一旦有了一个大钱包,我们就可以创建一系列钱包地址。

官方网站上bitcoin-cli上有多达53种钱包API。本文仅介绍了bitcoin-cli

中常用的一些命令

1.创建钱包/创建钱包

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调用使用指定的密文对钱包进行加密。此操作只需调用一次。启用加密后,每次需要钱包中的密钥时都需要输入密文。如果在命令行上使用此调用,则需要注意所使用的外壳程序可能会保存输入命令(包括输入密文)。此外,一旦钱包启用了加密,当前就没有其他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.获取AddressInfo / 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) 密钥的创建时间(自纪元开始,以秒为单位)(格林尼治标准时间197011日)
  "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 "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]新钱包:生成子帐户地址和路径