navegación
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:
La siguiente figura muestra la estructura de Hyperledger Fabric. Para más detalles, consulte Blockchain Network :
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-samples
el 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
3. Instale los binarios específicos de la plataforma Hyperledger Fabric y los archivos de configuración de la versión especificada en /bin
los /config
directorios 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!
Podemos ver que todas las descargas están completas
cd chaincode-go
sudo vi go.mod
# 进入文件发现是1.14 自己把改成1.13 ,要与你下载的go版本匹配
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
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-samples
la 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.
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
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 createChannel
canal 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
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
5. Interactuar con
la red Agregue fabric-samples
el bin
archivo binario debajo del archivo a la ruta CLI:
export PATH=${
PWD}/../bin:$PATH
También es necesario establecer fabric-samples
en el código base FABRIC_CFG_PATH
para señalar los core.yaml
archivos 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!
A continuación, puede utilizar la herramienta CLI para consultar el libro mayor:
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
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:
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.
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.sh
se utilizó la herramienta cryptogen para crear estos materiales criptográficos antes de crear los nodos, ahora probemos:
./network.sh up -ca
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请按照提示安装
#关闭网络
./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-samples
almacén e fabcar
inicie 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.
4.2 Funcionamiento y uso del registro
Este tutorial usa javascript para el ejemplo escrito para nodejs, primero ingrese a la javascript
carpeta:
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 ls
vistazo al archivo de la aplicación del javaScript de ejemplo a través del comando:
Cuando creamos la red, el servidor de la autoridad de certificación (CA) creará un usuario administrador (admin), el primer paso utiliza la enroll.js
clave 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 wallet
directorio 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 appUser
un :
node registerUser.js
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
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.js
analizarlo, 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
. Ahora cambiemos query.js
el 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/javascrip
ejecutar:
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
. 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
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:
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-samples
directorio commercial-paper
e 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:
También puede verificarlo a través del comando:docker ps
docker network inspect fabric_test
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_test
comando:
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.sh
script 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
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.
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.
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/magnetocorp
usando 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:peer
peer
# 打印完整环境变量并使用生效
source magnetocorp.sh
Ahora comience a interactuar con la red como administrador:
1. Instale el contrato inteligente papercontract y
utilícelo peer lifecycle chaincode package
para 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 install
Instale chaincode en el nodo par de MagnetoCorp usando el comando
peer lifecycle chaincode install cp.tar.gz
# 若报错,见附加问题6
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
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
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 commit
enviar 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
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
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
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-network
package-lock.json
5.5 Carteras
Debido a que issue.js
representa a Isabella, también representa a MagnetoCorp, y issue.js
utilizará 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.js
agrega información de identidad a su billetera:
Veamos de ls ../identity/user/isabella/wallet/
nuevo lo que hay en la billetera:
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.
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
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
proceso de operación es el mismo que el de MagnetoCorp:
# 安装依赖
npm install
# 注册用户
node enrollUser.js
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
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
-
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
-
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
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!
-
La instalación de Chaincode en peer0.org1 ha fallado
. 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. -
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
-
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
#把false改成true,再重启网络 sudo service network-manager restart
-
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
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!