Análisis de cuatro palabras: tutorial práctico de implementación de blockchain hyperledger fabric2.2

I. Introducción

Este tutorial se ejecuta en la versión ubuntu20. Implemente el entorno ubuntu20 antes de realizar la operación. Todas las implementaciones se llevan a cabo de acuerdo con el documento oficial hyperledger fabric . También explicaré los problemas encontrados durante la operación. Si no sabe mucho , primero consulte el concepto de blockchain. Si hay algo mal en la comprensión, critíquelo y corríjalo.

2. Introducción a la estructura de hiperlibro

Hyperledger Fabric es uno de los proyectos de blockchain en Hyperledger (Super Book) y una de las clásicas cadenas de consorcios. Tiene un libro mayor, que utiliza contratos inteligentes, un sistema en el que los participantes gestionan las transacciones, pero no está completamente descentralizado, es decir, los miembros que deseen unirse al consorcio deben registrarse con un proveedor de servicios de membresía (MSP) de confianza. Los siguientes son una introducción a algunos conceptos relacionados.

sustantivo explique
activos Datos registrados, generalmente en formato json que representan una colección de pares clave-valor
código de cadena Lógica comercial, es decir, contratos inteligentes, definir y modificar instrucciones de transacción
activos Datos registrados, generalmente en formato json que representan una colección de pares clave-valor
Características del libro mayor Funciones como consultas basadas en claves, basadas en rangos y compuestas
privacidad Se crean canales que están aislados entre sí y, si bien permiten compartir la infraestructura de red entre organizaciones, también se pueden privatizar.
Seguridad y Servicios para Miembros Todos los miembros son abiertos y pueden operar y administrar datos en una gama más amplia de redes y canales.
consenso Desde la propuesta y el respaldo hasta la clasificación, la verificación y la presentación, existe una verificación de consenso para garantizar que las transacciones lleguen a un consenso y evitar el doble gasto.
red de cadena de bloques Infraestructura técnica para registro de aplicaciones y contratos inteligentes (código de cadena)

La siguiente figura muestra la estructura de Fabric:
inserte la descripción de la imagen aquí
La siguiente figura muestra la estructura de Hyperledger Fabric. Para más detalles, consulte Blockchain Network :
inserte la descripción de la imagen aquí

3. Ejemplo de red de prueba

3.1 Crear un entorno de desarrollo

1. Instalar git

sudo apt-get install git

2. Instalar rizo

sudo apt-get install curl

3. Instalar ventana acoplable

# 安装并检查版本
sudo apt-get -y install docker-compose
docker --version
docker-compose --version
# 提示,以后只要碰到docker有关的错误,先执行2.3.1步骤
#1.重启docker
sudo systemctl start docker
#设置系统启动时docker启动,可选
sudo systemctl enable docker
#2.将用户添加到docker组,确保在用户命令下可以执行
sudo gpasswd -a $USER docker
#3.更新用户组
newgrp docker   
# docker信息
docker info
# 测试docker,若报错详见文末附加问题1
docker run hello-world 

4. Instalar ir

Instalar y extraer:

mkdir ~/download
cd ~/download
# 下载
wget https://studygolang.com/dl/golang/go1.13.linux-amd64.tar.gz
# 解压
sudo tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz

Cree el directorio go y configure el entorno:

mkdir $HOME/go
#用vi打开~./bashrc,配置环境变量
vi ~/.bashrc
# 在最下方插入
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
#使配置的环境变量生效
source ~/.bashrc
#检查是否配置正确
go version
# 配置goproxy环境变量加速国内下载
go env -w  GOPROXY=https://goproxy.io

3.2 Ejemplos de instalación, binarios e imágenes de Docker

1. Clonar hyperledger/fabric-samplesel repositorio

mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
# 获取fabric-samples源码
git clone https://github.com/hyperledger/fabric-samples.git

2. Seleccione la etiqueta de versión adecuada, ingrese el directorio y cambie de sucursal

cd fabric-samples
# 可自行选择版本
git checkout release-2.2
#查看版本
git branch

inserte la descripción de la imagen aquí
3. Instale los binarios específicos de la plataforma Hyperledger Fabric y los archivos de configuración de la versión especificada en /binlos /configdirectorios y en fabric-samples, y descargue la imagen acoplable de Hyperledger Fabric de la versión especificada.
Primero configure la fuente de la imagen:

