最近在用Hyperledger Fabric平台做一个项目,要使用区块链浏览器。以下是我的基础环境的情况以及搭建过程。

版本
Ubuntu22.04.1 LTS
运行内存8.0GiB
处理器Intel® Core™ i7-8700 CPU @ 3.20GHz × 12
Hyperledger Fabric2.2
golang1.17.5
docker20.10.12
docker-compose1.29.2
nodejsv12.22.9
npm8.5.1

在基础环境配好之后,就可以搭建区块链浏览器了。首先要在项目目录里面建立explorer文件夹,并需要进入explorer文件夹,以下为对应命令。

mkdir explorer
cd explorer

在建立好explorer文件夹之后,项目目录结构是这样的。

更具体的目录结构是这样的(这是搭建完成之后的),此处使用了tree -L 9命令。

.
├── chaincode
│ ├── go.mod
│ ├── go.sum
│ ├── med.go
│ └── vendor
│ ├── github.com
│ │ ├── golang
│ │ │ └── protobuf
│ │ │ ├── AUTHORS
│ │ │ ├── CONTRIBUTORS
│ │ │ ├── LICENSE
│ │ │ ├── proto
│ │ │ │ ├── clone.go
│ │ │ │ ├── decode.go
│ │ │ │ ├── deprecated.go
│ │ │ │ ├── discard.go
│ │ │ │ ├── encode.go
│ │ │ │ ├── equal.go
│ │ │ │ ├── extensions.go
│ │ │ │ ├── lib.go
│ │ │ │ ├── message_set.go
│ │ │ │ ├── pointer_reflect.go
│ │ │ │ ├── pointer_unsafe.go
│ │ │ │ ├── properties.go
│ │ │ │ ├── table_marshal.go
│ │ │ │ ├── table_merge.go
│ │ │ │ ├── table_unmarshal.go
│ │ │ │ ├── text.go
│ │ │ │ └── text_parser.go
│ │ │ └── ptypes
│ │ │ ├── any
│ │ │ │ ├── any.pb.go
│ │ │ │ └── any.proto
│ │ │ ├── any.go
│ │ │ ├── doc.go
│ │ │ ├── duration
│ │ │ │ ├── duration.pb.go
│ │ │ │ └── duration.proto
│ │ │ ├── duration.go
│ │ │ ├── empty
│ │ │ │ ├── empty.pb.go
│ │ │ │ └── empty.proto
│ │ │ ├── timestamp
│ │ │ │ ├── timestamp.pb.go
│ │ │ │ └── timestamp.proto
│ │ │ └── timestamp.go
│ │ └── hyperledger
│ │ ├── fabric-chaincode-go
│ │ │ ├── LICENSE
│ │ │ └── shim
│ │ │ ├── chaincodeserver.go
│ │ │ ├── handler.go
│ │ │ ├── interfaces.go
│ │ │ ├── internal
│ │ │ │ ├── client.go
│ │ │ │ ├── config.go
│ │ │ │ └── server.go
│ │ │ ├── response.go
│ │ │ ├── shim.go
│ │ │ └── stub.go
│ │ └── fabric-protos-go
│ │ ├── common
│ │ │ ├── collection.pb.go
│ │ │ ├── common.pb.go
│ │ │ ├── configtx.pb.go
│ │ │ ├── configuration.pb.go
│ │ │ ├── ledger.pb.go
│ │ │ └── policies.pb.go
│ │ ├── ledger
│ │ │ ├── queryresult
│ │ │ │ └── kv_query_result.pb.go
│ │ │ └── rwset
│ │ │ └── rwset.pb.go
│ │ ├── LICENSE
│ │ ├── msp
│ │ │ ├── identities.pb.go
│ │ │ ├── msp_config.pb.go
│ │ │ └── msp_principal.pb.go
│ │ └── peer
│ │ ├── chaincode_event.pb.go
│ │ ├── chaincode.pb.go
│ │ ├── chaincode_shim.pb.go
│ │ ├── collection.pb.go
│ │ ├── configuration.pb.go
│ │ ├── events.pb.go
│ │ ├── peer.pb.go
│ │ ├── policy.pb.go
│ │ ├── proposal.pb.go
│ │ ├── proposal_response.pb.go
│ │ ├── query.pb.go
│ │ ├── resources.pb.go
│ │ ├── signed_cc_dep_spec.pb.go
│ │ ├── snapshot.pb.go
│ │ └── transaction.pb.go
│ ├── golang.org
│ │ └── x
│ │ ├── net
│ │ │ ├── AUTHORS
│ │ │ ├── CONTRIBUTORS
│ │ │ ├── http
│ │ │ │ └── httpguts
│ │ │ │ ├── guts.go
│ │ │ │ └── httplex.go
│ │ │ ├── http2
│ │ │ │ ├── ciphers.go
│ │ │ │ ├── client_conn_pool.go
│ │ │ │ ├── databuffer.go
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── errors.go
│ │ │ │ ├── flow.go
│ │ │ │ ├── frame.go
│ │ │ │ ├── go111.go
│ │ │ │ ├── gotrack.go
│ │ │ │ ├── headermap.go
│ │ │ │ ├── hpack
│ │ │ │ │ ├── encode.go
│ │ │ │ │ ├── hpack.go
│ │ │ │ │ ├── huffman.go
│ │ │ │ │ └── tables.go
│ │ │ │ ├── http2.go
│ │ │ │ ├── Makefile
│ │ │ │ ├── not_go111.go
│ │ │ │ ├── pipe.go
│ │ │ │ ├── README
│ │ │ │ ├── server.go
│ │ │ │ ├── transport.go
│ │ │ │ ├── write.go
│ │ │ │ ├── writesched.go
│ │ │ │ ├── writesched_priority.go
│ │ │ │ └── writesched_random.go
│ │ │ ├── idna
│ │ │ │ ├── idna10.0.0.go
│ │ │ │ ├── idna9.0.0.go
│ │ │ │ ├── punycode.go
│ │ │ │ ├── tables10.0.0.go
│ │ │ │ ├── tables11.0.0.go
│ │ │ │ ├── tables9.0.0.go
│ │ │ │ ├── trie.go
│ │ │ │ └── trieval.go
│ │ │ ├── internal
│ │ │ │ └── timeseries
│ │ │ │ └── timeseries.go
│ │ │ ├── LICENSE
│ │ │ ├── PATENTS
│ │ │ └── trace
│ │ │ ├── events.go
│ │ │ ├── histogram.go
│ │ │ └── trace.go
│ │ ├── sys
│ │ │ ├── AUTHORS
│ │ │ ├── CONTRIBUTORS
│ │ │ ├── LICENSE
│ │ │ ├── PATENTS
│ │ │ └── unix
│ │ │ ├── affinity_linux.go
│ │ │ ├── aliases.go
│ │ │ ├── asm_aix_ppc64.s
│ │ │ ├── asm_darwin_386.s
│ │ │ ├── asm_darwin_amd64.s
│ │ │ ├── asm_darwin_arm64.s
│ │ │ ├── asm_darwin_arm.s
│ │ │ ├── asm_dragonfly_amd64.s
│ │ │ ├── asm_freebsd_386.s
│ │ │ ├── asm_freebsd_amd64.s
│ │ │ ├── asm_freebsd_arm64.s
│ │ │ ├── asm_freebsd_arm.s
│ │ │ ├── asm_linux_386.s
│ │ │ ├── asm_linux_amd64.s
│ │ │ ├── asm_linux_arm64.s
│ │ │ ├── asm_linux_arm.s
│ │ │ ├── asm_linux_mips64x.s
│ │ │ ├── asm_linux_mipsx.s
│ │ │ ├── asm_linux_ppc64x.s
│ │ │ ├── asm_linux_riscv64.s
│ │ │ ├── asm_linux_s390x.s
│ │ │ ├── asm_netbsd_386.s
│ │ │ ├── asm_netbsd_amd64.s
│ │ │ ├── asm_netbsd_arm64.s
│ │ │ ├── asm_netbsd_arm.s
│ │ │ ├── asm_openbsd_386.s
│ │ │ ├── asm_openbsd_amd64.s
│ │ │ ├── asm_openbsd_arm64.s
│ │ │ ├── asm_openbsd_arm.s
│ │ │ ├── asm_solaris_amd64.s
│ │ │ ├── bluetooth_linux.go
│ │ │ ├── cap_freebsd.go
│ │ │ ├── constants.go
│ │ │ ├── dev_aix_ppc64.go
│ │ │ ├── dev_aix_ppc.go
│ │ │ ├── dev_darwin.go
│ │ │ ├── dev_dragonfly.go
│ │ │ ├── dev_freebsd.go
│ │ │ ├── dev_linux.go
│ │ │ ├── dev_netbsd.go
│ │ │ ├── dev_openbsd.go
│ │ │ ├── dirent.go
│ │ │ ├── endian_big.go
│ │ │ ├── endian_little.go
│ │ │ ├── env_unix.go
│ │ │ ├── errors_freebsd_386.go
│ │ │ ├── errors_freebsd_amd64.go
│ │ │ ├── errors_freebsd_arm.go
│ │ │ ├── fcntl_darwin.go
│ │ │ ├── fcntl.go
│ │ │ ├── fcntl_linux_32bit.go
│ │ │ ├── gccgo_c.c
│ │ │ ├── gccgo.go
│ │ │ ├── gccgo_linux_amd64.go
│ │ │ ├── ioctl.go
│ │ │ ├── mkall.sh
│ │ │ ├── mkerrors.sh
│ │ │ ├── pagesize_unix.go
│ │ │ ├── pledge_openbsd.go
│ │ │ ├── race0.go
│ │ │ ├── race.go
│ │ │ ├── readdirent_getdents.go
│ │ │ ├── readdirent_getdirentries.go
│ │ │ ├── README.md
│ │ │ ├── sockcmsg_linux.go
│ │ │ ├── sockcmsg_unix.go
│ │ │ ├── str.go
│ │ │ ├── syscall_aix.go
│ │ │ ├── syscall_aix_ppc64.go
│ │ │ ├── syscall_aix_ppc.go
│ │ │ ├── syscall_bsd.go
│ │ │ ├── syscall_darwin_386.go
│ │ │ ├── syscall_darwin_amd64.go
│ │ │ ├── syscall_darwin_arm64.go
│ │ │ ├── syscall_darwin_arm.go
│ │ │ ├── syscall_darwin.go
│ │ │ ├── syscall_darwin_libSystem.go
│ │ │ ├── syscall_dragonfly_amd64.go
│ │ │ ├── syscall_dragonfly.go
│ │ │ ├── syscall_freebsd_386.go
│ │ │ ├── syscall_freebsd_amd64.go
│ │ │ ├── syscall_freebsd_arm64.go
│ │ │ ├── syscall_freebsd_arm.go
│ │ │ ├── syscall_freebsd.go
│ │ │ ├── syscall.go
│ │ │ ├── syscall_linux_386.go
│ │ │ ├── syscall_linux_amd64_gc.go
│ │ │ ├── syscall_linux_amd64.go
│ │ │ ├── syscall_linux_arm64.go
│ │ │ ├── syscall_linux_arm.go
│ │ │ ├── syscall_linux_gc_386.go
│ │ │ ├── syscall_linux_gccgo_386.go
│ │ │ ├── syscall_linux_gccgo_arm.go
│ │ │ ├── syscall_linux_gc.go
│ │ │ ├── syscall_linux.go
│ │ │ ├── syscall_linux_mips64x.go
│ │ │ ├── syscall_linux_mipsx.go
│ │ │ ├── syscall_linux_ppc64x.go
│ │ │ ├── syscall_linux_riscv64.go
│ │ │ ├── syscall_linux_s390x.go
│ │ │ ├── syscall_linux_sparc64.go
│ │ │ ├── syscall_netbsd_386.go
│ │ │ ├── syscall_netbsd_amd64.go
│ │ │ ├── syscall_netbsd_arm64.go
│ │ │ ├── syscall_netbsd_arm.go
│ │ │ ├── syscall_netbsd.go
│ │ │ ├── syscall_openbsd_386.go
│ │ │ ├── syscall_openbsd_amd64.go
│ │ │ ├── syscall_openbsd_arm64.go
│ │ │ ├── syscall_openbsd_arm.go
│ │ │ ├── syscall_openbsd.go
│ │ │ ├── syscall_solaris_amd64.go
│ │ │ ├── syscall_solaris.go
│ │ │ ├── syscall_unix_gc.go
│ │ │ ├── syscall_unix_gc_ppc64x.go
│ │ │ ├── syscall_unix.go
│ │ │ ├── timestruct.go
│ │ │ ├── unveil_openbsd.go
│ │ │ ├── xattr_bsd.go
│ │ │ ├── zerrors_aix_ppc64.go
│ │ │ ├── zerrors_aix_ppc.go
│ │ │ ├── zerrors_darwin_386.go
│ │ │ ├── zerrors_darwin_amd64.go
│ │ │ ├── zerrors_darwin_arm64.go
│ │ │ ├── zerrors_darwin_arm.go
│ │ │ ├── zerrors_dragonfly_amd64.go
│ │ │ ├── zerrors_freebsd_386.go
│ │ │ ├── zerrors_freebsd_amd64.go
│ │ │ ├── zerrors_freebsd_arm64.go
│ │ │ ├── zerrors_freebsd_arm.go
│ │ │ ├── zerrors_linux_386.go
│ │ │ ├── zerrors_linux_amd64.go
│ │ │ ├── zerrors_linux_arm64.go
│ │ │ ├── zerrors_linux_arm.go
│ │ │ ├── zerrors_linux_mips64.go
│ │ │ ├── zerrors_linux_mips64le.go
│ │ │ ├── zerrors_linux_mips.go
│ │ │ ├── zerrors_linux_mipsle.go
│ │ │ ├── zerrors_linux_ppc64.go
│ │ │ ├── zerrors_linux_ppc64le.go
│ │ │ ├── zerrors_linux_riscv64.go
│ │ │ ├── zerrors_linux_s390x.go
│ │ │ ├── zerrors_linux_sparc64.go
│ │ │ ├── zerrors_netbsd_386.go
│ │ │ ├── zerrors_netbsd_amd64.go
│ │ │ ├── zerrors_netbsd_arm64.go
│ │ │ ├── zerrors_netbsd_arm.go
│ │ │ ├── zerrors_openbsd_386.go
│ │ │ ├── zerrors_openbsd_amd64.go
│ │ │ ├── zerrors_openbsd_arm64.go
│ │ │ ├── zerrors_openbsd_arm.go
│ │ │ ├── zerrors_solaris_amd64.go
│ │ │ ├── zptrace386_linux.go
│ │ │ ├── zptracearm_linux.go
│ │ │ ├── zptracemipsle_linux.go
│ │ │ ├── zptracemips_linux.go
│ │ │ ├── zsyscall_aix_ppc64_gccgo.go
│ │ │ ├── zsyscall_aix_ppc64_gc.go
│ │ │ ├── zsyscall_aix_ppc64.go
│ │ │ ├── zsyscall_aix_ppc.go
│ │ │ ├── zsyscall_darwin_386.1_11.go
│ │ │ ├── zsyscall_darwin_386.go
│ │ │ ├── zsyscall_darwin_386.s
│ │ │ ├── zsyscall_darwin_amd64.1_11.go
│ │ │ ├── zsyscall_darwin_amd64.go
│ │ │ ├── zsyscall_darwin_amd64.s
│ │ │ ├── zsyscall_darwin_arm.1_11.go
│ │ │ ├── zsyscall_darwin_arm64.1_11.go
│ │ │ ├── zsyscall_darwin_arm64.go
│ │ │ ├── zsyscall_darwin_arm64.s
│ │ │ ├── zsyscall_darwin_arm.go
│ │ │ ├── zsyscall_darwin_arm.s
│ │ │ ├── zsyscall_dragonfly_amd64.go
│ │ │ ├── zsyscall_freebsd_386.go
│ │ │ ├── zsyscall_freebsd_amd64.go
│ │ │ ├── zsyscall_freebsd_arm64.go
│ │ │ ├── zsyscall_freebsd_arm.go
│ │ │ ├── zsyscall_linux_386.go
│ │ │ ├── zsyscall_linux_amd64.go
│ │ │ ├── zsyscall_linux_arm64.go
│ │ │ ├── zsyscall_linux_arm.go
│ │ │ ├── zsyscall_linux_mips64.go
│ │ │ ├── zsyscall_linux_mips64le.go
│ │ │ ├── zsyscall_linux_mips.go
│ │ │ ├── zsyscall_linux_mipsle.go
│ │ │ ├── zsyscall_linux_ppc64.go
│ │ │ ├── zsyscall_linux_ppc64le.go
│ │ │ ├── zsyscall_linux_riscv64.go
│ │ │ ├── zsyscall_linux_s390x.go
│ │ │ ├── zsyscall_linux_sparc64.go
│ │ │ ├── zsyscall_netbsd_386.go
│ │ │ ├── zsyscall_netbsd_amd64.go
│ │ │ ├── zsyscall_netbsd_arm64.go
│ │ │ ├── zsyscall_netbsd_arm.go
│ │ │ ├── zsyscall_openbsd_386.go
│ │ │ ├── zsyscall_openbsd_amd64.go
│ │ │ ├── zsyscall_openbsd_arm64.go
│ │ │ ├── zsyscall_openbsd_arm.go
│ │ │ ├── zsyscall_solaris_amd64.go
│ │ │ ├── zsysctl_openbsd_386.go
│ │ │ ├── zsysctl_openbsd_amd64.go
│ │ │ ├── zsysctl_openbsd_arm64.go
│ │ │ ├── zsysctl_openbsd_arm.go
│ │ │ ├── zsysnum_darwin_386.go
│ │ │ ├── zsysnum_darwin_amd64.go
│ │ │ ├── zsysnum_darwin_arm64.go
│ │ │ ├── zsysnum_darwin_arm.go
│ │ │ ├── zsysnum_dragonfly_amd64.go
│ │ │ ├── zsysnum_freebsd_386.go
│ │ │ ├── zsysnum_freebsd_amd64.go
│ │ │ ├── zsysnum_freebsd_arm64.go
│ │ │ ├── zsysnum_freebsd_arm.go
│ │ │ ├── zsysnum_linux_386.go
│ │ │ ├── zsysnum_linux_amd64.go
│ │ │ ├── zsysnum_linux_arm64.go
│ │ │ ├── zsysnum_linux_arm.go
│ │ │ ├── zsysnum_linux_mips64.go
│ │ │ ├── zsysnum_linux_mips64le.go
│ │ │ ├── zsysnum_linux_mips.go
│ │ │ ├── zsysnum_linux_mipsle.go
│ │ │ ├── zsysnum_linux_ppc64.go
│ │ │ ├── zsysnum_linux_ppc64le.go
│ │ │ ├── zsysnum_linux_riscv64.go
│ │ │ ├── zsysnum_linux_s390x.go
│ │ │ ├── zsysnum_linux_sparc64.go
│ │ │ ├── zsysnum_netbsd_386.go
│ │ │ ├── zsysnum_netbsd_amd64.go
│ │ │ ├── zsysnum_netbsd_arm64.go
│ │ │ ├── zsysnum_netbsd_arm.go
│ │ │ ├── zsysnum_openbsd_386.go
│ │ │ ├── zsysnum_openbsd_amd64.go
│ │ │ ├── zsysnum_openbsd_arm64.go
│ │ │ ├── zsysnum_openbsd_arm.go
│ │ │ ├── ztypes_aix_ppc64.go
│ │ │ ├── ztypes_aix_ppc.go
│ │ │ ├── ztypes_darwin_386.go
│ │ │ ├── ztypes_darwin_amd64.go
│ │ │ ├── ztypes_darwin_arm64.go
│ │ │ ├── ztypes_darwin_arm.go
│ │ │ ├── ztypes_dragonfly_amd64.go
│ │ │ ├── ztypes_freebsd_386.go
│ │ │ ├── ztypes_freebsd_amd64.go
│ │ │ ├── ztypes_freebsd_arm64.go
│ │ │ ├── ztypes_freebsd_arm.go
│ │ │ ├── ztypes_linux_386.go
│ │ │ ├── ztypes_linux_amd64.go
│ │ │ ├── ztypes_linux_arm64.go
│ │ │ ├── ztypes_linux_arm.go
│ │ │ ├── ztypes_linux_mips64.go
│ │ │ ├── ztypes_linux_mips64le.go
│ │ │ ├── ztypes_linux_mips.go
│ │ │ ├── ztypes_linux_mipsle.go
│ │ │ ├── ztypes_linux_ppc64.go
│ │ │ ├── ztypes_linux_ppc64le.go
│ │ │ ├── ztypes_linux_riscv64.go
│ │ │ ├── ztypes_linux_s390x.go
│ │ │ ├── ztypes_linux_sparc64.go
│ │ │ ├── ztypes_netbsd_386.go
│ │ │ ├── ztypes_netbsd_amd64.go
│ │ │ ├── ztypes_netbsd_arm64.go
│ │ │ ├── ztypes_netbsd_arm.go
│ │ │ ├── ztypes_openbsd_386.go
│ │ │ ├── ztypes_openbsd_amd64.go
│ │ │ ├── ztypes_openbsd_arm64.go
│ │ │ ├── ztypes_openbsd_arm.go
│ │ │ └── ztypes_solaris_amd64.go
│ │ └── text
│ │ ├── AUTHORS
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ ├── secure
│ │ │ └── bidirule
│ │ │ ├── bidirule10.0.0.go
│ │ │ ├── bidirule9.0.0.go
│ │ │ └── bidirule.go
│ │ ├── transform
│ │ │ └── transform.go
│ │ └── unicode
│ │ ├── bidi
│ │ │ ├── bidi.go
│ │ │ ├── bracket.go
│ │ │ ├── core.go
│ │ │ ├── prop.go
│ │ │ ├── tables10.0.0.go
│ │ │ ├── tables9.0.0.go
│ │ │ └── trieval.go
│ │ └── norm
│ │ ├── composition.go
│ │ ├── forminfo.go
│ │ ├── input.go
│ │ ├── iter.go
│ │ ├── normalize.go
│ │ ├── readwriter.go
│ │ ├── tables10.0.0.go
│ │ ├── tables9.0.0.go
│ │ ├── transform.go
│ │ └── trie.go
│ ├── google.golang.org
│ │ ├── genproto
│ │ │ ├── googleapis
│ │ │ │ └── rpc
│ │ │ │ └── status
│ │ │ │ └── status.pb.go
│ │ │ └── LICENSE
│ │ └── grpc
│ │ ├── AUTHORS
│ │ ├── backoff.go
│ │ ├── balancer
│ │ │ ├── balancer.go
│ │ │ ├── base
│ │ │ │ ├── balancer.go
│ │ │ │ └── base.go
│ │ │ └── roundrobin
│ │ │ └── roundrobin.go
│ │ ├── balancer_conn_wrappers.go
│ │ ├── balancer.go
│ │ ├── balancer_v1_wrapper.go
│ │ ├── binarylog
│ │ │ └── grpc_binarylog_v1
│ │ │ └── binarylog.pb.go
│ │ ├── call.go
│ │ ├── clientconn.go
│ │ ├── codec.go
│ │ ├── codegen.sh
│ │ ├── codes
│ │ │ ├── codes.go
│ │ │ └── code_string.go
│ │ ├── connectivity
│ │ │ └── connectivity.go
│ │ ├── CONTRIBUTING.md
│ │ ├── credentials
│ │ │ ├── credentials.go
│ │ │ ├── internal
│ │ │ │ ├── syscallconn_appengine.go
│ │ │ │ └── syscallconn.go
│ │ │ └── tls13.go
│ │ ├── dialoptions.go
│ │ ├── doc.go
│ │ ├── encoding
│ │ │ ├── encoding.go
│ │ │ └── proto
│ │ │ └── proto.go
│ │ ├── go.mod
│ │ ├── go.sum
│ │ ├── grpclog
│ │ │ ├── grpclog.go
│ │ │ ├── logger.go
│ │ │ └── loggerv2.go
│ │ ├── install_gae.sh
│ │ ├── interceptor.go
│ │ ├── internal
│ │ │ ├── backoff
│ │ │ │ └── backoff.go
│ │ │ ├── balancerload
│ │ │ │ └── load.go
│ │ │ ├── binarylog
│ │ │ │ ├── binarylog.go
│ │ │ │ ├── binarylog_testutil.go
│ │ │ │ ├── env_config.go
│ │ │ │ ├── method_logger.go
│ │ │ │ ├── regenerate.sh
│ │ │ │ ├── sink.go
│ │ │ │ └── util.go
│ │ │ ├── channelz
│ │ │ │ ├── funcs.go
│ │ │ │ ├── types.go
│ │ │ │ ├── types_linux.go
│ │ │ │ ├── types_nonlinux.go
│ │ │ │ ├── util_linux.go
│ │ │ │ └── util_nonlinux.go
│ │ │ ├── envconfig
│ │ │ │ └── envconfig.go
│ │ │ ├── grpcrand
│ │ │ │ └── grpcrand.go
│ │ │ ├── grpcsync
│ │ │ │ └── event.go
│ │ │ ├── internal.go
│ │ │ ├── syscall
│ │ │ │ ├── syscall_linux.go
│ │ │ │ └── syscall_nonlinux.go
│ │ │ └── transport
│ │ │ ├── bdp_estimator.go
│ │ │ ├── controlbuf.go
│ │ │ ├── defaults.go
│ │ │ ├── flowcontrol.go
│ │ │ ├── handler_server.go
│ │ │ ├── http2_client.go
│ │ │ ├── http2_server.go
│ │ │ ├── http_util.go
│ │ │ ├── log.go
│ │ │ └── transport.go
│ │ ├── keepalive
│ │ │ └── keepalive.go
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── metadata
│ │ │ └── metadata.go
│ │ ├── naming
│ │ │ ├── dns_resolver.go
│ │ │ └── naming.go
│ │ ├── peer
│ │ │ └── peer.go
│ │ ├── picker_wrapper.go
│ │ ├── pickfirst.go
│ │ ├── preloader.go
│ │ ├── proxy.go
│ │ ├── README.md
│ │ ├── resolver
│ │ │ ├── dns
│ │ │ │ └── dns_resolver.go
│ │ │ ├── passthrough
│ │ │ │ └── passthrough.go
│ │ │ └── resolver.go
│ │ ├── resolver_conn_wrapper.go
│ │ ├── rpc_util.go
│ │ ├── server.go
│ │ ├── serviceconfig
│ │ │ └── serviceconfig.go
│ │ ├── service_config.go
│ │ ├── stats
│ │ │ ├── handlers.go
│ │ │ └── stats.go
│ │ ├── status
│ │ │ └── status.go
│ │ ├── stream.go
│ │ ├── tap
│ │ │ └── tap.go
│ │ ├── trace.go
│ │ ├── version.go
│ │ └── vet.sh
│ └── modules.txt
├── clean_docker.sh
├── config.yaml
├── explorer
│ ├── config.json
│ ├── connection-profile
│ │ └── org1-network.json
│ ├── docker-compose.yaml
│ └── organizations
│ ├── ordererOrganizations
│ │ └── example.com
│ │ ├── ca
│ │ │ ├── ca.example.com-cert.pem
│ │ │ └── priv_sk
│ │ ├── msp
│ │ │ ├── cacerts
│ │ │ │ └── ca.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ └── tlscacerts
│ │ │ └── tlsca.example.com-cert.pem
│ │ ├── orderers
│ │ │ └── orderer.example.com
│ │ │ ├── msp
│ │ │ │ ├── cacerts
│ │ │ │ │ └── ca.example.com-cert.pem
│ │ │ │ ├── config.yaml
│ │ │ │ ├── keystore
│ │ │ │ │ └── priv_sk
│ │ │ │ ├── signcerts
│ │ │ │ │ └── orderer.example.com-cert.pem
│ │ │ │ └── tlscacerts
│ │ │ │ └── tlsca.example.com-cert.pem
│ │ │ └── tls
│ │ │ ├── ca.crt
│ │ │ ├── server.crt
│ │ │ └── server.key
│ │ ├── tlsca
│ │ │ ├── priv_sk
│ │ │ └── tlsca.example.com-cert.pem
│ │ └── users
│ │ └── Admin@example.com
│ │ ├── msp
│ │ │ ├── cacerts
│ │ │ │ └── ca.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ │ └── priv_sk
│ │ │ ├── signcerts
│ │ │ │ └── Admin@example.com-cert.pem
│ │ │ └── tlscacerts
│ │ │ └── tlsca.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── client.crt
│ │ └── client.key
│ └── peerOrganizations
│ └── org1.example.com
│ ├── ca
│ │ ├── ca.org1.example.com-cert.pem
│ │ └── priv_sk
│ ├── msp
│ │ ├── cacerts
│ │ │ └── ca.org1.example.com-cert.pem
│ │ ├── config.yaml
│ │ └── tlscacerts
│ │ └── tlsca.org1.example.com-cert.pem
│ ├── peers
│ │ ├── peer0.org1.example.com
│ │ │ ├── msp
│ │ │ │ ├── cacerts
│ │ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ │ ├── config.yaml
│ │ │ │ ├── keystore
│ │ │ │ │ └── priv_sk
│ │ │ │ ├── signcerts
│ │ │ │ │ └── peer0.org1.example.com-cert.pem
│ │ │ │ └── tlscacerts
│ │ │ │ └── tlsca.org1.example.com-cert.pem
│ │ │ └── tls
│ │ │ ├── ca.crt
│ │ │ ├── server.crt
│ │ │ └── server.key
│ │ └── peer1.org1.example.com
│ │ ├── msp
│ │ │ ├── cacerts
│ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ │ └── priv_sk
│ │ │ ├── signcerts
│ │ │ │ └── peer1.org1.example.com-cert.pem
│ │ │ └── tlscacerts
│ │ │ └── tlsca.org1.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── server.crt
│ │ └── server.key
│ ├── tlsca
│ │ ├── priv_sk
│ │ └── tlsca.org1.example.com-cert.pem
│ └── users
│ ├── Admin@org1.example.com
│ │ ├── msp
│ │ │ ├── cacerts
│ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ │ └── priv_sk
│ │ │ ├── signcerts
│ │ │ │ └── Admin@org1.example.com-cert.pem
│ │ │ └── tlscacerts
│ │ │ └── tlsca.org1.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── client.crt
│ │ └── client.key
│ └── User1@org1.example.com
│ ├── msp
│ │ ├── cacerts
│ │ │ └── ca.org1.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore
│ │ │ └── priv_sk
│ │ ├── signcerts
│ │ │ └── User1@org1.example.com-cert.pem
│ │ └── tlscacerts
│ │ └── tlsca.org1.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
├── fixtures
│ ├── channel-artifacts
│ │ ├── channel.tx
│ │ ├── genesis.block
│ │ └── Org1MSPanchors.tx
│ ├── configtx.yaml
│ ├── crypto-config
│ │ ├── ordererOrganizations
│ │ │ └── example.com
│ │ │ ├── ca
│ │ │ │ ├── ca.example.com-cert.pem
│ │ │ │ └── priv_sk
│ │ │ ├── msp
│ │ │ │ ├── cacerts
│ │ │ │ │ └── ca.example.com-cert.pem
│ │ │ │ ├── config.yaml
│ │ │ │ └── tlscacerts
│ │ │ │ └── tlsca.example.com-cert.pem
│ │ │ ├── orderers
│ │ │ │ └── orderer.example.com
│ │ │ │ ├── msp
│ │ │ │ │ ├── cacerts
│ │ │ │ │ │ └── ca.example.com-cert.pem
│ │ │ │ │ ├── config.yaml
│ │ │ │ │ ├── keystore
│ │ │ │ │ │ └── priv_sk
│ │ │ │ │ ├── signcerts
│ │ │ │ │ │ └── orderer.example.com-cert.pem
│ │ │ │ │ └── tlscacerts
│ │ │ │ │ └── tlsca.example.com-cert.pem
│ │ │ │ └── tls
│ │ │ │ ├── ca.crt
│ │ │ │ ├── server.crt
│ │ │ │ └── server.key
│ │ │ ├── tlsca
│ │ │ │ ├── priv_sk
│ │ │ │ └── tlsca.example.com-cert.pem
│ │ │ └── users
│ │ │ └── Admin@example.com
│ │ │ ├── msp
│ │ │ │ ├── cacerts
│ │ │ │ │ └── ca.example.com-cert.pem
│ │ │ │ ├── config.yaml
│ │ │ │ ├── keystore
│ │ │ │ │ └── priv_sk
│ │ │ │ ├── signcerts
│ │ │ │ │ └── Admin@example.com-cert.pem
│ │ │ │ └── tlscacerts
│ │ │ │ └── tlsca.example.com-cert.pem
│ │ │ └── tls
│ │ │ ├── ca.crt
│ │ │ ├── client.crt
│ │ │ └── client.key
│ │ └── peerOrganizations
│ │ └── org1.example.com
│ │ ├── ca
│ │ │ ├── ca.org1.example.com-cert.pem
│ │ │ └── priv_sk
│ │ ├── msp
│ │ │ ├── cacerts
│ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ └── tlscacerts
│ │ │ └── tlsca.org1.example.com-cert.pem
│ │ ├── peers
│ │ │ ├── peer0.org1.example.com
│ │ │ │ ├── msp
│ │ │ │ │ ├── cacerts
│ │ │ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ │ │ ├── config.yaml
│ │ │ │ │ ├── keystore
│ │ │ │ │ │ └── priv_sk
│ │ │ │ │ ├── signcerts
│ │ │ │ │ │ └── peer0.org1.example.com-cert.pem
│ │ │ │ │ └── tlscacerts
│ │ │ │ │ └── tlsca.org1.example.com-cert.pem
│ │ │ │ └── tls
│ │ │ │ ├── ca.crt
│ │ │ │ ├── server.crt
│ │ │ │ └── server.key
│ │ │ └── peer1.org1.example.com
│ │ │ ├── msp
│ │ │ │ ├── cacerts
│ │ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ │ ├── config.yaml
│ │ │ │ ├── keystore
│ │ │ │ │ └── priv_sk
│ │ │ │ ├── signcerts
│ │ │ │ │ └── peer1.org1.example.com-cert.pem
│ │ │ │ └── tlscacerts
│ │ │ │ └── tlsca.org1.example.com-cert.pem
│ │ │ └── tls
│ │ │ ├── ca.crt
│ │ │ ├── server.crt
│ │ │ └── server.key
│ │ ├── tlsca
│ │ │ ├── priv_sk
│ │ │ └── tlsca.org1.example.com-cert.pem
│ │ └── users
│ │ ├── Admin@org1.example.com
│ │ │ ├── msp
│ │ │ │ ├── cacerts
│ │ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ │ ├── config.yaml
│ │ │ │ ├── keystore
│ │ │ │ │ └── priv_sk
│ │ │ │ ├── signcerts
│ │ │ │ │ └── Admin@org1.example.com-cert.pem
│ │ │ │ └── tlscacerts
│ │ │ │ └── tlsca.org1.example.com-cert.pem
│ │ │ └── tls
│ │ │ ├── ca.crt
│ │ │ ├── client.crt
│ │ │ └── client.key
│ │ └── User1@org1.example.com
│ │ ├── msp
│ │ │ ├── cacerts
│ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ │ └── priv_sk
│ │ │ ├── signcerts
│ │ │ │ └── User1@org1.example.com-cert.pem
│ │ │ └── tlscacerts
│ │ │ └── tlsca.org1.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── client.crt
│ │ └── client.key
│ ├── crypto-config.yaml
│ └── docker-compose.yaml
├── go.mod
├── go.sum
├── LICENSE
├── main.go
├── medical
├── README.md
├── sdkInit
│ ├── integration.go
│ ├── sdkInfo.go
│ └── sdkSetting.go
├── service
│ ├── domain.go
│ └── medService.go
└── web
├── controller
│ ├── controllerHandler.go
│ ├── controllerResponse.go
│ └── userInfo.go
├── static
│ ├── css
│ │ ├── bootstrap.min.css
│ │ ├── help.css
│ │ ├── index.css
│ │ ├── login.css
│ │ ├── process.css
│ │ ├── query.css
│ │ ├── queryResult.css
│ │ └── reset.css
│ ├── fonts
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ ├── glyphicons-halflings-regular.woff
│ │ └── glyphicons-halflings-regular.woff2
│ ├── images
│ │ ├── head.jpg
│ │ ├── icon_input.png
│ │ ├── icon_list.png
│ │ ├── logo.png
│ │ └── vline.gif
│ └── js
│ ├── bootstrap.min.js
│ └── jquery.min.js
├── tpl
│ ├── accessMedHistory.html
│ ├── accessMed.html
│ ├── accessMedResult.html
│ ├── auditAllRecords.html
│ ├── auditByMedicalRecord.html
│ ├── auditByOrganisation.html
│ ├── auditByOriginalAuthor.html
│ ├── auditByPatient.html
│ ├── auditByUser.html
│ ├── auditMed.html
│ ├── auditReportByTimeRangeAndOrg.html
│ ├── auditReportResult.html
│ ├── auditResult.html
│ ├── auditTimeRangeStartEnd.html
│ ├── deleteMed.html
│ ├── favicon.ico
│ ├── index.html
│ ├── login.html
│ ├── operateMed.html
│ ├── updateMed.html
│ └── uploadMed.html
└── webServer.go

