撰写目的
Hyperledger-indy官方提供的indy-node手动部署文档较为简略且为全英文,本人在初次搭建节点时走了一些弯路,因此希望能为初次接触Hyperledger-indy的小伙伴提供一些参考。
内容说明
indy-node支持的是indy链功能。
官方提供docker镜像建立indy-pool(由indy-node组成),同时提供了手动部署indy-node节点的文档
参考文档地址:
https://hyperledger-indy.readthedocs.io/projects/node/en/latest/start-nodes.html
https://hyperledger-indy.readthedocs.io/projects/node/en/latest/setup-dev.html
根据此文档可建立indy-node节点,构建indy-pool,通过indy-pool即可实现使用indy链对数据进行上链的操作。
文章中如有错误,欢迎留言。
Hyperledger-indy下的indy-node,indy-sdk ,aries-cloudagent-python等项目,本人均进行过部署搭建并在企业项目中进行过应用,目前的目标是可以深入了解Hyperledger-indy原理,挖掘更多应用实现,欢迎随时交流。
indy-node部署文档
- 运行创建项目相关目录的脚本
- 安装rocksdb
- 安装indy-crypto
- 安装indy-plenum
- 安装indy-node
- 启动indy-pool之后增加节点
以下操作需要在每一个indy-node上面执行,
如果多个indy-node在同一机器上,因为每个indy-node默认使用同一位置的genesis文件,因此除了启动节点这一步骤之外,需要在同一主机上,针对每个node实例分别执行,其他步骤都只需要执行一次
如果indy-node在不同主机上,那么以下所有步骤都要对每一个主机分别执行
运行创建项目相关目录的脚本
[root@node software]$ cd scripts/create_dirs.sh
[root@node software]$ sh create_dirs.sh
#会创建相关目录,并在/etc/indy目录下生成indy_config.py文件,文件的内容是:
NETWORK_NAME = 'sandbox'
LEDGER_DIR = '/var/lib/indy'
LOG_DIR = '/var/log/indy'
KEYS_DIR = '/var/lib/indy'
GENESIS_DIR = '/var/lib/indy'
BACKUP_DIR = '/var/lib/indy/backup'
PLUGINS_DIR = '/var/lib/indy/plugins'
NODE_INFO_DIR = '/var/lib/indy'
安装rocksdb
安装依赖
yum install -y \gflags-devel\snappy-devel \zlib-devel \bzip2 bzip2-devel \libstdc++-devel \lz4-devel \libzstd-devel \snappy-devel.x86_64snappylibasanzlib
下载rocksdb-6.4.6源码
在https://github.com/facebook/rocksdb/
下载rocksdb源码
[root@node software]$ tar -zxvf rocksdb-6.4.6.tar.gz
[root@node software]$ cd /data/software/rocksdb-6.4.6
[root@node software]$ make static_lib
[root@node software]$ make shared_lib[root@node software]$ export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/data/software/rocksdb-6.4.6/include:/usr/local/lib
[root@node software]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/software/rocksdb-6.4.6/lib
[root@node software]$ export LIBRARY_PATH=$LIBRARY_PATH:/data/software/rocksdb-6.4.6[root@node software]$ sudo cp /data/software/rocksdb-6.4.6/librocksdb.so /usr/local/lib
[root@node software]$ sudo mkdir -p /usr/local/include/rocksdb/
[root@node software]$ sudo cp -r /data/software/rocksdb-6.4.6/include/* /usr/local/include/[root@node software]$ ln -s /usr/local/lib/librocksdb.so.5 /usr/local/lib/librocksdb.so
[root@node software]$ ln -s /usr/local/lib/librocksdb.so.5.18 /usr/local/lib/librocksdb.so
[root@node software]$ ln -s /usr/local/lib/librocksdb.so.5.18.3 /usr/local/lib/librocksdb.so[root@node software]$ yum install libsodium-devel zmq
[root@node software]$ yum install \xz-devel \python-backports-lzma
[root@node software]$ python -m pip install backports.lzma
[root@node software]$ vim /data/software/Python3.6.9/lib/python3.6/lzma.py
#将27行修改为以下内容
try:from _lzma import *from _lzma import _encode_filter_properties, _decode_filter_properties
except ImportError:from backports.lzma import *from backports.lzma import _encode_filter_properties, _decode_filter_properties[root@node software]$ python -m pip install python-rocksdb
安装indy-crypto
下载indy-crypto源码
https://codeload.github.com/hyperledger-archives/indy-crypto/zip/refs/tags/v0.4.2
[root@node software]$ cd indy-crypto-0.4.2\libindy-crypto
[root@node software]$ cargo build
#将libindy_crypto.so添加到系统依赖库中/usr/local/lib
[root@node software]$ cp libindy_crypto.so /usr/local/lib
[root@node software]$ cp libssl.so.1.0.0 /usr/local/lib
[root@node software]$ cp libcrypto.so.1.0.0 /usr/local/lib
[root@node software]$ chmod 777 libindy_crypto.so
[root@node software]$ pip install libindy-crypto
安装indy-plenum
安装glibc2.18
[root@node software]$ yum install -y glibc.x86_64 glibc-devel.x86_64 glibc-static.x86_64
[root@node software]$ curl -O http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
[root@node software]$ tar -zxvf glibc-2.18.tar.gz
[root@node software]$ cd glibc-2.18
[root@node software]$ mkdir build
[root@node software]$ mkdir /data/software/glibc2.18
[root@node software]$ cd build/
[root@node software]$ echo $LD_LIBRARY_PATH
[root@node software]$ export LD_LIBRARY_PATH=
# 安装glibc的时候临时清除$LD_LIBRARY_PATH的值
[root@node software]$ echo $LD_LIBRARY_PATH
#../configure --prefix=/usr
[root@node software]$ ../configure --prefix=/data/software/glibc2.18
[root@node software]$ make -j4
[root@node software]$ make install
[root@node software]$ export GLIBC_PATH=$GLIBC_PATH:/data/software/glibc-2.18/lib
[root@node software]$ source /etc/profile
下载indy-plenum源码
https://codeload.github.com/hyperledger/indy-plenum/zip/refs/tags/v1.12.4
[root@node software]$ tar -zxvf indy-plenum-1.12.4.tar.gz
[root@node software]$ cd /data/software/indy-plenum-1.12.4
[root@node software]$ python setup.py install
安装indy-node
[root@node software]$ ld -lsnappy --verbose
[root@node software]$ yum install snappy-devel.x86_64
下载indy-node源码
https://codeload.github.com/hyperledger/indy-node/zip/refs/tags/v1.12.4
[root@node software]$ unzip indy-node-1.12.4.zip
[root@node software]$ cd indy-node-1.12.4
[root@node software]$ python setup.py install
生成节点间通信所需的密钥,并且生成启动indy-node所需要的genesis文件
会生成集群的pool transaction文件和domain transaction文件
以下命令用来指定集群配置,会按照节点顺序从9700开始为每个节点指定端口
例如,
第1个ip对应的节点端口号为9701,客户端端口号为9702
第2个ip对应的节点端口号为9703,客户端端口号为9704
第3个ip对应的节点端口号为9705,客户端端口号为9706
第4个ip对应的节点端口号为9707,客户端端口号为9708
[root@node software]$ cd indy-node-1.12.4/scripts
# generate_indy_pool_transactions --nodes=节点数量 --clients=客户端 --nodeNum=当前这个节点是第几个节点(节点编号与--ips参数中指定的ip顺序是对应的,不如这里如果指定为2,就是说当前这个节点是--ips这个参数中第二个ip对应的主机) --ips '第1个节点的ip,第2个节点的ip,第3个节点的ip,第4个节点的ip' --network=indy-pool的集群名称(可以随便取,后面就可以用这个名称代替指定集群)
[root@node software]$ generate_indy_pool_transactions --nodes=4 --clients=5 --nodeNum=1 --ips '0.0.0.0,0.0.0.0,0.0.0.0,0.0.0.0' --network=mytest
启动node
[root@node software]$ cd indy-node-1.12.4/scripts
# start_indy_node 节点名称 节点ip 节点端口 客户端ip 客户端端口
[root@node software]$ start_indy_node Node1 0.0.0.0 9701 0.0.0.0 9702
启动indy-pool之后增加节点
将初始节点上的指定文件(pool_transactions_genesis,domain_transactions_genesis)拷贝到新添加的节点的/var/lib/indy/{network_name}目录下面
生成节点通信所需的文件
[root@node software]$ init_indy_keys --name Alpha
启动节点
[root@node software]$ start_indy_node Node2 0.0.0.0 9703 0.0.0.0 9704
生成verkey的base58
verkey=b78300b3a3eca0a1679e72dd1656075de9638ae79dc6469a3093ce1cc8b424f
[root@node software]$ python3 -c "from plenum.common.test_network_setup import TestNetworkSetup; print(TestNetworkSetup.getNymFromVerkey(str.encode(‘ab78300b3a3eca0a1679e72dd1656075de9638ae79dc6469a3093ce1cc8b424f’)))
通过连接indy-node的客户端,将新节点添加到indy-pool
连接indy客户端既可以通过indy-sdk,也可以使用indy-cli工具
ledger node \
target=6G9QhQa3HWjRKeRmEvEkLbWWf2t7cw6KLtafzi494G4G \
client_port=9702 \
client_ip=10.255.255.255 \
alias=NewNode \
node_ip=10.0.0.10.255.255.255 \
node_port=9701 \
services=VALIDATOR \
blskey=zi65fRHZjK2R8wdJfDzeWVgcf9imXUsMSEY64LQ4HyhDMsSn3Br1vhnwXHE7NyGjxVnwx4FGPqxpzY8HrQ2PnrL9tu4uD34rjgPEnFXnsGAp8aF68R4CcfsmUXfuU51hogE7dZCvaF9GPou86EWrTKpW5ow3ifq16Swpn5nKMXHTKj \
blskey_pop=RaY9xGLbQbrBh8np5gWWQAWisaxd96FtvbxKjyzBj4fUYyPq4pkyCHTYvQzjehmUK5pNfnyhwWqGg1ahPwtWopenuRjAeCbib6sVq68cTBXQfXv5vTDhWs6AmdQBcYVELFpyGba9G6CfqQ5jnkDiaAm2PyBswJxpu6AZTxKADhtSrj