1. 程式人生 > >區塊鏈節點運維相關

區塊鏈節點運維相關

區塊鏈節點,錢包運維相關

2019/09/18 Chenxin

參考
https://bitcoinsv.io/services/wallets-and-exchanges/ 錢包推薦列表
https://aaron67.cc/2019/02/18/bitcoin-wallet-best-practice/ 錢包使用實踐

本文件對應版本
0.18.1

分類

錢包
節點
btc類,eth類等

btc類

部署

https://bitcoincore.org/en/download/ 安裝軟體下載地址.
https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes.md 版本說明
https://github.com/bitcoin/bitcoin/blob/master/doc/bitcoin-conf.md 啟動配置引數
https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list API參考(老舊,很多用不了.可以直接使用命令後 -h 或 help 檢視)
https://lhalcyon.com/blockchain-bitcoin-node/ 本章節參考

安裝
資源佔用說明
測試網會佔用500MB左右記憶體,35GB的左右的磁碟空間(2019/09/23)

linux(命令列)
linux直接到官網下載tar.gz包.解壓,放置到磁碟空間足夠大的地方(250GB以上),便於全節點.

Mac(GUI介面,命令列)
下載,安裝dmg檔案.可以將linux上的已經同步完的節點資料和錢包一併拷貝到mac上(之後錢包可以在兩邊一起用),mac上安裝節點.然後測試錢包.

目錄結構

[root@localhost bitcoin]# tree
.
├── bin
│   ├── bitcoin-cli
│   ├── bitcoind
│   ├── bitcoin-qt
│   ├── bitcoin-tx
│   ├── bitcoin-wallet
│   └── test_bitcoin
├── include
│   └── bitcoinconsensus.h
├── lib
│   ├── libbitcoinconsensus.so -> libbitcoinconsensus.so.0.0.0
│   ├── libbitcoinconsensus.so.0 -> libbitcoinconsensus.so.0.0.0
│   └── libbitcoinconsensus.so.0.0.0
├── README.md
└── share
    └── man
        └── man1
            ├── bitcoin-cli.1
            ├── bitcoind.1
            ├── bitcoin-qt.1
            ├── bitcoin-tx.1
            └── bitcoin-wallet.1

直接執行 /data/coin_test/bitcoin/bitcoin/bin/bitcoind 二進位制,會自動到/root目錄下建立 ".bitcoin"資料夾.
可以將 bin 目錄,加入系統變數PATH裡.

常用指令請參考本文日常"運維"部分

bitcoind指令引數(此為命令列方式,與配置檔案一一對應)
bitcoind -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf
一般選項

-conf=<file>                #指定配置檔案,預設~/.bitcoin/bitcoin.conf
-port=<port>                #監聽埠,預設8332或測試網路的testnet 18332
-bind=<addr>                #監聽地址,使用[host]:port標識ipv6地址
-datadir=<dir>              #資料儲存目錄,建議500G以上
-daemon                     #執行為守護程序(配置檔案裡可以daemon=1)
-dbcache=<n>                #設定資料快取大小,單位百萬位元組,預設450
-debuglogfile=<file>        #指定debug級別日誌儲存的位置。
-includeconf=<file>         #指定額外配置檔案路徑。只能用於配置檔案,不能用於命令列。
-loadblock=<file>           #啟動時從外部的名為blk000??.dat載入資料塊
-reindex                    #從磁碟上的blk*.dat檔案重建鏈狀態和塊索引
-reindex-chainstate         #從當前索引的塊重建鏈狀態
-version                    #檢視當前程式版本並退出
-txindex                    #預設情況下,比特幣核心只建立與使用者錢包相關的交易索引,如果需要維護全部交易的索引,需要設定該選項。
-maxmempool=<n>             #將事務記憶體保持在<n> mb以下(default: 300)
-maxorphantx=<n>            #在記憶體中最多儲存<n>不可連線事務(default: 100)
-mempoolexpiry=<n>          #在記憶體池中儲存事務的時間不要超過<n>小時(default:336)
-server                     #接受命令列和JSON-RPC命令
-rpcuser=<user>             #JSON-RPC連線時使用的使用者名稱
-rpcpassword=<pw>           #JSON-RPC連線時使用的密碼
-rpcport=<port>             #JSON-RPC連線監聽的埠,預設8332或testnet 18332
-rpcallowip=<ip>            #允許JSON-RPC連線從外部連線。可以是一個單獨IP(e.g. 1.2.3.4)、網路地址/掩碼(e.g.1.2.3.4/255.255.255.0)或網路地址/掩碼長度(e.g. 1.2.3.4/24)。該選項可指定多次。
-rpcbind=<addr>[:port]      #JSON-RPC連線的服務監聽地址和埠。不指定-rpcallowip引數時,該引數無效。埠引數可選,若指定,則覆蓋-rpcport選項。使用[host]:port標識ipv6地址。地址格式與-rpcallowip相同