217 directories, 696 files

进入explorer文件夹之后,需要执行以下命令。

wget https://raw.githubusercontent.com/hyperledger/blockchain-explorer/main/examples/net1/config.json
wget https://raw.githubusercontent.com/hyperledger/blockchain-explorer/main/examples/net1/connection-profile/test-network.json -P connection-profile
wget https://raw.githubusercontent.com/hyperledger/blockchain-explorer/main/docker-compose.yaml

以下为下载下来的配置文件的内容,如果下载不了可以复制下面三个文件的内容。

config.json

{"network-configs": {"test-network": {"name": "Test Network","profile": "./connection-profile/test-network.json"}},"license": "Apache-2.0"}

test-network.json

{"name": "test-network","version": "1.0.0","client": {"tlsEnable": true,"adminCredential": {"id": "exploreradmin","password": "exploreradminpw"},"enableAuthentication": true,"organization": "Org1MSP","connection": {"timeout": {"peer": {"endorser": "300"},"orderer": "300"}}},"channels": {"mychannel": {"peers": {"peer0.org1.example.com": {}}}},"organizations": {"Org1MSP": {"mspid": "Org1MSP","adminPrivateKey": {"path": "/tmp/crypto/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/priv_sk"},"peers": ["peer0.org1.example.com"],"signedCert": {"path": "/tmp/crypto/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem"}}},"peers": {"peer0.org1.example.com": {"tlsCACerts": {"path": "/tmp/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt"},"url": "grpcs://peer0.org1.example.com:7051"}}}