sudo vi /etc/docker/daemon.json
#把以下代码加进去
{
    
    
"registry-mirrors":["https://registry.docker-cn.com"]
}
#如果你想要最新的生产发布版本,忽略所有的版本标识符。
# curl -sSL https://bit.ly/2ysbOFE | bash -s
# curl -sSL https://bit.ly/2ysbOFE | bash -s -- <fabric_version> <fabric-ca_version> <thirdparty_version>
# 若报错详见文末附加问题2
curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.2.0 1.4.7 0.4.18
# 若不行试试下面这个
curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s  2.2.0 1.4.7 0.4.18

¡Pruébelo varias veces y tendrá éxito!
inserte la descripción de la imagen aquí
Podemos ver que todas las descargas están completas
inserte la descripción de la imagen aquí

cd chaincode-go
sudo vi go.mod
# 进入文件发现是1.14 自己把改成1.13 ,要与你下载的go版本匹配

inserte la descripción de la imagen aquí

Configuración de variables de entorno

vi ~/.bashrc
# 添加下面的变量
export PATH=$PATH:$GOPATH/src/github.com/hyperledger/fabric-samples/bin
# 使之生效
source ~/.bashrc
# 检验成功否
fabric-ca-client version

inserte la descripción de la imagen aquí

3.3 Usar Fabric para probar la red

Recordatorio: Cuando vea esto, significa que su entorno ha sido implementado. A continuación, debe usar la red de prueba. Cabe señalar que la operación debe realizarse en un período de tiempo completo. No realice las siguientes operaciones de forma intermitente. , de lo contrario, puede haber muchos problemas que son difíciles de resolver para los novatos.

Más importante aún,
active el modo de depuración cuando encuentre problemas.
¡Activa el modo de depuración!
¡Activa el modo de depuración!

export FABRIC_LOGGING_SPEC=debug

1. Inicie la red de prueba
e ingrese fabric-samplesla siguiente test-network
para analizar el script network.sh

# 脚本有500多行,在这讲解脚本里的一些方法
function clearContainers()# 清除容器
function removeUnwantedImages() # 清除不想要的镜像
# 大家仔细看看都能读懂,下面挑几个关键且常用的讲
#创建组织
function createOrgs() {
    
    
# 这里包含一些业务逻辑比如
# Create crypto material using cryptogen or Fabric CA
if [ "$CRYPTO" == "cryptogen" ];then...
if [ "$CRYPTO" == "Certificate Authorities" ]; then..
}
# 创建联盟
function createConsortium()
# 开启网络
function networkUp()
# 创建channel
function createChannel()
# 开启链码
function deployCC()
# 最后给出了一些确定操作模式并打印出我们所要求的内容
if [ "$MODE" == "up" ]; then
  infoln "Starting nodes with CLI timeout of '${MAX_RETRY}' tries and CLI delay of '${CLI_DELAY}' seconds and using database '${DATABASE}' ${CRYPTO_MODE}"
elif [ "$MODE" == "createChannel" ]; then
  infoln "Creating channel '${CHANNEL_NAME}'."
  infoln "If network is not up, starting nodes with CLI timeout of '${MAX_RETRY}' tries and CLI delay of '${CLI_DELAY}' seconds and using database '${DATABASE} ${CRYPTO_MODE}"
elif [ "$MODE" == "down" ]; then
  infoln "Stopping network"
elif [ "$MODE" == "restart" ]; then
  infoln "Restarting network"
elif [ "$MODE" == "deployCC" ]; then
  infoln "deploying chaincode on channel '${CHANNEL_NAME}'"
else
  printHelp
  exit 1
fi

if [ "${MODE}" == "up" ]; then
  networkUp
elif [ "${MODE}" == "createChannel" ]; then
  createChannel
elif [ "${MODE}" == "deployCC" ]; then
  deployCC
elif [ "${MODE}" == "down" ]; then
  networkDown
else
  printHelp
  exit 1
fi 

Ejecute el siguiente comando para ejecutar el scriptnetwork.sh

./network.sh up

Después de la ejecución, podemos ver que hemos creado la organización ordenante, el nodo peer0 del miembro de la alianza org1, el nodo peer0 del miembro de la alianza org2 y la imagen reflejada correspondiente.
inserte la descripción de la imagen aquí
2. Se
ejecutan los componentes de la red de prueba. docker ps -a
Puede ver los tres nodos creados y todas las organizaciones que son miembros de la
inserte la descripción de la imagen aquí
red Fabric de hello-world probada anteriormente se denominan alianzas. Esta red de prueba tiene dos miembros de alianza org1 y 2, y uno mantiene el servicio de pedidos de la red.. El encargado de la organización, cada organización opera un nodo par, peer0.org1.example.com y peer0.org2.example.com.
El nodo par es el componente básico de la red fabric. El nodo par más común es el nodo de aprobación. El nodo par almacena el libro mayor de la cadena de bloques para su verificación antes de las transacciones.
La red de ejemplo usa un servicio de pedidos Raft de un solo nodo, las versiones anteriores tenían el modo solo y el modo kafka, esta prueba solo usa un servicio de pedidos de un solo nodo, pero una red real tendrá múltiples nodos de pedidos, organizados por uno o más pedidos.