錢包選項

-addresstype                #使用什麼型別的地址("legacy", "p2sh-segwit", or "bech32",default: "p2sh-segwit")
-disablewallet              #不載入錢包並禁用錢包RPC呼叫
-discardfee=<amt>           #費率(以BTC/kB表示)
-fallbackfee=<amt>          #收費比率(以BTC/kB為單位),當收費估計資料不足時,會使用該比率(預設值:0.0002)
-keypool=<n>                #將金鑰池大小設定為<n>
-mintxfee=<amt>             #如果費用(以BTC/kB為單位)小於此值,則認為建立事務的費用為零(預設值為0.00001)。
-paytxfee=<amt>             #向您傳送的交易中新增的費用(以BTC/kB為單位)(預設值:0.00)
-rescan                     #重新掃描在啟動時丟失的錢包事務的塊鏈
-salvagewallet              #嘗試在啟動時從損壞的錢包中恢復私鑰
-wallet=<path>              #指定錢包資料庫路徑,可以指定多次載入多個錢包。如果路徑不是絕對的,則相對於<walletdir>;如果路徑不存在,則建立路徑(作為包含wallet.dat檔案和日誌檔案的目錄)。為了向後相容,它還將接受<walletdir>中現有資料檔案的名稱。)
-walletdir=<dir>            #指定儲存錢包的目錄(預設:<datadir>/wallets,如該目錄不存在,則使用<datadir>)
-walletnotify=<cmd>         #當錢包事務發生更改時執行的命令

bitcoin.conf配置檔案(優先順序低於命令列方式)
bitcoin.conf 配置檔案
預設情況下,Bitcoin(或 bitcoind)會在比特幣資料資料夾下查詢一個名為“bitcoin.conf”的檔案,或通過 -conf 命令列引數指定.
配置檔案說明 https://github.com/bitcoin/bitcoin/blob/master/doc/bitcoin-conf.md
-conf 指定讀取配置檔案位置.要跟絕對路徑,如-conf=/data/coin_test/.../bitcoin.conf,如果是相對路徑,則會自動到使用者的根目錄下相對路徑裡去找.
配置檔案裡指定的專案優先順序低於命令列引數設定的值(命令列會覆蓋配置檔案中的設定).
配置檔案不會自動建立.
預設位置: $HOME/.bitcoin/ /home/username/.bitcoin/bitcoin.conf

資料目錄配置
datadir=/data/coin_test/bitcoin/bitcoin/bitcoin-data

以daemon後臺方式啟動
daemon=1.
或者bitcoind後指定 -daemon 也可以.

bitcoind 的 daemon 方式,檢視實時輸出(輸出與直接執行bitcoind控制檯輸出一致)
tailf debug.log

使用測試網路資料(真實環境需要250GB磁碟,測試環境當前為35GB)
testnet=1

使用指定的錢包(這裡是在test環境下,如果正式環境,就不要放到test裡.此步驟是第一次啟動後,通過rpc建立的錢包,然後重新修改配置檔案,載入這個新的錢包.建立錢包在此文後半部分)
[test]
wallet=/data/coin_test/bitcoin/bitcoin/bitcoin-data/testnet3/wallets/wallet-chenxin/

程序執行
bitcoind -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf

以下是官方配置檔案示例

最新,參考官方 https://github.com/bitcoin/bitcoin/blob/master/share/examples/bitcoin.conf

##
## bitcoin.conf configuration file. Lines beginning with # are comments.
##

# 指定資料目錄位置
datadir=/data/coin_test/bitcoin/bitcoin/bitcoin-data

# Network-related settings:

# Note that if you use testnet or regtest, particularly with the options
# addnode, connect, port, bind, rpcport, rpcbind or wallet, you will also
# want to read "[Sections]" further down.

# Run on the test network instead of the real bitcoin network.
#testnet=0 為1,就是測試環境

# Run a regression test network
#regtest=0

# Connect via a SOCKS5 proxy
#proxy=127.0.0.1:9050

# Bind to given address and always listen on it. Use [host]:port notation for IPv6
#bind=<addr>

# Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6
#whitebind=<addr>