docker-compose.yaml

# SPDX-License-Identifier: Apache-2.0version: '2.1'volumes:pgdata:walletstore:networks:mynetwork.com:name: fabric_testservices:explorerdb.mynetwork.com:image: hyperledger/explorer-db:latestcontainer_name: explorerdb.mynetwork.comhostname: explorerdb.mynetwork.comenvironment:- DATABASE_DATABASE=fabricexplorer- DATABASE_USERNAME=hppoc- DATABASE_PASSWORD=passwordhealthcheck:test: "pg_isready -h localhost -p 5432 -q -U postgres"interval: 30stimeout: 10sretries: 5volumes:- pgdata:/var/lib/postgresql/datanetworks:- mynetwork.comexplorer.mynetwork.com:image: hyperledger/explorer:latestcontainer_name: explorer.mynetwork.comhostname: explorer.mynetwork.comenvironment:- DATABASE_HOST=explorerdb.mynetwork.com- DATABASE_DATABASE=fabricexplorer- DATABASE_USERNAME=hppoc- DATABASE_PASSWD=password- LOG_LEVEL_APP=info- LOG_LEVEL_DB=info- LOG_LEVEL_CONSOLE=debug- LOG_CONSOLE_STDOUT=true- DISCOVERY_AS_LOCALHOST=false- PORT=${PORT:-8080}volumes:- ${EXPLORER_CONFIG_FILE_PATH}:/opt/explorer/app/platform/fabric/config.json- ${EXPLORER_PROFILE_DIR_PATH}:/opt/explorer/app/platform/fabric/connection-profile- ${FABRIC_CRYPTO_PATH}:/tmp/crypto- walletstore:/opt/explorer/walletports:- ${PORT:-8080}:${PORT:-8080}depends_on:explorerdb.mynetwork.com:condition: service_healthynetworks:- mynetwork.com