3. Crea un canal

Hay varias formas de crear un ./network.sh createChannelcanal entre org1 y org2 y unirse a sus pares usando:

# 1.不输入自定义名称通道,默认为mychannel
./network.sh createChannel
# 2.输入自定义名称,可以创建多个不同名称通道
./network.sh createChannel -c channel1
./network.sh createChannel -c channel2
# 3.也可以建立网络创建通道一起
./network.sh up createChannel

inserte la descripción de la imagen aquí

4. Inicie un código de cadena en el canal
. En fabric, el código de cadena se refiere al contrato inteligente.
Después de crear el canal, comience a implementar el código de cadena para interactuar con el libro mayor del canal. El código de cadena contiene la lógica comercial de los activos en el libro mayor de blockchain y está escrito en el lenguaje go, que se describirá en detalle más adelante. Una red de aplicaciones ejecutadas por miembros solo puede llamar contratos en el libro mayor para crear, cambiar y transferir activos.
Para garantizar que la transacción sea válida, las transacciones creadas con contratos inteligentes requieren firmas de varias organizaciones antes de que puedan enviarse al libro mayor, es decir, respaldo, y los contratos inteligentes también definen políticas de respaldo, como requerir 2/3 de los miembros. para estar de acuerdo en pasar, la mitad de los miembros para estar de acuerdo en pasar, etc.
Después de crear el canal, ahora inicie el código de cadena:

./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
# 出错详见附加问题3

La siguiente figura muestra que el código de cadena se inició con éxito
inserte la descripción de la imagen aquí
5. Interactuar con
la red Agregue fabric-samplesel binarchivo binario debajo del archivo a la ruta CLI:

export PATH=${
    
    PWD}/../bin:$PATH

También es necesario establecer fabric-samplesen el código base FABRIC_CFG_PATHpara señalar los core.yamlarchivos que contiene:

export FABRIC_CFG_PATH=$PWD/../config/

Establezca una variable de entorno que permita al usuario operar la CLI del par como org1:

# Environment variables for Org1

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
#CORE_PEER_TLS_ROOTCERT_FILE和CORE_PEER_MSPCONFIGPATH环境变量指向Org1的organizations文件夹中的的加密材料。
export CORE_PEER_TLS_ROOTCERT_FILE=${
    
    PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${
    
    PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051

A continuación, puede llamar al método InitLedger del código de cadena (Go) para asignar algunos activos iniciales en el libro mayor. Ejecute el siguiente comando para inicializar el libro mayor con algunos activos:

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":[]}'

Como se muestra en la figura, ¡la inicialización es exitosa!
inserte la descripción de la imagen aquí
A continuación, puede utilizar la herramienta CLI para consultar el libro mayor:

peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'

inserte la descripción de la imagen aquí
También es posible transferir o cambiar el propietario del activo (es decir, la operación de cambio en la base de datos):

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"]}'

Después de la ejecución, verifiquemos nuevamente y encontremos que el propietario cuyo ID es asset6 se ha convertido en Christopher, como se muestra en la figura:
inserte la descripción de la imagen aquí
A continuación, podemos consultar a través del par de org2. Antes de eso, configuremos la variable de entorno de org2:

# Environment variables for Org2

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${
    
    PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${
    
    PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051

revisar otra vez

peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'

El resultado es el mismo que org1, el activo 6 se transfiere a una persona llamada Christopher.
inserte la descripción de la imagen aquí
En este punto, la prueba se completa, cerramos la red../network.sh down

3.4 Trabajo en Red con Organismos de Certificación

Hyperledger Fabric utiliza Infraestructura de clave pública (PKI) para verificar las acciones de todos los participantes de la red. Las transacciones enviadas por cada nodo, administrador de red y usuario deben tener un certificado público y una clave privada para verificar su identidad. Estas identidades deben tener una raíz de confianza válida emitida por una organización que sea miembro de la red.
En la red de prueba network.shse utilizó la herramienta cryptogen para crear estos materiales criptográficos antes de crear los nodos, ahora probemos:

./network.sh up -ca

inserte la descripción de la imagen aquí
Puede ver que el script inicia tres CA, orderer, org1 y org2. Los amigos interesados ​​verifican lo que ha hecho el script después del inicio, por lo que no entraré en detalles aquí.
A continuación, también podemos echar un vistazo a la carpeta MSP de org1, que contiene el certificado y la clave privada para cada identidad:

tree organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/
# 如果没有tree请按照提示安装

inserte la descripción de la imagen aquí

#关闭网络
./network.sh down

4. Aplicación en la producción de automóviles.

4.1 Crear un entorno de desarrollo

Instale python2.7, make, gcc, npm, habilite los servicios remotos para ver la documentación

sudo apt-get install python2.7
sudo apt-get install make
sudo apt-get install gcc
sudo apt install npm
# 安装
sudo apt-get install openssh-server
# 查看,存在sshd说明已启动
sudo ps -e |grep ssh
# 启动
sudo service ssh start

Ingrese al fabric-samplesalmacén e fabcarinicie el contrato inteligente a través del script de la versión javasript:

cd fabric-samples/fabcar
./startFabric.sh javascript
# 启动若报错,查看附加问题4

El inicio es exitoso como se muestra en la figura.
inserte la descripción de la imagen aquí

4.2 Funcionamiento y uso del registro

Este tutorial usa javascript para el ejemplo escrito para nodejs, primero ingrese a la javascriptcarpeta:

cd javascript

Este directorio contiene programas de muestra desarrollados con Fabric SDK para Node.js. Ejecute el siguiente comando para instalar las dependencias de la aplicación:

npm install

Una vez finalizado, eche un lsvistazo al archivo de la aplicación del javaScript de ejemplo a través del comando:
inserte la descripción de la imagen aquí
Cuando creamos la red, el servidor de la autoridad de certificación (CA) creará un usuario administrador (admin), el primer paso utiliza la enroll.jsclave privada generada, pública clave y certificado x.509:

node enrollAdmin.js

Después de la creación, el certificado del administrador de CA se guarda en el walletdirectorio y el certificado y la clave privada se pueden encontrar en admin.id. A continuación, cree un nuevo usuario de la aplicación, que se utilizará para interactuar con la cadena de bloques. Ejecute los siguientes comandos para registrar y registrar appUserun :

node registerUser.js

inserte la descripción de la imagen aquí
A continuación, consultemos el libro mayor. La consulta más común es consultar el valor actual del libro mayor (estado mundial). Usémoslo primero query.js:

node query.js

inserte la descripción de la imagen aquí
Como se muestra en el resultado de salida, podemos ver que los datos de la consulta están en pares clave-valor, es decir, en formato json. Por supuesto, también podemos usar consultas enriquecidas configurando una base de datos (como CouchDB).
Los amigos interesados ​​pueden query.jsanalizarlo, hay algunas definiciones que son fáciles de entender.

4.3 Contrato inteligente

Navegue a la versión de JavaScript del contrato inteligente FabCar en el repositorio de muestras de tela:

cd fabric-samples/chaincode/fabcar/javascript/lib

Open fabcar.js, que describe cómo se define el contrato inteligente usando la clase Contract
inserte la descripción de la imagen aquí
. Ahora cambiemos query.jsel código de alcance de la consulta:

const result = await contract.evaluateTransaction('queryAllCars');
#改为
const result = await contract.evaluateTransaction('queryCar', 'CAR4');

Después de guardar así, vuelve a fabcar/javascripejecutar:

node query.js

Podemos ver que la estructura de consulta solo ha cambiado para consultar los datos de este auto

Wallet path: ...fabric-samples/fabcar/javascript/wallet
Transaction has been evaluated, result is:
{
    
    "color":"black","docType":"car","make":"Tesla","model":"S","owner":"Adriana"}

4.4 Actualizar el libro mayor

Ahora hemos completado algunas consultas del libro mayor y agregado y modificado consultas. Ahora vamos a actualizar el libro mayor (es decir, "aumentar" en la base de datos).
Lo abrimos invoke.js
inserte la descripción de la imagen aquí
. Ahora conocemos el principio y comenzamos a ejecutar.

node invoke.js

Después de la ejecución, modifique query.js al código anterior para consultar el estado mundial y luego verifique

node query.js

Como se muestra en la figura, podemos ver que CAR12 se ha agregado a la
inserte la descripción de la imagen aquí
función de modificación:

# 这就是invoke.js中的submitTransaction功能,
# 把方法由createCar修改为changeCarOwner
await contract.submitTransaction('changeCarOwner', 'CAR12', 'Dave');

Verifique nuevamente node query.js, puede ver que el propietario se ha convertido en "Dave".
En este punto, termine, regrese al directorio de fabcar, borre los datos y cierre la red de prueba:

./networkDown.sh

5. Aplicación de papel comercial

Esta aplicación contiene dos organizaciones, MagnetoCorp y DigiBank, que utilizan la red blockchain PaperNet para negociar papel comercial entre sí, como se muestra en la figura:
inserte la descripción de la imagen aquí
El proceso es el siguiente:
Soy Isabella, una empleada de MagnetoCorp, ella emitirá papel comercial en nombre de la empresa, y luego cambia de roles para actuar como Balaji, un empleado de DigiBank, quien comprará este papel comercial, lo mantendrá durante un período de tiempo y lo canjeará con MagnetoCorp para obtener una pequeña ganancia.

5.1 Funcionamiento de la red

Cambie al fabric-samplesdirectorio commercial-papere inicie la red:

cd fabric-samples/commercial-paper
./network-starter.sh

Tenga en cuenta que el nombre de la red de prueba aquí es fabric_test, el tutorial oficial es net_test, preste atención para verificar el funcionamiento del nodo Fabric en la máquina local a través del comando:
inserte la descripción de la imagen aquí
También puede verificarlo a través del comando:docker ps
inserte la descripción de la imagen aquí
docker network inspect fabric_test
inserte la descripción de la imagen aquí

peer0.org1.example.com pertenecerá a la organización
DigiBank peer0.org2.example.com pertenecerá a la organización MagnetoCorp
La red lanzada se llama PaperNet Después
de su lanzamiento se generarán ocho contenedores correspondientes a ocho IP diferentes direcciones, que se pueden ver a través del docker network inspect net_testcomando:
1. El par
de Org1——peer0.org1.example.com
2. El par de Org2——peer0.org2.example.com 3. La base de datos CouchDB correspondiente al par de Org1——couchdb0 4. La base de datos de CouchDB correspondiente
al par de Org2—— --couchdb1
5. Nodo de servicio de pedidos
-- orderer.example.com 6. CA de Org1 -- ca_org1 7.
CA de Org2 -- ca_org2
8. Servicio de pedidos CA de la organización -- ca_orderer

5.2 Como MagnetoCorp

Estado del administrador

Primero cambie al directorio de MagnetoCorp:

cd commercial-paper/organization/magnetocorp

En el directorio de MagnetoCorp, ejecute el siguiente comando para ejecutar el monitordocker.shscript e iniciar la herramienta logspout para el contenedor asociado con PaperNet que se ejecuta en fabric_test:

# 如果是非最高权限用户,请在下列命令前加上sudo
./configuration/cli/monitordocker.sh fabric_test
#如果 monitordocker.sh 中的默认端口已经在使用,可以传入一个端口号
#./monitordocker.sh net_test <port_number>
./monitordocker.sh net_test 8079

inserte la descripción de la imagen aquí

estado de desarrollador

Verifique los contratos inteligentes de papel comercial:
emitir (emitir), comprar (comprar), canjear (canjear) son las tres funciones principales de los contratos inteligentes de PaperNet.
Abra una nueva terminal en nombre de los desarrolladores de MagnetoCorp:

cd commercial-paper/organization/magnetocorp

Vea contratos inteligentes en contract/lib papercontract.js, que incluye contratos inteligentes de papel comercial, que definen métodos de transacción como emisión, compra, canje y consulta.
inserte la descripción de la imagen aquí
Implemente el contrato inteligente en el canal:
antes de que la aplicación llame a papercontract, el contrato debe instalarse en el nodo par apropiado en la red de prueba y luego se define en el canal usando el ciclo de vida del código de cadena de Fabric, por lo que debe ser un administrador de MagnetoCorp y DigiBank La identidad para instalar y aprobar el código de cadena de consentimiento.
inserte la descripción de la imagen aquí
Se pueden definir uno o más contratos inteligentes en un código de cadena. Instalar el código de cadena permite que diferentes organizaciones en PaperNet usen los contratos inteligentes. También significa que solo los administradores deben prestar atención al código de cadena, y otros solo deben prestar atención al código inteligente. contratos
Instale y apruebe contratos inteligentes como MagnetoCorp:
abra otro comando con el lado hacia abajo, el administrador puede interactuar con PaperNet cd commercial-paper/organization/magnetocorpusando el contenedor, también debe configurar algunas variables de entorno en la ventana de comandos para usar el binario correcto para conectarse con MagneoCorp La dirección del nodo envía el comando y firma la solicitud con el cifrado correcto:peerpeer

# 打印完整环境变量并使用生效
source magnetocorp.sh

Ahora comience a interactuar con la red como administrador:

1. Instale el contrato inteligente papercontract y
utilícelo peer lifecycle chaincode packagepara empaquetar el contrato inteligente en un código de cadena

# 创建链码包
peer lifecycle chaincode package cp.tar.gz --lang node --path ./contract --label cp_0

peer lifecycle chaincode installInstale chaincode en el nodo par de MagnetoCorp usando el comando

peer lifecycle chaincode install cp.tar.gz
# 若报错,见附加问题6

inserte la descripción de la imagen aquí
2. Acuerde (verifique) la definición del código de cadena.
Primero consulte el ID del paquete del código de cadena en el par:

peer lifecycle chaincode queryinstalled

inserte la descripción de la imagen aquí
A continuación, debe guardar el ID del paquete como una variable de entorno

export PACKAGE_ID=cp_0:ddca913c004eb34f36dfb0b4c0bcc6d4afc1fa823520bb5966a3bfcf1808f40a

Luego use el siguiente comando para aceptar la definición del código de cadena:

peer lifecycle chaincode approveformyorg --orderer localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name papercontract -v 0 --package-id $PACKAGE_ID --sequence 1 --tls --cafile $ORDERER_CA

Para utilizar una definición de código de cadena, los miembros del canal deben acordar uno de los parámetros de código de cadena más importantes que es la política de respaldo, que describe el conjunto de organizaciones que deben respaldar una transacción antes de que se pueda determinar que es válida. Al aceptar el código de cadena de papercontract sin especificar el indicador --policy, aquí aceptamos usar la política de respaldo predeterminada del canal, lo que requiere que la mayoría de las organizaciones en el canal respalden las transacciones, y todas las transacciones, válidas o no, se registrarán en el libro mayor de blockchain, pero solo las transacciones válidas actualizarán el estado mundial.

5.3 Como DigiBank

1. Instalar y aprobar contratos inteligentes como
DigiBank Según la política LifecycleEndorsement de mychanner, el ciclo de vida del código de cadena de Fabric requerirá que la mayoría de las organizaciones en el canal acepten la definición del código de cadena antes de enviar el código de cadena al canal, es decir, ambos están de acuerdo (MagnetoCorp y DigiBank) . Cambie a la implementación del entorno digibank:

cd commercial-paper/organization/digibank/
source digibank.sh

Ahora instale y acepte papercontract como DigiBank, utilizando el mismo método que MagnetoCorp:

# 打包链码
peer lifecycle chaincode package cp.tar.gz --lang node --path ./contract --label cp_0
# 安装链码
peer lifecycle chaincode install cp.tar.gz
# 查询安装链码的packageID
peer lifecycle chaincode queryinstalled
# 将id保存为环境变量
# export PACKAGE_ID=cp_0: <packageID>
export PACKAGE_ID=cp_0:ddca913c004eb34f36dfb0b4c0bcc6d4afc1fa823520bb5966a3bfcf1808f40a
# Digibank管理员同意papercontract的链码定义:
peer lifecycle chaincode approveformyorg --orderer localhost:7050 --ordererTLSHostnameOverride orderer.example.com --channelID mychannel --name papercontract -v 0 --package-id $PACKAGE_ID --sequence 1 --tls --cafile $ORDERER_CA

inserte la descripción de la imagen aquí
En este punto, ambas organizaciones acordaron el código de cadena de papernet, lo que también significa que la aplicación del cliente en el canal puede llamar al contrato inteligente de CommercialPaper en el código de cadena de contrato de papel. Aquí continuamos usando la identidad del administrador de DigiBank para peer lifecycle chaincode commitenviar la definición de código de cadena de papercontract a mychannel usando el comando:

peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --peerAddresses localhost:7051 --tlsRootCertFiles ${
    
    PEER0_ORG1_CA} --peerAddresses localhost:9051 --tlsRootCertFiles ${
    
    PEER0_ORG2_CA} --channelID mychannel --name papercontract -v 0 --sequence 1 --tls --cafile $ORDERER_CA --waitForEvent

inserte la descripción de la imagen aquí
Se puede ver que el contenedor de contrato de papel se ha iniciado en los dos nodos pares y el código de contrato de papel se ha implementado en el canal A continuación, la aplicación MagnetoCorp se utiliza para emitir papel comercial.

5.4 Estructura de la aplicación

El contrato inteligente incluido en el contrato de papel es llamado por la aplicación issue.js de MagnetoCorp. Echemos un vistazo cd commercial-paper/organization/magnetocorp/application. En este directorio, hay issue.js
inserte la descripción de la imagen aquí
algunas importaciones definidas delante del código como se ve en la figura anterior. Ahora instalemos estos paquetes importados. primero abajo:

# 切换目录
cd commercial-paper/organization/magnetocorp/application/
# 安装依,这个命令会把当前包下所有js文件中引入的依赖下载
npm install
# 查看目录
ls

inserte la descripción de la imagen aquí
Cuando observamos node_modules, vemos que muchos paquetes ya están instalados, ¡porque ellos mismos estánjs-yaml integrados en otros paquetes npm! El archivo identifica con precisión la versión instalada.fabric-networkpackage-lock.json

5.5 Carteras

Debido a que issue.jsrepresenta a Isabella, también representa a MagnetoCorp, y issue.jsutilizará la identidad en la billetera de Isabella que refleja los hechos anteriores. Ahora debemos realizar esta actividad única para agregar el certificado X.509 a la billetera de Isabella.
Run node enrollUser.jsagrega información de identidad a su billetera:
inserte la descripción de la imagen aquí
Veamos de ls ../identity/user/isabella/wallet/nuevo lo que hay en la billetera:
inserte la descripción de la imagen aquí
Isabella puede almacenar varias identidades en su billetera, pero en nuestro ejemplo, solo usa una. Dentro de la carpeta de la billetera hay un archivo isabella.id que proporciona la información que Isabella necesita para conectarse a la red.
inserte la descripción de la imagen aquí

5.6 Publicación de aplicaciones

Isabella ahora puede usar issue.js para enviar una transacción que emitirá el papel comercial 00001 de MagnetoCorp:

node issue.js

inserte la descripción de la imagen aquí
Procesar respuesta de transacción de emisión.
{“clase”:“org.papernet.commercialpaper”,
“estadoactual”:1,
“emisor”:“MagnetoCorp”, “número de
papel”:“00001”, “fecha y hora de
emisión”: “2020-05-31”,
“fecha y hora de vencimiento” :“2020-11-30”,
“faceValue”:5000000,
“mspid”:“Org2MSP”,
“propietario”:“MagnetoCorp”}

5.7 Aplicación DigiBank

Ahora usamos la identidad de DigiBank para usar las operaciones de compra y canje:

cd commercial-paper/organization/digibank/application/

Eche un vistazo más de cerca a los dos archivos en este directorio. El
inserte la descripción de la imagen aquí
proceso de operación es el mismo que el de MagnetoCorp:

# 安装依赖
npm install
# 注册用户
node enrollUser.js

inserte la descripción de la imagen aquí

Al igual que Isabella, la información de identidad de un balaji se agrega a la billetera de DigiBank para transacciones de compra y canje. A continuación, ¡tratemos de comprar y canjear!

# 购买
node buy.js
# 赎回
node redeem.js

inserte la descripción de la imagen aquí

Finalmente, no olvides limpiar estos datos:

cd fabric-samples/commercial-paper
sudo ./network-clean.sh

Si necesita ejecutar la segunda vez, debe eliminar manualmente algunas carpetas, como la carpeta de identidad en digibank y magnetocorp, y el paquete node_moudle de npm install
Solo después de eliminar, la segunda ejecución de estos códigos puede tener éxito, o la instalación no se ejecutará de nuevo. El código dependiente también funciona.

Preguntas adicionales

  1. Obtuve el permiso denegado al intentar conectarme al socket del demonio Docker en...
    Solución:
    La cuenta que ejecuta el comando no tiene permiso. La cuenta que uso para ejecutar el comando es una cuenta normal sin permiso de root. O cambia a la raíz usuario o cambie los usuarios actuales que se agregan, ¡asegúrese de recordar actualizar el grupo de usuarios!

    	#将用户添加到docker组,确保在用户命令下可以执行
    	sudo gpasswd -a $USER docker
    	#更新用户组
    	newgrp docker
    
  2. curl: (7) No se pudo conectar al puerto raw.githubusercontent.com 443: Conexión rechazada
    Solución:
    Abra el sitio web: https://www.ipaddress.com/
    para verificar la dirección IP correspondiente a raw.githubusercontent.com
    inserte la descripción de la imagen aquí
    inserte la descripción de la imagen aquí
    e ingrésela en la línea de comando sudo vi /etc/hosts

    #添加一行:
    #【查询到的任一 ip 】raw.githubusercontent.com,我这里是:
    185.199.108.133 raw.githubusercontent.com
    

    Puede fallar, intente unas cuantas veces más, ¡probablemente tenga que repetir el comando de descarga 6-8 veces antes de que tenga éxito!

  3. La instalación de Chaincode en peer0.org1 ha fallado inserte la descripción de la imagen aquí
    . Se ha excedido la fecha límite del contexto. Otras operaciones también pueden causar esto. Tenga en cuenta que estas operaciones deben realizarse de una sola vez, no suspenda la máquina virtual ni interrumpa la operación, de lo contrario habrá un mucho problema, otro, recuerda hacer copias de seguridad, instantáneas, para que puedas volver al nodo anterior y evitar volver a borrar y cambiar.

  4. Error: la instalación del código de cadena falló con el estado: 500: no se pudo invocar la implementación de respaldo de 'InstallChaincode': no ​​se pudo compilar el código de cadena: la compilación de la ventana acoplable falló: la compilación de la imagen de la ventana acoplable falló: la compilación de la ventana acoplable falló: Error devuelto de la compilación: 1 "+ INPUT_DIR=/chaincode /
    error de entrada: Falló la instalación de Chaincode, estado: 500 - No se pudo invocar la implementación de soporte para 'InstallChaincode': No se pudo construir el código de cadena: falló la compilación de docker: falló la compilación de la imagen de docker: falló la compilación de docker: error devuelto de la compilación: 1" + INPUT_DIR= El problema con /chaincode/input
    es que hay un problema con la compilación de la ventana acoplable, porque suspendí la máquina virtual antes y el contenedor de la ventana acoplable no se reinició. Intente reiniciarlo:

    systemctl restart docker
    
  5. No se pudo resolver el host: github.com
    sacó el espejo y encontró este problema. Tal vez la red se haya ido. ¿Vea si el ícono de red en la esquina superior derecha de usted todavía está allí? Si se ha ido, ejecute el siguiente comando:

    sudo service network-manager stop
    sudo rm /var/lib/NetworkManager/NetworkManager.state
    sudo gedit /etc/NetworkManager/NetworkManager.conf
    

    inserte la descripción de la imagen aquí

    #把false改成true,再重启网络
    sudo service network-manager restart
    
  6. Instalación del código de cadena del ciclo de vida del par cp.tar.gzError: la instalación del código de cadena falló con el estado: 500: no se pudo invocar la implementación de respaldo de 'InstallChaincode': no ​​se pudo construir el código de cadena: la construcción de la ventana acoplable falló: la construcción de la imagen de la ventana acoplable falló: la construcción de la ventana acoplable falló: Error devuelto de la compilación : 1 "+ INPUT_DIR=/códigocadena/entrada+ OUTPUT_DIR=/códigocadena/salida+ cp -R /códigocadena/entrada/src/. /códigocadena/salida+ cd /códigocadena/salida+ '[' -f paquete-bloqueo.json -o -f npm-shrinkwrap.json ]+ npm install --production
    npm ERR! código EAI_AGAIN
    npm ERR! errno EAI_AGAIN
    npm ERR! solicitud a https://registry.npmjs.org/fabric-shim falló, razón: getaddrinfo EAI_AGAIN registro.npmjs. org
    npm ERR! Puede encontrar un registro completo de esta ejecución en:
    npm ERR! /root/.npm/_logs/2022-05-24T06_09_07_419Z-debug.log
    inserte la descripción de la imagen aquí
    Revisé mucha información en Internet y todos decían que era un problema con la versión de go. Puedes cambiar a go1.13. Antes usaba go1.18.

Epílogo

Lo anterior es el análisis y funcionamiento de todos los ejemplos oficiales. Básicamente, he pisado el hoyo del tutorial oficial para la referencia de amigos que son nuevos en Hyperledger Fabric. El estudio de seguimiento y el proyecto de cadena de bloques que implementaré serán también se actualizará en la cadena de bloques en el tema. Si hay algo mal, por favor corrígeme; si tienes otras preguntas, por favor deja un mensaje, si te es útil, ¡por favor regálame un Me gusta!

Supongo que te gusta

Origin blog.csdn.net/weixin_44165950/article/details/124857431
Recomendado
Clasificación