##############################################################
##            Quick Primer on addnode vs connect            ##
##  Let's say for instance you use addnode=4.2.2.4          ##
##  addnode will connect you to and tell you about the      ##
##    nodes connected to 4.2.2.4.  In addition it will tell ##
##    the other nodes connected to it that you exist so     ##
##    they can connect to you.                              ##
##  connect will not do the above when you 'connect' to it. ##
##    It will *only* connect you to 4.2.2.4 and no one else.##
##                                                          ##
##  So if you're behind a firewall, or have other problems  ##
##  finding nodes, add some using 'addnode'.                ##
##                                                          ##
##  If you want to stay private, use 'connect' to only      ##
##  connect to "trusted" nodes.                             ##
##                                                          ##
##  If you run multiple nodes on a LAN, there's no need for ##
##  all of them to open lots of connections.  Instead       ##
##  'connect' them all to one node that is port forwarded   ##
##  and has lots of connections.                            ##
##       Thanks goes to [Noodle] on Freenode.               ##
##############################################################

# Use as many addnode= settings as you like to connect to specific peers
#addnode=69.164.218.197
#addnode=10.0.0.2:8333

# Alternatively use as many connect= settings as you like to connect ONLY to specific peers
#connect=69.164.218.197
#connect=10.0.0.1:8333

# Listening mode, enabled by default except when 'connect' is being used
#listen=1

# Port on which to listen for connections (default: 8333, testnet: 18333, regtest: 18444)
#port=

# Maximum number of inbound+outbound connections.
#maxconnections=

#
# JSON-RPC options (for controlling a running Bitcoin/bitcoind process)
#

# server=1 tells Bitcoin-Qt and bitcoind to accept JSON-RPC commands
#server=0

# Bind to given address to listen for JSON-RPC connections.
# Refer to the manpage or bitcoind -help for further details.
#rpcbind=<addr>

# If no rpcpassword is set, rpc cookie auth is sought. The default `-rpccookiefile` name
# is .cookie and found in the `-datadir` being used for bitcoind. This option is typically used
# when the server and client are run as the same user.
#
# If not, you must set rpcuser and rpcpassword to secure the JSON-RPC API.
#
# The config option `rpcauth` can be added to server startup argument. It is set at initialization time
# using the output from the script in share/rpcauth/rpcauth.py after providing a username:
#
# ./share/rpcauth/rpcauth.py alice
# String to be appended to bitcoin.conf:
# rpcauth=alice:f7efda5c189b999524f151318c0c86$d5b51b3beffbc02b724e5d095828e0bc8b2456e9ac8757ae3211a5d9b16a22ae
# Your password:
# DONT_USE_THIS_YOU_WILL_GET_ROBBED_8ak1gI25KFTvjovL3gAM967mies3E=
#
# On client-side, you add the normal user/password pair to send commands:
#rpcuser=alice
#rpcpassword=DONT_USE_THIS_YOU_WILL_GET_ROBBED_8ak1gI25KFTvjovL3gAM967mies3E=
#
# You can even add multiple entries of these to the server conf file, and client can use any of them:
# rpcauth=bob:b2dd077cb54591a2f3139e69a897ac$4e71f08d48b4347cf8eff3815c0e25ae2e9a4340474079f55705f40574f4ec99

# How many seconds bitcoin will wait for a complete RPC HTTP request.
# after the HTTP connection is established.
#rpcclienttimeout=30

# By default, only RPC connections from localhost are allowed.
# Specify as many rpcallowip= settings as you like to allow connections from other hosts,
# either as a single IPv4/IPv6 or with a subnet specification.

# NOTE: opening up the RPC port to hosts outside your local trusted network is NOT RECOMMENDED,
# because the rpcpassword is transmitted over the network unencrypted.

# server=1 tells Bitcoin-Qt to accept JSON-RPC commands.
# it is also read by bitcoind to determine if RPC should be enabled
#rpcallowip=10.1.1.34/255.255.255.0
#rpcallowip=1.2.3.4/24
#rpcallowip=2001:db8:85a3:0:0:8a2e:370:7334/96

# Listen for RPC connections on this TCP port:
#rpcport=8332

# You can use Bitcoin or bitcoind to send commands to Bitcoin/bitcoind
# running on another host using this option:
#rpcconnect=127.0.0.1

# Wallet options

# Specify where to find wallet, lockfile and logs. If not present, those files will be
# created as new.
#wallet=</path/to/dir>

# Create transactions that have enough fees so they are likely to begin confirmation within n blocks (default: 6).
# This setting is over-ridden by the -paytxfee option.
#txconfirmtarget=n

# Pay a transaction fee every time you send bitcoins.
#paytxfee=0.000x

# Miscellaneous options