之后,将fixtures文件夹下的crypto-config文件夹复制到explorer文件夹,并将explorer文件夹中的crypto-config文件夹重命名为organizations。此时的目录结构应该是这样的。

docker-compose.yamlconfig.jsonconnection-profile/test-network.jsonorganizations/ordererOrganizations/organizations/peerOrganizations/

此处需要修改配置文件的内容,需要和区块链网络匹配,这样才能在启动的时候打开区块链浏览器,具体如下所示。

将test-network.json重命名为org1-network.json,并修改为以下内容。此处需要重点注意几个path字段是否能跟organizations文件夹里面的对应文件对上。此外,adminCredential字段指定了区块链浏览器的登录用户名和密码。

{"name": "org1-network","version": "1.0.0","client": {"tlsEnable": true,"adminCredential": {"id": "exploreradmin","password": "exploreradminpw"},"enableAuthentication": true,"organization": "Org1MSP","connection": {"timeout": {"peer": {"endorser": "300"},"orderer": "300"}}},"channels": {"mychannel": {"peers": {"peer0.org1.example.com": {}},"connection": {"timeout": {"peer": {"endorser": "6000","eventHub": "6000","eventReg": "6000"}}}}},"organizations": {"Org1MSP": {"mspid": "Org1MSP","adminPrivateKey": {"path": "/tmp/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/priv_sk"},"peers": ["peer0.org1.example.com"],"signedCert": {"path": "/tmp/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem"}}},"peers": {"peer0.org1.example.com": {"tlsCACerts": {"path": "/tmp/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt"},"url": "grpcs://peer0.org1.example.com:7051"}}}

