Bitcoind

以下的指引是介绍在主流的Linux系统下安装Bitcoin SV节点软件可使用的工具,前提假设是你使用着类似Bourne shell的shell,比如bash

在开始安装Bitcoin软件之前,请确认你使用的帐户能够使用su或sudo将软件安装到根用户所拥有的目录下。

下载

下载你选择的软件版本的压缩文件,以下示例中使用的软件是撰写本文时的最新版本v1.0.5:

$ wget https://download.bitcoinsv.io/bitcoinsv/1.0.5/bitcoin-sv-1.0.5-x86_64-linux-gnu.tar.gz

确认你下载成功的文件的sha哈希值与download.bitcoinsv.io上该软件版本提供的哈希值一致。

$ sha256sum bitcoin-sv-1.0.5-x86_64-linux-gnu.tar.gz
//Expected Output 
96f7c56c7ebd4ecb2dcd664297fcf0511169ac33eaf216407ebc49dae2535578  bitcoin-sv-1.0.5-x86_64-linux-gnu.tar.gz

 

设置

找到您下载的文件,使用tar命令将其解压,使用xzf解压参数和文件名。命令参数xzf的意思是解压 gZip 压缩了的 tar文件。例如,对于当前目录下的64位tar文件,指令为:

$ tar xvf bitcoin-sv-1.0.5-x86_64-linux-gnu.tar.gz

从名为bitcoin 的新目录创建一个符号链接到你刚刚通过解压生成的 bitcoin-sv-1.0.5目录,以方便使用和更新:

$ ln -s bitcoin-sv-1.0.5 bitcoin

创建一个bitcoin-data目录,放入bitcoin数据(否则Bitcoin会默认将数据放入~/.bitcoin):

$ mkdir bitcoin-data

在该目录下创建一个bitcoin.conf文件,用于对你所运行的节点进行设置:

$ cd bitcoin-data/
$ vim bitcoin.conf

以下是bitcoin.conf文件被用于在STN上配置一个节点的示例:

运行bitcoind --help后你可以看到可选择配置的完整列表

#start in background
daemon=1

#select network -- comment out both for mainnet
#testnet=1
stn=1

#Required Consensus Rules for Genesis
excessiveblocksize=10000000000 #10GB
maxstackmemoryusageconsensus=100000000 #100MB

#Mining
#biggest block size you want to mine
blockmaxsize=4000000000
blockassembler=journaling #journaling is default as of 1.0.5

#preload mempool
preload=1

#mempool usage allowance
maxmempool=8000 #8G
dbcache=8192 #8G

#Pruning -- Uncomment to trim the chain in an effort to keep disk usage below the figure set
#prune=100000 #100GB

#orphan transaction storage
#blockreconstructionextratxn=200000
#maxorphantxsize=10000

#transaction options
#maxsigcachesize=260
#maxscriptcachesize=260
#minrelaytxfee=0.00000001
#mintxfee=0.00000001
#dustrelayfee=0.00000001
#blockmintxfee=0.00000001
#relaypriority=0
#feefilter=0
#limitfreerelay=1000
#maxscriptsizepolicy=500000

#OP Return max size
#datacarriersize=100000 #Genesis default is UINT32_MAX

#Max number and size of related Child and Parent transactions per block template
limitancestorcount=100
limitdescendantcount=100
#limitancestorsize=25000000
#limitdescendantsize=25000000

#connection options
maxconnections=80

#ZMQ
#zmqpubhashtx=tcp://127.0.0.1:28332
#zmqpubhashblock=tcp://127.0.0.1:28332

#Ports - Leave commented for defaults
#port=9333
#rpcport=9332

#rpc settings
rpcworkqueue=600
rpcthreads=16
#rpcallowip=0.0.0.0/0
rpcuser=CHANGE_ME
rpcpassword=CHANGE_ME

#debug options
#can be: net, tor,
# mempool, http, bench, zmq, db, rpc, addrman, selectcoins,
# reindex, cmpctblock, rand, prune, proxy, mempoolrej, libevent,
# coindb, leveldb, txnprop, txnsrc, journal, txnval.
# 1 = all options enabled.
# 0 = off which is default
#debug=1

#debugexclude to ignore set log items, can be used to keep log file a bit cleaner
debugexclude=libevent
debugexclude=leveldb
debugexclude=zmq
debugexclude=txnsrc
debugexclude=net

#shrinkdebugfile=0 # Setting to 1 prevents bitcoind from clearning the log file on restart. 0/off is default

#multi-threaded options
#threadsperblock=32
#maxparallelblocks
#scriptvalidatormaxbatchsize
#maxparallelblocksperpeer
maxstdtxvalidationduration=15
maxcollectedoutpoints=1000000
maxstdtxnsperthreadratio=10000
#maxnonstdtxvalidationduration


运行Run

直接运行

运行Bitcoind,传入配置文件的位置以及存储bitcoin数据的位置:

(在我们的示例中,使用了用户测试法)

$ /home/test/bitcoin/bin/bitcoind -conf=/home/test/bitcoin-data/bitcoin.conf -datadir=/home/test/bitcoin-data -daemon

 

使用systemctl运行

创建bitcoind.service文件:

$ sudo vim /etc/systemd/system/bitcoind.service

bitcoind.service:

[Unit]
Description=Bitcoin service
After=network.target
[Service]
Type=forking
ExecStart=/home/test/bitcoin/bin/bitcoind -conf=/home/test/bitcoin-data/bitcoin.conf -datadir=/home/test/bitcoin-data -daemon
ExecStop=/home/test/bitcoin/bin/bitcoin-cli -conf=/home/test/bitcoin-data/bitcoin.conf -datadir=/home/test/bitcoin-data stop
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-abnormal
TimeoutStopSec=120
KillMode=none
PrivateTmp=true
User=test
[Install]
WantedBy=multi-user.target