# Pre-generate this many public/private key pairs, so wallet backups will be valid for
# both prior transactions and several dozen future transactions.
#keypool=100

# Enable pruning to reduce storage requirements by deleting old blocks.
# This mode is incompatible with -txindex and -rescan.
# 0 = default (no pruning).
# 1 = allows manual pruning via RPC.
# >=550 = target to stay under in MiB.
#prune=550

# User interface options

# Start Bitcoin minimized
#min=1

# Minimize to the system tray
#minimizetotray=1

# [Sections]
# Most options apply to mainnet, testnet and regtest.
# If you want to confine an option to just one network, you should add it in the
# relevant section below.
# EXCEPTIONS: The options addnode, connect, port, bind, rpcport, rpcbind and wallet
# only apply to mainnet unless they appear in the appropriate section below.

# Options only for mainnet
[main]

# Options only for testnet
[test]

# Options only for regtest
[regtest]

bitcoin-cli客戶端/管理端使用說明
關閉同步服務
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf stop 相當於直接啟動bitcoind後,ctrl+c操作.

bitcoin-cli命令引數

./bitcoin-cli -h
Bitcoin Core RPC client version v0.18.1
Usage:  bitcoin-cli [options] <command> [params]  Send command to Bitcoin Core
or:     bitcoin-cli [options] -named <command> [name=value]...  Send command to Bitcoin Core (with named arguments)
or:     bitcoin-cli [options] help                List commands
or:     bitcoin-cli [options] help <command>      Get help for a command
-conf=<file>                #指定配置檔案路徑。相對路徑將以datadir位置作為字首。預設檔名:bitcoin.conf
-datadir=<dir>              #指定資料儲存位置
-getinfo                    #從遠端伺服器獲取一般資訊。與伺服器端RPC呼叫不同,-getinfo的結果是多個非原子請求的結果。結果中的一些條目可能表示來自不同狀態的結果(例如,錢包餘額可能來自報告的鏈狀態的不同塊)
-named                      #傳遞指定的引數而不是位置引數
-rpcclienttimeout=<n>       #HTTP請求超時(以秒為單位),0表示沒有超時。預設900
-rpcconnect=<ip>            #向指定IP的節點發送命令,預設127.0.0.1
-rpccookiefile=<loc>        #認證cookie的路徑,相對路徑以datadir地址為字首。預設:data dir
-rpcpassword=<pw>           #JSON-RPC連線的密碼
-rpcport=<port>             #JSON-RPC連線的埠
-rpcuser=<user>             #JSON-RPC連線時使用的使用者名稱
-rpcwait                    #等待RPC伺服器啟動
-rpcwallet=<walletname>     #向非預設RPC伺服器發起RPC連線。需要精確匹配傳遞給bitcoin-cli的引數
-stdin                      #從標準輸入讀取額外的引數,每行一個,直到EOF/Ctrl-D結束(推薦用於敏感資訊,如密碼)。當與-stdinrpcpass結合使用時,使用標準輸入的第一行作為RPC密碼。
-stdinrpcpass               #讀取標準輸入第一行作為RPC密碼。當與-stdin結合使用時,標準輸入第一行作為RPC密碼。

RPC指令

bitcoin-cli  -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf help #通過RPC,API的方式來獲取資料
關閉bitcoin:     bitcoin-cli stop
檢視網路狀態:   bitcoin-cli getnetworkinfo
檢視網路節點:   bitcoin-cli getpeerinfo  #當前能看到有10個節點
檢視區塊鏈資訊: bitcoin-cli getblockchaininfo #當前同步區塊高度,區塊hash值,同步進度,總計佔用磁碟空間(位元組)等
檢視所有命令:    bitcoin-cli help

資料檔案說明(資料轉移)

整體資料檔案,以及各種操作對資料影響的說明

  • 終止或啟動程序測試
    可以隨時終止程序,拷貝或移動資料檔案到別處,重新指定配置引數 datadir 就可以了.預設是指向當前使用者根目錄下的.

  • 切換使用者測試
    切換到admin賬號,修改檔案屬組,依舊正常執行.

  • 剪下資料測試
    只要把配置檔案+指定的資料資料夾檔案一併拷貝就可以了.

資料檔案分類說明
參考: https://www.jianshu.com/p/6a8ee6cea3f7
在比特幣業務中需要儲存的資料主要分為下面四種:

1.blocks/blk*.dat: 這個是直接寫檔案的.比特幣中的blocks,會通過網路的形式dumped到disk上.一般他們在以下情況中被使用:重新掃描wallet中丟失的交易;鏈的重組;將blocks的資料提供給其它正在同步的節點.
2.blocks/rev*.dat: 這個是直接寫檔案的.儲存的是一些undo的blocks資料(其實還是儲存的blocks資料),這裡的作用和mysql中的undo log一致,用於“出錯”後的錯誤恢復.(這裡的出錯需要做特殊理解)
3.blocks/index/*.ldb: 這裡主要儲存一些blocks的元資料資訊以及blocks在disk上的pos資訊,這些資訊會儲存到LevelDB中。
4.chainstate/*.ldb: 這裡主要儲存當前還沒有花費的所有的交易輸出以及交易的元資料資訊都會在這裡儲存,在儲存的時候會做一些簡單的壓縮。儲存chainstate的資料主要是用來去驗證新進來的blocks和tx是否是合法的。如果沒有這個操作,就意味著對於每一個被花費的out你都需要去進行全表掃描來驗證。這個也是儲存到LevelDB上。

檔案許可權問題
如何防止非法使用者獲取到資料(管理好錢包,也就是 wallet.dat檔案)

dns自動獲取種子問題
程序啟動後,ctrl+c關閉經常卡幾分鐘在"dnsseed thread exit"原因.
當bitcoin客戶端第一次啟動的時候,程式不知道任何活躍的bitcoin全節點.為了發現一些IP地址,需要把一些DNS地址(也叫dns種子)硬編碼到比特幣原始碼中.如果沒有dns seed,客戶端不能自動聯上節點.
Dns Seed 由比特幣的社群成員維護,其中一些提供動態的dns seed服務,通過掃描網路自動獲取活躍的節點IP地址,其中一些提供靜態dns seed,這些種子是手動新增的.
dns seed 硬編碼在什麼地方了?

# src/chainparams.cpp
vSeeds.emplace_back("seed.bitcoin.sipa.be", true);  
vSeeds.emplace_back("dnsseed.bluematt.me", true); 
vSeeds.emplace_back("dnsseed.bitcoin.dashjr.org", false);  
vSeeds.emplace_back("seed.bitcoinstats.com", true);
vSeeds.emplace_back("seed.bitcoin.jonasschnelli.ch", true); 
vSeeds.emplace_back("seed.btc.petertodd.org", true);

比特幣測試(交易、地址、錢包、私鑰)

修改配置檔案與同步
修改配置檔案bitcoin.conf
testnet=1 (預設為0)
開始同步 bitcoind -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf
如無意外,同步則開始.測試網路節點資料大概幾十G,大概花了1~2個小時完成.

交易測試
1.建立錢包

bitcoin-cli  -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf createwallet "wallet-chenxin"
{
  "name": "wallet-chenxin",
  "warning": ""
}

2.檢視錢包
檢視當前載入的錢包內容(配置檔案裡指定)

1.bitcoin-cli  -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf getwalletinfo
{
  "walletname": "",
  "walletversion": 169900,
  "balance": 0.00010000,    #當前BTC數量
  "unconfirmed_balance": 0.00000000,
  "immature_balance": 0.00000000,
  "txcount": 1,
  "keypoololdest": 1568873683,
  "keypoolsize": 1000,
  "keypoolsize_hd_internal": 1000,
  "paytxfee": 0.00000000,
  "hdseedid": "c530a8eea32c6f547d66a00698ed3ded2a14f4e4",
  "private_keys_enabled": true
}
2.bitcoin-cli  -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf listaddressgroupings
[
  [
    [
      "2Msjqu5hjBRtTbyqu25XzoCiPqVKqLc8Q9P",
      0.00010000,
      "chenxin"
    ]
  ]
]

3.備份錢包
就是備份"wallet.dat"檔案.GUI上的備份功能,也是直接拷貝這個檔案到使用者指定目錄.
每次有新地址生成後(尤其是這個地址上有幣),就一定要重新備份錢包.因為新地址對應著一個新的金鑰.

4.加密與解密錢包
加密錢包,會重新根據當前wallet.dat生成新的wallet.dat(加過密的),以前備份的wallet.dat都會失效(密碼當前為168.....).轉賬的時候需要這個密碼.
MAC上,GUI支援點選.
Linux上,對應指令:
加密:
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf encryptwallet "168....."
解密:
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf walletpassphrase "168....." 60
解鎖後重新鎖定說明:

bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf walletpassphrase "168....." 60 #過60秒後,錢包解密金鑰將從記憶體中消失(防止黑客).
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf walletlock #在60s沒過完的情況下,手動重新鎖定.

5.切換錢包
bitcoin.conf配置檔案中指定.
wallet=/data/coin_test/bitcoin/bitcoin/bitcoin-data/testnet3/wallets/wallet-chenxin/
如果是測試網路,則放到"[test]"下面.

bitcoin-cli  -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf getwalletinfo 
{
  "walletname": "/data/coin_test/bitcoin/bitcoin/bitcoin-data/testnet3/wallets/wallet-chenxin/",
  "walletversion": 169900,
  "balance": 0.00140734,
  "unconfirmed_balance": 0.00000000,
  "immature_balance": 0.00000000,
  "txcount": 3,
  "keypoololdest": 1568968231,
  "keypoolsize": 997,
  "keypoolsize_hd_internal": 1000,
  "unlocked_until": 0,
  "paytxfee": 0.00000000,
  "hdseedid": "6aebc532a2d9d0a8b08cbff35888ec0ed03be5e0",
  "private_keys_enabled": true
}

6.錢包與賬號關係
現在應該沒有account的概念了.

7.新建地址(錢包對應收款地址可以有多個)
建立的地址,就是該錢包的收款地址.官方建議每筆交易使用一個新的地址(雖然可以複用).

8.金鑰(地址,公鑰,私鑰 區別)
收款地址是一個公鑰對應的地址.可以通過這個收款地址,匯出對應的私鑰地址.請見本文件下文說明.

9.匯出私鑰(收款地址對應的私鑰地址)

bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf walletpassphrase "168....." 60 #先解密錢包.說明部分請參考下文.這裡從預設錢包匯出的.
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf dumpprivkey "2MzG29vB6xRrq7r9R4v9r5gscw9W9zZbGcS" # 根據收款地址或得私鑰
cSpyAznMEntPCtvTCsqTGiTxMH37rDVJFQy4PLYe1Fsx4QuFeX1B

9.匯入私鑰
RPC命令格式: importprivkey "privkey" ( "label" ) ( rescan )
將私鑰(dumpprivkey返回)新增到錢包中。需要一個新的錢包備份。
提示:使用importmulti匯入多個私鑰。
引數:
"privkey":字串,必須項。私鑰(dumpprivkey的輸出)
"label":字串,可選項,預設為空。可選標籤。
rescan:布林值,可選項,預設為true。重新掃描錢包的交易。
注意:如果rescan為真,則此呼叫可能需要一個多小時才能完成,在此期間,其他rpc呼叫可能報告匯入的金鑰存在,但相關事務仍然缺失,導致臨時錯誤/虛假餘額和未使用的輸出,直到rescan完成。

私鑰 cSpyAznMEntPCtvTCsqTGiTxMH37rDVJFQy4PLYe1Fsx4QuFeX1B 匯入到 wallet-chenxin 錢包裡.
此筆交易對應 0.00000734 BTC 收入
當前 wallet-chenxin錢包含有 0.00100568 BTC
當前 預設錢包含有 0.00147100 BTC

執行匯入(在Linux機器上操作)
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf importprivkey "cSpyAznMEntPCtvTCsqTGiTxMH37rDVJFQy4PLYe1Fsx4QuFeX1B"
此操作等待大約20分鐘,預設錢包金額發生變化.
預設錢包:私鑰那筆是接收幣操作,故預設錢包金額增加了(因為預設錢包增加了那筆私鑰).
wallet-chenxin錢包:因仍舊有那個私鑰(存在錢包中),故金額未發生變化.
MAC端:Mac端GUI上的還沒有改變,因為Mac端的沒有執行匯入私鑰.也就是MAC上的錢包沒有變動(私鑰未增加),兩個錢包裡的金額都未發生改變.

檢視匯入後的錢包變化
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf getwalletinfo
{
  "walletname": "",
  "walletversion": 169900,
  "balance": 0.00147834, # 多了0.00000734,之前最初從預設錢包轉到wallet-chenxin金額就是 "收入: 0.00000734 BTC".
  "unconfirmed_balance": 0.00000000,
  "immature_balance": 0.00000000,
  "txcount": 5,
  "keypoololdest": 1568873683,
  "keypoolsize": 1000,
  "keypoolsize_hd_internal": 1000,
  "paytxfee": 0.00000000,
  "hdseedid": "c530a8eea32c6f547d66a00698ed3ded2a14f4e4",
  "private_keys_enabled": true
}

說明: 當同一個金鑰同時屬於A,B兩個錢包,在這2個錢包間轉賬,那麼會被無緣無故的扣除手續費,顯示在兩個錢包上,就是2個錢包都在被扣費.因為轉賬1個幣從A錢包到B錢包,總額沒有變化,但手續費需要付給第三方.

10.支付與轉賬
地址部分,請檢視"地址說明".

建立收款地址
生成當前載入的錢包的一個新地址(收款地址)
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf getnewaddress "chenxin"
返回值: 2Msjqu5hjBRtTbyqu25XzoCiPqVKqLc8Q9P

測試幣申請
因是測試環境,需要獲取測試幣.在以下測試幣申請地址.
http://bitcoinfaucet.uo1.net/send.php (申請成功,網頁提示"0.00010000 coins sent to 2Msjqu5hjBRtTbyqu25XzoCiPqVKqLc8Q9P")
https://coinfaucet.eu/en/btc-testnet/ (這個網址好像不行)
一般在上述網站申請後,mac客戶端會立即提示收到幣(當然,處於待收階段,還需要6個區塊的驗證).

完成轉賬後,可以從以下網站看收付款:
https://live.blockcypher.com/btc-testnet/tx/302ecc4a3c19a7b2262b07e6a9f0a304ab5288f57dbf49a62e2e28e811aba9d9/

查詢當前餘額

bitcoin-cli  -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf  getbalance
0.00010000
或
bitcoin-cli  -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf  listaddressgroupings
[
  [
    [
      "2Msjqu5hjBRtTbyqu25XzoCiPqVKqLc8Q9P",
      0.00010000,
      "chenxin"
    ]
  ]
]
且bitcoind程序輸出也會提示(或debug.log日誌也會)
2019-09-19T10:08:26Z [default wallet] AddToWallet 0b657c6e869a3fdb7775732eee5c40c8dd8eb103ae93f6c110a94844c07c9300  new
2019-09-19T10:24:14Z UpdateTip: new best=00000000be3805064989c9309dc7d625dc71270c5098485897e5211c3cdebf7d height=1578958 version=0x20000000 log2_work=72.220433 tx=52193257 date='2019-09-19T10:24:12Z' progress=1.000000 cache=0.2MiB(1723txo) warning='13 of last 100 blocks have unexpected version'
2019-09-19T10:24:14Z [default wallet] AddToWallet 0b657c6e869a3fdb7775732eee5c40c8dd8eb103ae93f6c110a94844c07c9300  update

支付,執行轉賬

解鎖錢包
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf walletpassphrase "168..." 60 #因是加密錢包,所以先解密
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf sendtoaddress "2NDHhJDXv..SuEbz" 0.0004 #轉賬
fed9790adaa8c5b4a4c46cb7ac9fe4d86e8c2b37bf57aee9e29e2c4c897c7f8a #返回值是個交易ID

10.助記詞有嗎?
不同錢包區別不同.bitcore沒有.

11.預設錢包和自建的錢包啥區別?
安裝節點後,有個預設錢包.可以手動再建立錢包(位置在預設錢包的下一級目錄).

12.地址說明
每個地址對應著錢包裡的一個私鑰.錢包就是所有私鑰的集合.官方建議每筆交易新建一個收款地址.
收款地址,付款地址有區別嗎?地址應該不分收款地址或付款地址.統稱地址.GUI上看不全,需要RPC指令listaddressgroupings.

測試轉賬流程裡的收付款地址情況

將 wallet-chenxin 錢包的部分金額發給預設錢包的 2NF1SsuPBWGh5eGa5RexfAYdKqJqiVULzmZ 地址.
檢視支付的具體地址是什麼?從 wallet-chenxin 錢包的哪些地址裡的金額扣過去的?
(轉賬後,確認網址 https://live.blockcypher.com/btc-testnet/address/2NF1SsuPBWGh5eGa5RexfAYdKqJqiVULzmZ/ )

轉出錢包
0.00000734 BTC from 2MzG29vB6xRrq7r9R4v9r5gscw9W9zZbGcS (output) 地址1
0.00009834 BTC from 2NAycnXJkP3kBTxdgsZUqntkVxDJe1xyr4K (output) 地址2
0.0009 BTC from 2NAkMUZSdn9hht3YAB8XBR8ePjFhukxkK6b (output) 地址3
合計 0.00100568 BTC (其中0.00000568是手續費).
以上是支出錢包 wallet-chenxin 付出的費用.可以看出,款項是從3個地址支出的.其中地址1,3是之前接收幣生成的地址.地址2不知道哪裡來的.

轉入錢包
0.001 BTC to 2NF1SsuPBWGh5eGa5RexfAYdKqJqiVULzmZ (unspent)
以上是接收錢包 預設錢包 收到的費用.該地址是收款地址,付款方指定的.

地址說明

RPC指令:  listaddressgroupings
[
  [
    [
      "2MzG29vB6xRrq7r9R4v9r5gscw9W9zZbGcS", #地址1
      0.00140000,
      ""
    ],
    [
      "2N57gLJSYvTUwbmAfVg6rgS1LrsDB58afgJ", #地址4
      0.00000000,
      ""
    ],
    [
      "2NAkMUZSdn9hht3YAB8XBR8ePjFhukxkK6b", #地址3
      0.00000000,
      ""
    ],
    [
      "2NAycnXJkP3kBTxdgsZUqntkVxDJe1xyr4K", #地址2
      0.00000000
    ]
  ]
]
而從 wallet-chenxin 錢包的GUI裡,檢視"接收"選項卡,裡面只有3個地址,不包含"地址2"

RPC指令: listreceivedbyaddress
能看到的,跟GUI裡是一致的,只看到"地址1,3,4".

日常運維

更新程式.
不同步了排查下原因.
錢包就是備份dat檔案,加密錢包,解密錢包.轉賬.
可能會用到匯出收款地址公鑰對應的私鑰,然後將私鑰匯入其他錢包,那筆交易另一個錢包也看得到了.

常用指令統計(解析請參考具體內容)

bitcoind -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf #啟動
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf stop #關停
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf createwallet "wallet-chenxin" #建立錢包
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf getwalletinfo #檢視錢包
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf listaddressgroupings #檢視錢包內的所有地址(含GUI裡看不到,GUI看到的跟listreceivedbyaddress相同)
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf getbalance # 查詢餘額
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf encryptwallet "168....." #加密錢包
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf walletpassphrase "168....." 60 #解密錢包(轉賬/匯出私鑰都需要先解密)
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf dumpprivkey "2MzG29...9zZbGcS" # 根據收款地址獲取私鑰(這裡是預設錢包)
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf importprivkey "cSpyAznMEntPC...4QuFeX1B" #匯入私鑰.匯入到另一個錢包
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf getnewaddress "chenxin" #生成一個收款地址,標籤為"chenxin",可以省略標籤
bitcoin-cli -conf=/data/coin_test/bitcoin/bitcoin/bitcoin.conf sendtoaddress "2NDHhJDXv..SuEbz" 0.0004 #轉賬

其他知識

md5sum 和 sha256sum 驗證軟體安裝包完整性

md5sum 和 sha256sum 都用來用來校驗軟體安裝包的完整性.講解如何使用兩個命令進行軟體安裝包的校驗.

sha 是什麼?
sha 為 安全雜湊演算法(英語:Secure Hash Algorithm,縮寫為SHA)是一個密碼雜湊函式家族,是FIPS所認證的安全雜湊演算法。
能計算出一個數字訊息所對應到的,長度固定的字串(又稱訊息摘要)的演算法。
且若輸入的訊息不同,計算得出的相同字串的機率極低。
SHA家族的五個演算法,分別是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512.
由美國國家安全域性(NSA)所設計,並由美國國家標準與技術研究院(NIST)釋出;是美國的政府標準。後四者有時並稱為SHA-2。
SHA-1在許多安全協定中廣為使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被視為是MD5(更早之前被廣為使用的雜湊函式)的後繼者。MD4 ->MD5 ->SHA-1 ->SHA-2.

md5 是什麼?
md5 為 訊息摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函式,可以產生出一個128位(16位元組)的雜湊值(hash value),用於確保資訊傳輸完整一致。
MD5由美國密碼學家羅納德·李維斯特(Ronald Linn Rivest)設計,於1992年公開,用以取代MD4演算法。

sha256sum校驗軟體是否被非法修改過的方法

方法1:
sha256sum bitcoin-0.18.1-x86_64-linux-gnu.tar.gz  列出值,與官方給出的檔案或值對比.輸出如下
600d1db5e751fa85903e935a01a74f5cc57e1e7473c15fd3e17ed21e202cfe5a  bitcoin-0.18.1-x86_64-linux-gnu.tar.gz
方法2:
sha256sum -c SHA256SUMS.asc 列出當前資料夾下的所有檔案校驗值,是否跟SHA256SUMS.asc檔案裡描述一致.輸出如下
...
bitcoin-0.18.1-x86_64-linux-gnu.tar.gz: 確定
...
方法3:
sha256sum -c <(grep bitcoin-0.18.1-x86_64-linux-gnu.tar.gz SHA256SUMS.asc )
方法4:
grep bitcoin-0.18.1-x86_64-linux-gnu.tar.gz SHA256SUMS.asc | sha256sum -c

類似的方法還有以下,
md5sum test.txt
sha1sum test.