将config.json修改为以下内容,要与connection-profile文件夹对应。

{"network-configs": {"org1-network": {"name": "org1-network","profile": "./connection-profile/org1-network.json"}},"license": "Apache-2.0"}

将docker-compose.yaml文件的内容修改为如下所示。此处需要指定网络名称与区块链网络的名称相同(我的为fixtures_test),并指定端口号。此外需要指定DISCOVERY_AS_LOCALHOST=false,以便禁止将主机名映射为localhost。

# SPDX-License-Identifier: Apache-2.0version: '2.1'volumes:pgdata:walletstore:networks:mynetwork.com:external:name: fixtures_testservices:explorerdb.mynetwork.com:image: hyperledger/explorer-db:latestcontainer_name: explorerdb.mynetwork.comhostname: explorerdb.mynetwork.comenvironment:- DATABASE_DATABASE=fabricexplorer- DATABASE_USERNAME=hppoc- DATABASE_PASSWORD=passwordhealthcheck:test: "pg_isready -h localhost -p 5432 -q -U postgres"interval: 30stimeout: 10sretries: 5volumes:- pgdata:/var/lib/postgresql/datanetworks:- mynetwork.comexplorer.mynetwork.com:image: hyperledger/explorer:latestcontainer_name: explorer.mynetwork.comhostname: explorer.mynetwork.comenvironment:- DATABASE_HOST=explorerdb.mynetwork.com- DATABASE_DATABASE=fabricexplorer- DATABASE_USERNAME=hppoc- DATABASE_PASSWD=password- LOG_LEVEL_APP=debug- LOG_LEVEL_DB=debug- LOG_LEVEL_CONSOLE=debug- LOG_CONSOLE_STDOUT=true- DISCOVERY_AS_LOCALHOST=falsevolumes:- ./config.json:/opt/explorer/app/platform/fabric/config.json- ./connection-profile:/opt/explorer/app/platform/fabric/connection-profile- ./organizations:/tmp/crypto- walletstore:/opt/explorer/walletports:- 8080:8080depends_on:explorerdb.mynetwork.com:condition: service_healthynetworks:- mynetwork.com