(请确认你将上面test替换为了你的登入用户)

接下来,我们开始:

$ sudo systemctl start bitcoind.service

 

使用Docker运行

此代码库中包括用于执行Bitcoin SV节点的docker映像。感谢Josh Ellithorpe和他的代码库,为我们的库提供了基础。

这个docker映像提供了bitcoindbitcoin-cli、和bitcoin-tx,它们可以被用于运行Bitcoin服务器并且与之交互。

请在此查看可用的版本Docker Hub页面

 

使用方法

运行最新版本的Bitcoin SV:

$ docker run bitcoinsv/bitcoin-sv

要在后台运行容器,请将-d选项传递给docker run,并为你的容器指定一个名称,以便之后参考使用:

$ docker run -d --rm --name bitcoind bitcoinsv/bitcoin-sv

在后台运行bitcoind服务后,可以显示正在运行的容器:

$ docker ps

或者查看服务日志:

$ docker logs -f bitcoind

停止或重启一个运行的容器:

$ docker stop bitcoind
$ docker start bitcoind

 

配置Bitcoin

配置服务器最好的方法就是将参数交给bitcoind指令。以下举例如何在测试网上运行Bitcoin SV:

$ docker run --name bitcoind-testnet bitcoinsv/bitcoin-sv bitcoind -testnet

或者,你可以编辑在数据目录中生成的bitcoin.conf文件,见下。

 

数据量

默认情况下,Docker将创建临时容器。也就是说,区块链数据将不会长久保存,每次启用容器时都需要从头开始同步区块链。

若要在容器重启或升级之间保持区块链数据不变,只需添加-v选项即可创建一个数据卷:

$ docker run -d --rm --name bitcoind -v bitcoin-data:/data bitcoinsv/bitcoin-sv
$ docker ps
$ docker inspect bitcoin-data

或者,你可以将数据卷映射到你的主机某处:

$ docker run -d --rm --name bitcoind -v "$PWD/data:/data" bitcoinsv/bitcoin-sv
$ ls -alh ./data

 

使用bitcoin-cli

默认情况下,Docker在专用网桥上运行所有容器,这意味着您无法访问运行bitcoin-cli命令所必需的RPC端口(8332)。

有几种方法可以针对正在运行的bitcoind容器运行bitcoin-cli。最简单的方法就是让你的bitcoin-cli容器与你的bitcoind容器共享网络:

$ docker run -d --rm --name bitcoind -v bitcoin-data:/data bitcoinsv/bitcoin-sv
$ docker run --rm --network container:bitcoind bitcoinsv/bitcoin-sv bitcoin-cli getinfo

如果你计划将RPC端口公开给多个容器(比如当你正在开发直接与RPC端口通讯的应用程序),则可能要考虑创建一个用户定义的网络。然后,你可以将此网络同时用于bitcoindbitclin-cli容器,并通过-rpcconnect指定你的bitcoind容器的主机名:

$ docker network create bitcoin
$ docker run -d --rm --name bitcoind -v bitcoin-data:/data --network bitcoin bitcoinsv/bitcoin-sv
$ docker run --rm --network bitcoin bitcoinsv/bitcoin-sv bitcoin-cli -rpcconnect=bitcoind getinfo

 

Kubernetes配置

以下说明将引导你逐步在GKE(Google Kubernetes Engine)中创建一个Bitcoin SV节点。

如果您想运行其他版本的bitcoind,只需在bitcoin-deployment.yml中更改图像引用即可。

步骤如下:

1- Add a new blank disk on GCE called bitcoin-data that is 200GB. You can always expand it later.
2- Save the following code snippets and place them in a new directory kube.
3- Change the rpcuser and rpcpass values in bitcoin-secrets.yml. They are base64 encoded. To base64 a string, just run echo -n SOMESTRING | base64.
4- Run kubectl create -f /path/to/kube
5- Profit!
 
bitcoin-deployment.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  namespace: default
  labels:
    service: bitcoin
  name: bitcoin
spec:
  strategy:
    type: Recreate
  replicas: 1
  template:
    metadata:
      labels:
        service: bitcoin
    spec:
      containers:
      - env:
        - name: BITCOIN_RPC_USER
          valueFrom:
            secretKeyRef:
              name: bitcoin
              key: rpcuser
        - name: BITCOIN_RPC_PASSWORD
          valueFrom:
            secretKeyRef:
              name: bitcoin
              key: rpcpass
        image: bitcoinsv/bitcoin-sv
        name: bitcoin
        volumeMounts:
          - mountPath: /data
            name: bitcoin-data
        resources:
          requests:
            memory: "2Gi"
      restartPolicy: Always
      volumes:
        - name: bitcoin-data
          gcePersistentDisk:
            pdName: bitcoin-data
            fsType: ext4
bitcoin-secrets.yml
apiVersion: v1
kind: Secret
metadata:
  name: bitcoin
type: Opaque
data:
  rpcuser: YWRtaW4=
  rpcpass: aXRvbGR5b3V0b2NoYW5nZXRoaXM=
bitcoin-srv.yml
apiVersion: v1
kind: Service
metadata:
  name: bitcoin
  namespace: default
spec:
  ports:
    - port: 8333
      targetPort: 8333
  selector:
    service: bitcoin
  type: LoadBalancer
  externalTrafficPolicy: Local

 

完整示例

有关使用Docker Compose运行比特币节点的完整示例,请参见Docker Compose 示例