第5章〓“区块链+物联网”应用之区块链网络环境搭建与管理 本章学习目标 (1) 掌握安装和配置虚拟化环境的能力,以便在其中创建和管理Ubuntu虚拟机。 (2) 学习如何在Ubuntu操作系统上安装系统工具以及编程语言环境。 (3) 理解并实践如何搭建Hyperledger Fabric环境。 (4) 学会测试区块链运行环境的方法。 (5) 掌握用户配置与管理的基础,能够设计并实践用户注册和授权机制。 视频讲解 5.1区块链网络环境搭建 在区块链网络环境搭建的过程中,读者首先需要准备基础的虚拟化环境,并在此基础上安装和配置Linux操作系统(如Ubuntu 22.04)。然后,读者需学习安装必需的系统工具,这些工具对于后续搭建Hyperledger Fabric环境至关重要。在成功安装所需工具后,读者将被指导通过一系列的命令来创建Hyperledger Fabric的工作环境,获取必要的源码,以及学会如何在本地搭建和测试一个基础的Fabric网络。 5.1.1准备基本环境 在开始进行区块链网络的搭建之前,首先需要准备基本的软件环境,包括虚拟机的安装以及操作系统的配置。 1. 安装VMware WorkStation 17 Pro虚拟机 虚拟机软件是一种能够在计算机硬件和操作系统之间提供抽象层的技术,它创建了一个模拟的计算环境,使得在同一台物理计算机上可以同时运行多个操作系统。这种技术极大地提升了计算资源的利用率,也为软件开发和测试提供了极大的便利。目前市场上存在多种虚拟机软件,如VirtualBox、VMware、Virtual PC等,每种软件都有其独特的特点和应用领域。本章将以VMware WorkStation 17 Pro为例,详细阐述其安装和配置过程,为读者提供一个规范的指导。 1) 下载安装包 访问VMware官网( www.vmware.com),下载VMware WorkStation 17 Pro版本的安装包,如图5.1所示。 图5.1VMware官网下载页面 2) 安装软件 启动下载的安装软件,按照提示同意官方的使用协议,选择软件的安装路径,如图5.2和图5.3所示。 图5.2启动安装软件的界面 图5.3选择虚拟机软件安装路径的界面 3) 安装过程 安装过程中,可按照默认选项进行,直到安装完成,如图5.4所示。 图5.4虚拟机软件安装完成界面 4) 软件激活及试用选项 在安装完成后,当用户第一次启动VMware Workstation 17 Pro时,系统会提示用户输入激活密钥来激活软件。用户需要在这个步骤中输入购买或获得的激活密钥。如果用户选择不输入激活密钥,他们通常会有一个试用期(例如30天)可以使用软件的全部功能。 通过以上步骤,我们已经成功安装了VMware WorkStation 17 Pro虚拟机,为后续操作系统的安装提供了环境。启动后的虚拟机软件界面如图5.5所示。 图5.5启动后的虚拟机软件界面 2. 安装Ubuntu 22.04操作系统 虚拟机安装后,选择安装Ubuntu 22.04桌面版操作系统,为区块链网络的搭建提供稳定的运行环境。 1) 下载镜像文件 下载Ubuntu 22.04桌面版ISO镜像文件( https://releases.ubuntu.com/22.04/ubuntu22.04.1desktopamd64.iso),如图5.6所示。 图5.6Ubuntu桌面系统镜像下载页面 2) 创建虚拟机 启动VMware WorkStation,创建一个新的虚拟机,并选择Linux作为操作系统类型,版本选择Ubuntu,如图5.7所示。 图5.7创建虚拟机界面 3) 设置安装路径 默认安装路径为C盘,可以自定义安装路径,如图5.8所示。 图5.8设置虚拟机安装位置界面 4) 配置虚拟机 建议设置内存大小不小于4GB,磁盘大小不小于50GB,以确保系统运行流畅。其他配置可使用默认推荐,如图5.9所示。 图5.9虚拟机配置界面 5) 加载操作系统镜像 在“虚拟机设置”中,加载步骤1)中下载的Ubuntu ISO镜像文件,如图5.10所示。 图5.10加载操作系统镜像文件界面 6) 启动虚拟机 启动虚拟机,进入操作系统配置界面,按照提示完成系统的配置,如图5.11和图5.12所示。 图5.11启动虚拟机界面 图5.12操作系统配置界面 7) 安装操作系统 配置完成后,选择“安装Ubuntu”进行操作系统的安装。在安装过程中,会联网下载所需文件,如图5.13所示。 图5.13虚拟机系统安装界面 8) 启动Ubuntu操作系统 操作系统安装成功后重启系统,即可完成Ubuntu操作系统的安装,重启并成功登录后,将看到Ubuntu 22.04的系统桌面,如图5.14所示。 图5.14Ubuntu 22.04系统桌面 通过以上步骤,我们已经在虚拟机中成功安装并配置了Ubuntu 22.04操作系统,为区块链网络的搭建提供了基本的运行环境。 5.1.2系统工具安装 在进行区块链技术研究与开发的过程中,特别是在搭建Hyperledger Fabric的开发环境时,一系列系统工具的安装变得尤为重要。这些工具不仅为Hyperledger Fabric项目的正确安装提供了基础支持,也确保了其在后续的运行过程中的稳定性与效率。下面将详细介绍这些必要的工具,并解释其在Hyperledger Fabric开发环境中的作用。 1. Git Git是一种分布式版本控制系统,用于跟踪项目中文件的变化,并协助多个开发者之间的协作。其设计目标是提高效率和可靠性,它允许开发者在各自的工作站上独立进行开发,同时确保代码历史的完整性和一致性。在Hyperledger Fabric的开发环境搭建过程中,Git用于从官方仓库中获取必要的代码和文档。 1) 安装Git 打开系统的终端界面,输入以下命令并执行,以在Ubuntu系统中安装Git: 1.sudo apt install git 首次使用sudo命令时,需要用户输入系统密码来确认安装操作。 2) 对Git进行版本验证 安装完成后,输入以下命令并执行,以验证Git的安装并查看其版本,如图5.15所示。 1.git --version 图5.15安装并查看Git版本信息 2. cURL cURL(Client for URLs)是一种广泛使用的命令行工具,它支持多种协议,包括HTTP、HTTPS、FTP和SCP,用于在网络上传输数据。其功能强大,可用于发出各种网络请求,并查看或下载结果。在Hyperledger Fabric的应用场景中,cURL通常用于与区块链网络中的节点进行交互,执行如提交交易、查询账本等操作。 1) 安装cURL 在终端输入以下命令并执行,以安装cURL: 1.sudo apt install curl 2) 查看cURL的版本信息 安装完成后,输入以下命令并执行,查看cURL的版本信息,如图5.16所示。 1.curl --version 图5.16安装并查看cURL版本信息 3. Docker和DockerCompose Docker是一个开源的应用容器引擎,它允许开发者将应用及其依赖项封装在一个轻量级的、可移植的容器中。这个容器可以在任何安装了Docker的系统上运行,提供了一种简单高效的应用分发和部署方式。在Hyperledger Fabric的开发环境中,Docker用于创建一个稳定且隔离的运行环境,极大地简化了网络组件的部署和测试过程。 1) 安装Docker 在终端输入以下命令并执行,以安装Docker: 1.sudo apt install docker.io 2) 查看Docker的版本信息 安装完成后,输入以下命令并执行,查看Docker的版本信息,如图5.17所示。确保终端中显示了 Docker 的版本信息,并记下版本号以供未来参考。 1.docker --version 图5.17安装并查看Docker版本信息 DockerCompose 是一个用于定义和管理多容器 Docker 应用程序的工具。它允许开发者通过 YAML 文件来配置应用服务的所有属性,包括服务、网络和卷等。在 Hyperledger Fabric的开发环境中,DockerCompose 起着关键作用,用于编排和管理网络中的各种组件,如 Peer 节点、Orderer 节点和 CA 服务器等,确保这些组件能够以正确的配置和顺序启动并协同工作。 1) 安装DockerCompose 在终端输入以下命令并执行,以安装DockerCompose: 1.sudo apt install docker-compose 2) 查看DockerCompose的版本信息 1.docker-compose --version 安装完成后,输入以下命令并执行,查看DockerCompose的版本信息,如图5.18所示。确保终端中显示了DockerCompose的版本信息,并记下版本号以供未来参考。 图5.18安装并查看DockerCompose版本信息 4. Go语言 Go又称为 Golang,是一种开源的编程语言,由 Google 设计并开发。其设计初衷是提高编程效率,支持并发编程,使程序员能够更方便地编写高效且稳定的代码。在 Hyperledger Fabric 中,大多数组件都是用 Go 语言编写的,这就要求开发者在构建和运行Hyperledger Fabric代码时必须在其开发环境中安装 Go。本节将指导读者如何在其系统中安装和配置 Go 语言环境,并确保其能够正确运行。 1) Go语言的安装 为了保证区块链网络的稳定运行,建议安装 Go 语言的 1.18 版本。 首先,在终端输入以下命令并执行,下载 Go 1.18 的安装包,如图5.19所示。 1.sudo wget https://studygolang.com/dl/golang/go1.18.linux-amd64.tar.gz 图5.19下载Go安装包 输入以下命令,解压安装包到指定目录(/usr/local),即完成了Go语言的安装。 1.sudo tar -C /usr/local -xzf go1.18.linux-amd64.tar.gz 2) 配置环境变量 在终端输入以下命令,打开profile文件进行编辑: 1.sudo gedit/etc/profile 在文件的末尾添加以下内容,以配置Go环境变量,如图5.20所示。 1.export GOROOT=/usr/local/go 2.export GOPATH=$HOME/go 3.export PATH=$PATH:$GOROOT/bin:$GOPATH/bin 图5.20配置Go环境变量 保存并关闭编辑器,输入以下命令,使环境变量配置立即生效: 1.source/etc/profile 3) 验证Go语言的安装 在终端中输入以下命令,查看Go语言版本。如果成功输出了Go语言的版本信息,则表明Go语言已经成功安装,如图5.21所示。 1.go version 图5.21查看Go语言版本 5. Node.js和NPM Node.js 是一个开源、跨平台的 JavaScript 运行时环境,它允许服务器端和网络应用的开发,而 NPM(Node Package Manager)是 Node.js 的包管理工具,用于管理项目中的依赖关系。在Hyperledger Fabric的开发过程中,Node.js 和 NPM 通常用于开发链码(Chaincode,运行在区块链网络中的智能合约)和客户端应用程序。 Fabric官方提供了Node.js智能合约示例,NPM是随同Node.js一起安装的包管理工具,用于解决Node.js代码部署。 1) 安装Node.js和NPM 在终端中输入并执行如下命令,进行Node.js和NPM的安装,如图5.22所示。 1.sudo apt-get install npm 图5.22Node.js与NPM的安装 图5.23查看Node.js与NPM 的版本信息 2) 验证Node.js和NPM的安装 在终端中输入并执行如下命令,查看 Node.js与NPM的版本信息,如图5.23所示。 1.npm version 5.1.3搭建Hyperledger Fabric环境 1) 创建工作目录 打开系统的终端界面,输入并执行如下命令,创建Fabric所在目录并进入该目录。 1.mkdir -p go/src/github.com/Hyperledger 2.cd go/src/github.com/Hyperledger 2) 获取 Hyperledger Fabric 源码 在终端中输入并执行如下命令,从GitHub上下载Fabric源码。 1.git clone https://github.com/hyperledger/fabric.git 3) 切换至指定版本 在终端中输入并执行如下命令,查看所有可用的标签并切换到指定版本(本示例中为 2.2.0)。 1.cd fabric && git tag -l 2.git checkout v2.2.0 4) 拉取Fabric镜像 在终端中输入并执行如下命令,执行脚本拉取所需的 Docker 镜像。 1.cd scripts && sudo ./bootstrap.sh 5) 查看镜像列表 镜像拉取完成后,在终端中输入并执行如下命令,查看拉取的镜像列表,如图5.24所示。 1.sudo docker images 图5.24显示拉取的镜像列表 执行完以上步骤后,Fabric 运行环境的安装基本就完成了。为了验证 Fabric 网络是否成功搭建,接下来将运行 Fabric 自带的测试网络。 5.1.4测试区块链运行环境 区块链运行环境安装完成后,可以通过运行Fabric自带的测试网络,进行区块链运行环境的测试,以确保区块链系统正常运行。 1) 启动测试网络 在终端中输入以下命令,以启动Fabric的网络测试: 1.cd ./fabric-samples/test-network 2../network.sh up 如果一切正常,Fabric测试网络将正确启动,如图5.25所示。 图5.25Fabric测试网络正确启动的结果 2) 节点加入通道 在终端中输入以下命令,将已创建的peer节点加入通道: 1../network.sh createChannel 节点正确加入通道后,结果如图5.26所示。 图5.26节点正确加入通道后的结果 3) 安装和部署智能合约 在终端中输入以下命令,将示例智能合约部署到创建的Fabric区块链网络中: 1../network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go 智能合约正确部署后,结果如图5.27所示。 图5.27智能合约正确部署的结果 4) 初始化Fabric账本 在与Fabric测试网络交互前,需要在testnetwork目录下执行以下命令配置环境变量: 1.export PATH=${PWD}/../bin:$PATH 2.export FABRIC_CFG_PATH=$PWD/../config/ 3.export CORE_PEER_TLS_ENABLED=true 4.export CORE_PEER_LOCALMSPID="Org1MSP" 5.export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt 6.export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp 7.export CORE_PEER_ADDRESS=localhost:7051 然后,在终端中输入以下命令,初始化Fabric账本: 1.peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}' 账本正确初始化后,结果如图5.28所示。 图5.28账本正确初始化的结果 5) 调用智能合约 在终端中输入以下命令,实现调用已部署的智能合约并查看调用结果: 1.peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}' 2.peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}' 智能合约正确调用后,运行结果如图5.29所示。 图5.29智能合约调用运行结果 6) 关闭测试网络 如果测试完成,可以通过以下命令关闭测试网络: 1../network.sh down 网络正确关闭后,结果如图5.30所示。 图5.30网络关闭运行结果 视频讲解 5.2用户配置与管理 用户配置与管理是“区块链+物联网”应用的关键组成部分,涉及用户身份的认证与授权。本节将介绍如何设计和实现一个用户注册系统,该系统能够识别并验证用户身份,同时管理用户的访问权限。我们将提供具体的代码实例,以指导读者实现用户注册信息的加密签名、验证。此外,本节还将讨论用户授权的机制,包括为已注册的用户分配和管理权限。 5.2.1用户注册 在“区块链+物联网”应用中,用户需要在使用应用之前进行注册,以获取用户账号。用户账号在应用中扮演着身份标识的角色,具有用户身份识别和验证的功能。以下是有关用户注册的详细说明。 1. 设计用户注册信息 用户注册信息是在用户注册时所需提供的数据。这些信息用于验证用户身份、管理用户权限以及记录用户操作。如表5.1所示,典型的用户注册信息包括身份证号(ID)和用户角色(Role)等字段。身份证号用于唯一标识用户,而用户角色通常分为管理员和普通用户,管理员具有更高的权限,可以为普通用户授权执行特定操作。具体注册信息需要根据应用的实际需求设置。 表5.1用户注册信息 字段 含义 UserName 用户名 Password 密码 Name 姓名 ID 身份证号 Phone 手机号码 Email 电子邮箱 Role 用户角色 2. 实践用户注册 在本节中,我们将详细讲解用户注册智能合约的代码示例,合约中主要包括用户注册信息的签名、验证、上链、获取以及其他相关辅助代码。 1) 用户注册信息签名 首先,构造用户注册前的待签名数据结构,将其序列化为JSON格式字符串,并使用SHA256算法计算哈希摘要,最后使用用户注册私钥对哈希摘要进行签名并保存签名结果。 1.func UserInfoSign(user User) error { 2.// 构造用户注册信息 3.userForSign := User{ 4.UserName: user.UserName, 5.Password: user.Password, 6.Name: user.Name, 7.ID: user.ID, 8.Phone: user.Phone, 9.Email: user.Email, 10.Role: user.Role, 11.} 12.// 序列化用户信息 13.userForSignJSON, err := json.Marshal(userForSign) 14.if err != nil { 15.return err 16.} 17. 18.// 计算哈希摘要 19.hashText := sha256.New() 20.hashText.Write(userForSignJSON) 21. 22.// 加载私钥, LoadpriKey()的代码详见4.1.3 23.if err = LoadpriKey(); err != nil { 24.return err 25.} 26. 27.// 签名数据 28.r, s, err := ecdsa.Sign(randSign.Reader, PriKey, hashText.Sum(nil)) 29.if err != nil { 30.log.Println(err) 31.} 32.userSign["r"], userSign["s"] = r, s 33.return nil 34.} 2) 用户注册信息验证 首先,构造用户注册前的待签名数据结构,使用SHA256算法计算序列化后的用户注册信息JSON字符串的哈希摘要,然后使用注册用户的公钥验证用户数字签名。如果验证通过,则返回true,否则返回false。 1.func VerifyUserSign(user User) bool { 2.// 构造用户注册信息 3.userInfo := User{ 4.UserName: user.UserName, 5.Password: user.Password, 6.Name: user.Name, 7.ID: user.ID, 8.Phone: user.Phone, 9.Email: user.Email, 10.Role: user.Role, 11.} 12.// 序列化用户信息 13.userInfoJSON, err := json.Marshal(userInfo) 14.if err != nil { 15.return false 16.} 17. 18.// 计算哈希摘要 19.hashText := sha256.New() 20.hashText.Write(userInfoJSON) 21. 22.// 使用公钥验证签名 23.if !ecdsa.Verify(userInfo.PubKey, hashText.Sum(nil), userInfo.Sign["r"], userInfo.Sign["s"]) { 24.return false 25.} 26.return true 27.} 3) 用户注册信息上链 首先,获取用户上传的注册信息,构建用户注册信息结构体,进行用户注册信息签名并将其保存在用户注册信息结构体中。最后,将用户注册信息结构体序列化后上链存证。 1.func (s *SmartContract) UserRegister(ctx contractapi.TransactionContextInterface, userName string, password string, name string, id string, phone string, email string, role string) error { 2.// 加载公钥PubKey,LoadpubKey()的代码详见4.1.3节 3.if err := LoadpubKey(); err != nil { 4.return err 5.} 6.// 构建用户注册信息结构体 7.user := User{ 8.UserName: userName, 9.Password: password, 10.Name: name, 11.ID: id, 12.Phone: phone, 13.Email: email, 14.Role: role, 15.PubKey: PubKey, 16.} 17.// 用户信息签名 18.if err := UserInfoSign(user); err != nil { 19.return err 20.} 21. 22.// 将用户信息序列化 23.user.Sign = userSign 24.userJSON, err := json.Marshal(user) 25.if err != nil { 26.return err 27.} 28.// 用户注册信息上链 29.if err != ctx.GetStub().PutState(id, userJSON); err != nil { 30.return err 31.} 32.return nil 33.} 4) 用户注册信息获取 首先,使用用户ID从链上获取用户注册信息,验证用户注册信息的数字签名是否有效。如果验证通过,则返回序列化后的用户注册信息JSON对象,否则返回错误信息。 1.func (s *SmartContract) GetUser(ctx contractapi.TransactionContextInterface, id string) (*User, error) { 2.userJSON, err := ctx.GetStub().GetState(id) 3.if err != nil { 4.return nil, err 5.} 6.if userJSON == nil { 7.return nil, fmt.Errorf("未找到ID为%s的用户", id) 8.} 9. 10.var user User 11.if err = json.Unmarshal(userJSON, &user); err != nil { 12.return nil, err 13.} 14.// 验证用户签名 15.if !VerifyUserSign(user) { 16.return nil, err 17.} 18.return &user, fmt.Errorf("用户签名验证失败") 19.} 5) 相关辅助代码 除了上述主要功能代码,用户注册智能合约还包括通用的ECDSA数字签名功能代码以及用户注册信息结构体等相关辅助代码。 1.var userSign map[string]*big.Int 2.type User struct { 3.UserName string `json:"UserName"` 4.Password string `json:"Password"` 5.Name string `json:"Name"` 6.ID string `json:"ID"` 7.Phone string `json:"Phone"` 8.Email string `json:"Email"` 9.Role string `json:"Role"` 10.Sign map[string]*big.Int `json:"Sign"` 11.PubKey *ecdsa.PublicKey `json:"PubKey"` 12.} 5.2.2用户授权 用户授权是在用户注册通过后的步骤,它用于控制用户对数据和操作的访问。在“区块链+物联网”应用中,用户初始角色通常为普通用户,其权限较低,需要管理员进行授权才能执行一些操作,如设备注册、设备更改等。 1. 设计用户授权信息 用户注册后的默认角色为普通用户,权限较低,无法执行设备注册、设备删除等操作,此时需要管理员为其授予相应权限。如表5.2所示,典型的用户授权信息主要包括授权类型(Type)、授权开始时间(StartTime)和授权结束时间(EndTime)等内容。 表5.2用户授权信息 字段 含义 UserName 用户名 StartTime 授权开始时间 EndTime 授权结束时间 Type 授权类型 在用户授权操作中,这些信息用于验证和控制用户的权限,以确保数据和操作的安全性,还可以利用这些信息对授权进行追溯和查证,便于监管。表5.2中关键字段说明如下: (1) 授权类型: 用户可以对设备执行的操作,包括设备注册、设备更改和设备删除三种。在用户操作设备时,用于用户的权限验证。 (2) 授权开始时间: 用户获得授权的开始时间,在该时间之后用户可以执行已授权操作,使用中国标准时间格式(CST),如“20230130 11:24:15”。 (3) 授权结束时间: 用户授权的到期时间,在该时间之后用户无法执行授权过期操作,使用中国标准时间格式(CST),表示用户权限的到期时间,如“20231231 11:24:15”。 2. 实践用户授权 用户授权智能合约与用户注册智能合约类似,包括用户授权信息的签名、验证、上链、获取以及其他相关辅助代码。 1) 用户授权信息签名和验证 用户由管理员进行授权,因此在签名时需要使用管理员私钥,而在验证时需要使用用户注册智能合约中的GetUser()方法获取管理员的公钥来验证数字签名。 1.// 用户授权信息签名 2.func UserAuthSign(userAuth UserAuth) error { 3.userAuthForSign := UserAuth{ 4.UserName: userAuth.UserName, 5.StartTime: userAuth.StartTime, 6.EndTime: userAuth.EndTime, 7.Type: userAuth.Type, 8.} 9. 10.userAuthForSignJSON, err := json.Marshal(userAuthForSign) 11.if err != nil { 12.return err 13.} 14.hashText := sha256.New() 15.hashText.Write(userAuthForSignJSON) 16.// 加载管理员私钥并签名 17.if err = LoadpriKey(); err != nil { 18.return err 19.} 20.r, s, err := ecdsa.Sign(strings.NewReader(randSign), PriKey, hashText.Sum(nil)) 21.if err != nil { 22.log.Println(err) 23.} 24.userAuthSign["r"], userAuthSign["s"] = r, s 25.return nil 26.} 27.// 用户授权信息验证 28.func VerifyUserAuthSign(userAuth UserAuth) bool { 29.userAuthForSign := UserAuth{ 30.UserName: userAuth.UserName, 31.StartTime: userAuth.StartTime, 32.EndTime: userAuth.EndTime, 33.Type: userAuth.Type, 34.} 35. 36.userInfoJSON, err := json.Marshal(userAuthForSign) 37.if err != nil { 38.return false 39.} 40.hashText := sha256.New() 41.hashText.Write(userInfoJSON) 42.// 使用管理员公钥验证数字签名 43.if !ecdsa.Verify(userAdmin.PubKey, hashText.Sum(nil), userAuth.Sign["r"], userAuth.Sign["s"]) { 44.return false 45.} 46.return true 47.} 2) 用户授权信息上链和获取 用户授权信息上链和获取的代码与用户注册智能合约相似。 1.// 用户授权信息上链 2.func (s *SmartContract) UserAuthorise(ctx contractapi.TransactionContextInterface, userName string, startTime string, endTime string, type_ string) error { 3.userAuth := UserAuth{ 4.UserName: userName, 5.StartTime: startTime, 6.EndTime: endTime, 7.Type: type_, 8.PubKey: PubKey, 9.} 10. 11.if err := UserAuthSign(userAuth); err != nil { 12.return err 13.} 14.userAuth.Sign = userAuthSign 15.userAuthJSON, err := json.Marshal(userAuth) 16.if err != nil { 17.return err 18.} 19.return ctx.GetStub().PutState(userName, userAuthJSON) 20.} 21.// 用户授权信息获取 22.func (s *SmartContract) GetUserAuth(ctx contractapi.TransactionContextInterface, userName string) (*UserAuth, error) { 23.userAuthJSON, err := ctx.GetStub().GetState(userName) 24.if err != nil { 25.return nil, err 26.} 27.if userAuthJSON == nil { 28.return nil, err 29.} 30. 31.var userAuth UserAuth 32.if err = json.Unmarshal(userAuthJSON, &userAuth); err != nil { 33.return nil, err 34.} 35.// 获取管理员注册信息 36.userAdmin, _ = s.GetUser(ctx, "【admin ID】") 37.if !VerifyUserAuthSign(userAuth) { 38.return nil, err 39.} 40.return &userAuth, nil 41.} 3) 相关辅助代码 用户授权智能合约需要与用户注册智能合约一起使用,除了主要功能代码外,还包括用户授权信息结构体等相关辅助代码。 1.var userAuthSign map[string]*big.Int 2.var userAdmin *User 3. 4.type UserAuth struct { 5.UserName string `json:"UserName"` 6.StartTime string `json:"StartTime"` 7.EndTime string `json:"EndTime"` 8.Type string `json:"Type"` 9.Sign map[string]*big.Int `json:"Sign"` 10.PubKey *ecdsa.PublicKey `json:"PubKey"` 11.} 通过这些实践代码,用户可以进行注册和授权的操作,确保应用能够识别和验证用户身份,并进行权限管理,以满足“区块链+物联网”应用的需求。这些代码将帮助读者更深入地理解用户配置与管理的关键概念。 5.3本章小结 本章详细讨论了在“区块链+物联网”应用场景中搭建和管理Fabric区块链网络的步骤和方法。从准备虚拟化环境和操作系统安装,到具体的区块链环境配置,本章提供了全面的指导。同时,本章强调了用户注册和授权流程的重要性,为读者提供了实现这些流程的具体代码,旨在确保网络的有效运行和数据的安全性。读者应当通过实际操作,不仅理解理论知识,而且掌握实践技能,以确保能够在“区块链+物联网”应用开发中有效地应用本章内容。 习题5 一、 单项选择题 1. 区块链网络搭建的第一步是安装()。 A. VMware WorkStation 17 Pro虚拟机 B. Ubuntu 22.04操作系统 C. Docker和DockerCompose D. Git 2. 下列哪个不是系统工具安装中的一项?() A. GitB. cURLC. DockerD. Adobe Reader 3. 下列哪种工具用于版本控制和协作开发?() A. cURLB. GoC. GitD. Docker 4. 下列哪个不是Hyperledger Fabric环境搭建的步骤?() A. 创建工作目录B. 获取Hyperledger Fabric源码 C. 安装Photoshop软件D. 拉取Fabric镜像 5. 用户注册和授权对“区块链+物联网”应用的作用是()。 A. 加强网络连接B. 提高虚拟机性能 C. 增加网络带宽D. 管理用户权限和记录操作 6. 用户注册智能合约中,使用哪种算法计算哈希摘要?() A. RSAB. SHA256C. MD5D. AES 7. 节点加入通道的主要目的是()。 A. 安装和部署智能合约B. 初始化Fabric账本 C. 启动测试网络D. 扩展网络的参与者 8. 为什么在区块链网络搭建过程中需要安装Docker和DockerCompose?() A. 用于创建虚拟机B. 用于容器化部署区块链组件 C. 用于操作系统的管理D. 用于注册用户 9. 用户注册信息中通常不包含哪个字段?() A. 身份证号(ID)B. 用户角色(Role) C. 银行账户信息D. 用户名 10. 关闭测试网络的主要目的是()。 A. 增加网络的可用性B. 提高系统性能 C. 进行维护和管理D. 初始化区块链账本 11. 在“区块链+物联网”应用中,为什么用户注册是关键?() A. 用于细粒度的用户授权B. 用于创建智能合约 C. 用于加强网络连接D. 用于设置区块链节点 12. 用户授权的作用是()。 A. 识别和验证用户身份B. 加强网络连接 C. 部署智能合约D. 控制用户对数据和操作的访问权限 13. 在“区块链+物联网”应用中,通常情况下,用户在初始角色下具有什么权限?() A. 最高权限B. 普通用户权限C. 管理员权限D. 设备注册权限 14. 用户授权的有效性通过什么来验证?() A. 用户的姓名B. 用户的生日C. 数字签名D. 用户密码 15. 在用户授权信息中,Type字段代表什么?() A. 用户的密码强度B. 授权类型 C. 用户的年龄D. 用户注册的时间 二、 简答题 1. 请描述区块链网络搭建的基本步骤。 2. 为什么在区块链网络搭建过程中需要安装Docker和DockerCompose? 3. 简述Hyperledger Fabric搭建环境中“创建工作目录”的目的。 4. 节点加入通道的目的是什么?它在区块链网络中有何作用? 5. 描述Hyperledger Fabric中“节点加入通道”的基本步骤。 6. 如何关闭测试网络以便维护和管理区块链环境? 7. 为什么用户注册和授权对“区块链+物联网”应用至关重要? 8. 解释为什么在用户注册时需要对信息进行哈希处理? 9. 怎样通过Hyperledger Fabric SDK调用智能合约的功能? 10. 描述用户注册智能合约中“用户注册信息签名”的作用。 三、 编程实践 1. 编写一个简单的伪代码,展示在Hyperledger Fabric中如何注册一个新用户。 2. 请根据本章已有的内容,设计一个权限审核与审计智能合约,定期审查用户的权限,更新用户的权限,确保授权策略保持最新并与应用的需求一致。请使用Go语言完成该编程任务,示例代码中需要有适当的注释。