此时的目录结构如下所示。

具体的目录结构如下所示,此处使用tree -L 8命令。

.
├── config.json
├── connection-profile
│ └── org1-network.json
├── docker-compose.yaml
└── organizations
├── ordererOrganizations
│ └── example.com
│ ├── ca
│ │ ├── ca.example.com-cert.pem
│ │ └── priv_sk
│ ├── msp
│ │ ├── cacerts
│ │ │ └── ca.example.com-cert.pem
│ │ ├── config.yaml
│ │ └── tlscacerts
│ │ └── tlsca.example.com-cert.pem
│ ├── orderers
│ │ └── orderer.example.com
│ │ ├── msp
│ │ │ ├── cacerts
│ │ │ │ └── ca.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ │ └── priv_sk
│ │ │ ├── signcerts
│ │ │ │ └── orderer.example.com-cert.pem
│ │ │ └── tlscacerts
│ │ │ └── tlsca.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── server.crt
│ │ └── server.key
│ ├── tlsca
│ │ ├── priv_sk
│ │ └── tlsca.example.com-cert.pem
│ └── users
│ └── Admin@example.com
│ ├── msp
│ │ ├── cacerts
│ │ │ └── ca.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore
│ │ │ └── priv_sk
│ │ ├── signcerts
│ │ │ └── Admin@example.com-cert.pem
│ │ └── tlscacerts
│ │ └── tlsca.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
└── peerOrganizations
└── org1.example.com
├── ca
│ ├── ca.org1.example.com-cert.pem
│ └── priv_sk
├── msp
│ ├── cacerts
│ │ └── ca.org1.example.com-cert.pem
│ ├── config.yaml
│ └── tlscacerts
│ └── tlsca.org1.example.com-cert.pem
├── peers
│ ├── peer0.org1.example.com
│ │ ├── msp
│ │ │ ├── cacerts
│ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ │ └── priv_sk
│ │ │ ├── signcerts
│ │ │ │ └── peer0.org1.example.com-cert.pem
│ │ │ └── tlscacerts
│ │ │ └── tlsca.org1.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── server.crt
│ │ └── server.key
│ └── peer1.org1.example.com
│ ├── msp
│ │ ├── cacerts
│ │ │ └── ca.org1.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore
│ │ │ └── priv_sk
│ │ ├── signcerts
│ │ │ └── peer1.org1.example.com-cert.pem
│ │ └── tlscacerts
│ │ └── tlsca.org1.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── server.crt
│ └── server.key
├── tlsca
│ ├── priv_sk
│ └── tlsca.org1.example.com-cert.pem
└── users
├── Admin@org1.example.com
│ ├── msp
│ │ ├── cacerts
│ │ │ └── ca.org1.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore
│ │ │ └── priv_sk
│ │ ├── signcerts
│ │ │ └── Admin@org1.example.com-cert.pem
│ │ └── tlscacerts
│ │ └── tlsca.org1.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
└── User1@org1.example.com
├── msp
│ ├── cacerts
│ │ └── ca.org1.example.com-cert.pem
│ ├── config.yaml
│ ├── keystore
│ │ └── priv_sk
│ ├── signcerts
│ │ └── User1@org1.example.com-cert.pem
│ └── tlscacerts
│ └── tlsca.org1.example.com-cert.pem
└── tls
├── ca.crt
├── client.crt
└── client.key

62 directories, 65 files

在编写完配置文件之后,就可以启动区块链浏览器了。首先需要启动区块链网络,然后需要进入explorer文件夹,输入docker-compose up -d命令。

输入docker ps -a命令,可以看到已经启动的docker容器情况。如果hyperledger/explorer:latest容器出现Exited(1)的情况,则输入docker logs [对应的容器ID],查看错误情况(此处一般是配置文件没有和区块链网络对应)。

区块链浏览器启动后在浏览器输入localhost:8080,单击回车。此处,登录用户名为exploreradmin,密码为exploreradminpw。

登录之后可以查看区块链网络、区块和交易等信息。

若要关闭区块链浏览器,则还需要进入explorer文件夹,输入docker-compose down -v(此处-v不能去掉,因为删除持久化数据才能在下一次启动区块链浏览器时启动成功)命令。