Análise de quatro palavras - tutorial prático de implantação do blockchain hyperledger fabric2.2

I. Introdução

Este tutorial é executado na versão ubuntu20. Por favor, implante o ambiente ubuntu20 antes de realizar a operação. Todas as implantações são realizadas de acordo com o documento oficial hyperledger fabric . Também explicarei os problemas encontrados durante a operação. Se você não sabe muito , consulte primeiro o conceito de blockchain. Se houver algo errado no entendimento, por favor, critique e corrija.

2. Introdução ao tecido do hyperledger

Hyperledger Fabric é um dos projetos de blockchain no Hyperledger (Super Book) e uma das cadeias de consórcios clássicas. Possui um livro-razão, usando contratos inteligentes, um sistema onde os participantes gerenciam as transações, mas não é totalmente descentralizado, ou seja, os membros que desejam ingressar no consórcio precisam se registrar em um Membership Service Provider (MSP) confiável, a seguir estão Uma introdução ao alguns conceitos relacionados.

substantivo explique
ativos Dados gravados, geralmente no formato json, representando uma coleção de pares de valores-chave
código de cadeia Lógica de negócios, ou seja, contratos inteligentes, define e modifica instruções de transação
ativos Dados gravados, geralmente no formato json, representando uma coleção de pares de valores-chave
Recursos do Razão Recursos como consultas baseadas em chave, baseadas em intervalo e compostas
privacidade São criados canais isolados uns dos outros e, ao mesmo tempo em que permitem o compartilhamento de infraestrutura de rede entre organizações, também podem ser privatizados
Segurança e Serviços para Membros Todos os membros são abertos e podem operar e gerenciar dados em uma ampla variedade de redes e canais
consenso Da proposta e endosso à classificação, verificação e envio, há verificação de consenso para garantir que as transações cheguem a um consenso e evitem gastos duplos
rede blockchain Infraestrutura técnica para livro de aplicativos e contratos inteligentes (chaincode)

A figura a seguir mostra a estrutura do Fabric:
insira a descrição da imagem aqui
A figura a seguir mostra a estrutura do Hyperledger Fabric. Para obter detalhes, consulte Blockchain Network :
insira a descrição da imagem aqui

3. Exemplo de rede de teste

3.1 Construir um ambiente de desenvolvimento

1. Instale o git

sudo apt-get install git

2. Instale o enrolamento

sudo apt-get install curl

3. Instale a janela de encaixe

# 安装并检查版本
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

Instale e extraia:

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

Crie o diretório go e configure o ambiente:

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 Exemplos de instalação, binários e imagens do Docker

1. Clone hyperledger/fabric-sampleso repositório

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. Selecione a tag de versão apropriada, insira o diretório e alterne as ramificações

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

insira a descrição da imagem aqui
3. Instale os binários específicos da plataforma do Hyperledger Fabric e os arquivos de configuração da versão especificada /binnos /configdiretórios e em amostras de malha e baixe a imagem de encaixe do Hyperledger Fabric da versão especificada.
Configure a origem da imagem primeiro:

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

Tente algumas vezes e você será bem sucedido!
insira a descrição da imagem aqui
Podemos ver que todos os downloads estão completos
insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

Configurações de variáveis ​​de ambiente

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

insira a descrição da imagem aqui

3.3 Use o Fabric para testar a rede

Lembrete: Quando você vê isso, significa que seu ambiente foi implantado. Em seguida, você precisa usar a rede de teste. Deve-se observar que a operação deve ser realizada em um período de tempo completo. Não execute as seguintes operações de forma intermitente , senão pode ser. Haverá muitos problemas que são difíceis para os novatos resolverem!

Mais importante,
ative o modo de depuração ao encontrar problemas!
Ative o modo de depuração!
Ative o modo de depuração!

export FABRIC_LOGGING_SPEC=debug

1. Inicie a rede de teste
e digite fabric-sampleso próximo test-network
para analisar o 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 

Execute o seguinte comando para executar o scriptnetwork.sh

./network.sh up

Após a execução, podemos ver que criamos o ordenador da organização ordenadora, o nó peer0 do membro da aliança org1, o nó peer0 do membro da aliança org2 e a imagem espelhada correspondente.
insira a descrição da imagem aqui
2. Os componentes da rede de teste são
executados. docker ps -a
Você pode ver os três nós criados e todas as organizações que são membros da
insira a descrição da imagem aqui
rede de malha hello-world testada anteriormente são chamadas de alianças. Esta rede de teste tem dois membros da aliança org1 e 2, e one mantém o serviço de pedidos de rede.O ordenador da organização, cada organização opera um nó de peer, peer0.org1.example.com e peer0.org2.example.com.
O nó par é o componente básico da rede de malha. O nó par mais comum é o nó de endosso. O nó par armazena o ledger blockchain para verificação antes das transações.
A rede de exemplo usa um serviço de pedido Raft de nó único, as versões anteriores tinham modo solo e modo kafka, este teste usa apenas um serviço de pedido de nó único, mas uma rede real terá vários nós de pedido, organizados por um ou mais solicitantes.

3. Crie um canal

Existem várias maneiras de criar um ./network.sh createChannelcanal entre org1 e org2 e juntar-se a seus pares usando:

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

insira a descrição da imagem aqui

4. Inicie um código de cadeia no canal
Na malha, o código de cadeia refere-se ao contrato inteligente.
Após a criação do canal, comece a implantar o chaincode para interagir com o ledger do canal. O chaincode contém a lógica de negócios dos ativos no ledger do blockchain e é escrito na linguagem go, que será descrita em detalhes posteriormente. Uma rede de aplicativos executados por membros pode chamar apenas contratos no livro-razão para criar, alterar e transferir ativos.
Para garantir que a transação seja válida, as transações criadas usando contratos inteligentes exigem assinaturas de várias organizações antes de serem enviadas ao livro-razão, ou seja, endosso e contratos inteligentes também definem políticas de endosso, como exigir 2/3 dos membros concordar em passar, metade dos membros concordar em passar, etc.
Após criar o canal, agora inicie o chaincode:

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

A figura a seguir mostra que o código da cadeia foi iniciado com sucesso
insira a descrição da imagem aqui
5. Interaja com
a rede Adicione fabric-sampleso binarquivo binário sob o arquivo ao caminho da CLI:

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

Também precisa definir fabric-samplesno codebase FABRIC_CFG_PATHpara apontar para os core.yamlarquivos nele:

export FABRIC_CFG_PATH=$PWD/../config/

Defina uma variável de ambiente que permita ao usuário operar a CLI do peer 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

Em seguida, você pode chamar o método InitLedger do chaincode (Go) para atribuir alguns ativos iniciais no ledger. Execute o seguinte comando para inicializar o ledger com alguns ativos:

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

Conforme mostrado na figura, a inicialização foi bem-sucedida!
insira a descrição da imagem aqui
Em seguida, você pode usar a ferramenta CLI para consultar o livro-razão:

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

insira a descrição da imagem aqui
Também é possível transferir ou alterar o proprietário do ativo (ou seja, a operação de alteração no banco de dados):

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

Após a execução, vamos verificar novamente e descobrir que o proprietário cujo ID é asset6 se tornou Christopher, conforme mostra a figura:
insira a descrição da imagem aqui
Em seguida, podemos consultar através do peer de org2. Antes disso, vamos definir a variável de ambiente 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

verifique novamente

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

O resultado é o mesmo que org1, asset6 é transferido para uma pessoa chamada Christopher.
insira a descrição da imagem aqui
Neste ponto, o teste é concluído, fechamos a rede./network.sh down

3.4 Networking com Organismos de Certificação

O Hyperledger Fabric usa a infraestrutura de chave pública (PKI) para verificar as ações de todos os participantes da rede. As transações enviadas por cada nó, administrador de rede e usuário precisam ter um certificado público e uma chave privada para verificar sua identidade. Essas identidades devem ter uma raiz de confiança válida emitida por uma organização que seja membro da rede.
Na rede de teste, network.sha ferramenta cryptogen foi usada para criar esses materiais criptográficos antes de criar os nós, agora vamos tentar:

./network.sh up -ca

insira a descrição da imagem aqui
Você pode ver que o script inicia três CAs, orderer, org1 e org2. Amigos interessados ​​verificam o que o script fez após a inicialização, então não entrarei em detalhes aqui.
Abaixo também podemos dar uma olhada na pasta MSP do org1, que contém o certificado e a chave privada de cada identidade:

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

insira a descrição da imagem aqui

#关闭网络
./network.sh down

4. Aplicação na produção de automóveis

4.1 Construir um ambiente de desenvolvimento

Instale python2.7, make, gcc, npm, habilite serviços remotos para visualizar a documentação

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

Entre no fabric-samplesarmazém e fabcarinicie o contrato inteligente através do script da versão javasript:

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

A inicialização é bem-sucedida, conforme mostrado na figura
insira a descrição da imagem aqui

4.2 Operação e uso do registro

Este tutorial usa javascript para o exemplo escrito para nodejs, primeiro entre na javascriptpasta:

cd javascript

Esse diretório contém programas de amostra desenvolvidos usando o Fabric SDK para Node.js. Execute o seguinte comando para instalar as dependências do aplicativo:

npm install

Após a conclusão, dê uma lsolhada no arquivo de aplicação do exemplo javaScript através do comando:
insira a descrição da imagem aqui
Quando criamos a rede, o servidor de autoridade de certificação (CA) irá criar um usuário administrador (admin), o primeiro passo utiliza a enroll.jschave privada gerada, public chave e certificado x.509:

node enrollAdmin.js

Após a criação, o certificado do administrador da CA é salvo no walletdiretório, e o certificado e a chave privada podem ser encontrados em admin.id. Em seguida, crie um novo usuário do aplicativo, que será usado para interagir com o blockchain. Execute os seguintes comandos para registrar e registrar appUserum :

node registerUser.js

insira a descrição da imagem aqui
Em seguida, vamos consultar o ledger. A consulta mais comum é consultar o valor atual do ledger (estado mundial). Vamos usá-lo primeiro query.js:

node query.js

insira a descrição da imagem aqui
Conforme mostrado no resultado de saída, podemos ver que os dados da consulta estão em pares chave-valor, ou seja, no formato json, claro que também podemos usar consultas ricas configurando um banco de dados (como o CouchDB).
Amigos interessados ​​podem query.jsanalisar, existem algumas definições que são fáceis de entender.

4.3 Contrato Inteligente

Navegue até a versão JavaScript do contrato inteligente FabCar no repositório de amostras de tecido:

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

Open fabcar.js, que descreve como o contrato inteligente é definido usando a classe Contract
insira a descrição da imagem aqui
Agora vamos alterar query.jso código do escopo da consulta:

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

Depois de salvar assim, volte a fabcar/javascripexecutar:

node query.js

Podemos ver que a estrutura de consulta mudou apenas para consultar os dados deste carro

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 Atualizar o livro-razão

Acabamos de concluir algumas consultas do livro-razão e adicionamos e modificamos as consultas. Agora vamos atualizar o livro-razão (ou seja, "aumentar" no banco de dados).
Nós invoke.js
insira a descrição da imagem aqui
o abrimos. Agora conhecemos o princípio e começamos a executar.

node invoke.js

Após a execução, modifique query.js para o código anterior para consultar o estado mundial e, em seguida, verifique

node query.js

Conforme mostrado na figura, podemos ver que CAR12 foi adicionado à
insira a descrição da imagem aqui
função de modificação:

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

Verifique novamente node query.js, você pode ver que o proprietário se tornou "Dave".
Neste ponto, finalize, retorne ao diretório fabcar, limpe os dados e feche a rede de teste:

./networkDown.sh

5. Aplicação de papel comercial

Este aplicativo contém duas organizações, MagnetoCorp e DigiBank, que usam a rede blockchain PaperNet para negociar papel comercial entre si, conforme mostrado na figura:
insira a descrição da imagem aqui
O processo é o seguinte:
Eu sou Isabella, uma funcionária da MagnetoCorp, ela emitirá papel comercial em nome da empresa e, em seguida, trocar de funções para servir como Balaji, um funcionário do DigiBank, que comprará este papel comercial, o manterá por um período de tempo e o resgatará com a MagnetoCorp por um pequeno lucro.

5.1 Executando a rede

Mude para fabric-sampleso commercial-paperdiretório e inicie a rede:

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

Observe que o nome da rede de teste aqui é fabric_test, o tutorial oficial é net_test, preste atenção para verificar o funcionamento do nó Fabric na máquina local através do comando:
insira a descrição da imagem aqui
Você também pode verificar através do comando:docker ps
insira a descrição da imagem aqui
docker network inspect fabric_test
insira a descrição da imagem aqui

peer0.org1.example.com pertencerá à organização
DigiBank peer0.org2.example.com pertencerá à organização MagnetoCorp
. A rede lançada chama-se PaperNet . Após
o lançamento, serão gerados oito contêineres, correspondendo a oito IPs diferentes endereços, que podem ser visualizados através do docker network inspect net_testcomando:
1. O par
de Org1——peer0.org1.example.com
2. O par de Org2——peer0.org2.example.com 3. O banco de dados CouchDB correspondente ao par de Org1——couchdb0 4. O banco de dados CouchDB correspondente
ao peer de Org2—— --couchdb1
5. Nó de Serviço de Pedido
-- orderer.example.com 6. CA de Org1 -- ca_org1 7.
CA de Org2 -- ca_org2
8. Serviço de Pedido CA da organização -- ca_orderer

5.2 Como MagnetoCorp

Status de administrador

Primeiro mude para o diretório MagnetoCorp:

cd commercial-paper/organization/magnetocorp

No diretório MagnetoCorp, execute o seguinte comando para executar o monitordocker.shscript e iniciar a ferramenta logspout para o contêiner associado ao PaperNet em execução em fabric_test:

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

insira a descrição da imagem aqui

status de desenvolvedor

Verifique os contratos inteligentes de papel comercial:
emitir (emitir), comprar (comprar), resgatar (resgatar) são as três funções principais dos contratos inteligentes PaperNet.
Abra um novo terminal em nome dos desenvolvedores da MagnetoCorp:

cd commercial-paper/organization/magnetocorp

Visualize contratos inteligentes em contract/lib papercontract.js, que inclui contratos inteligentes em papel comercial, que definem métodos de transação como emissão, compra, resgate e consulta.
insira a descrição da imagem aqui
Implante o contrato inteligente no canal:
antes que o aplicativo chame papercontract, o contrato deve ser instalado no nó de peer apropriado na rede de teste e, em seguida, é definido no canal usando o ciclo de vida do chaincode do Fabric, portanto, ele precisa ser um administrador da MagnetoCorp e DigiBank A identidade para instalar e aprovar o chaincode de consentimento.
insira a descrição da imagem aqui
Um ou mais contratos inteligentes podem ser definidos em um chaincode. A instalação do chaincode permite que diferentes organizações no PaperNet usem os contratos inteligentes. Isso também significa que apenas os administradores precisam prestar atenção ao chaincode, e outros só precisam prestar atenção ao smart contracts contratos.
Instale e aprove contratos inteligentes como MagnetoCorp:
abra outro lado do comando para baixo, o administrador pode interagir com o PaperNet cd commercial-paper/organization/magnetocorpusando o contêiner, também precisa definir algumas variáveis ​​de ambiente na janela de comando para usar o binário correto para emparelhar com a MagneoCorp O endereço do nó envia o comando e assina a solicitação com a criptografia correta:peerpeer

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

Agora comece a interagir com a rede como administrador:

1. Instale o contrato inteligente papercontract e
use peer lifecycle chaincode packagepara empacotar o contrato inteligente em um código de cadeia

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

peer lifecycle chaincode installInstale o chaincode no nó de mesmo nível da MagnetoCorp usando o comando

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

insira a descrição da imagem aqui
2. Concorde (verifique) a definição do código da cadeia
Primeiro, consulte o packageID do código da cadeia no peer:

peer lifecycle chaincode queryinstalled

insira a descrição da imagem aqui
Em seguida, você precisa salvar o packageID como uma variável de ambiente

export PACKAGE_ID=cp_0:ddca913c004eb34f36dfb0b4c0bcc6d4afc1fa823520bb5966a3bfcf1808f40a

Em seguida, use o seguinte comando para concordar com a definição do chaincode:

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 usar uma definição de chaincode, os membros do canal precisam concordar com um dos parâmetros de chaincode mais importantes que é a política de endosso, que descreve o conjunto de organizações que devem endossar uma transação antes que ela possa ser determinada como válida. Ao concordar com o chaincode do papercontract sem especificar o sinalizador --policy, concordamos em usar a política de endosso padrão do canal - exigindo que a maioria das organizações no canal endossem transações, e todas as transações, válidas ou não, serão registradas no blockchain ledger, mas apenas transações válidas atualizarão o estado mundial.

5.3 Como DigiBank

1. Instalar e aprovar contratos inteligentes como
DigiBank Com base na política LifecycleEndorsement do mychanner, o ciclo de vida do chaincode do Fabric exigirá que a maioria das organizações no canal concorde com a definição do chaincode antes de enviar o chaincode ao canal, ou seja, ambos concordam (MagnetoCorp e DigiBank) . Mude para a implantação do ambiente digibank:

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

Agora instale e concorde com o papercontract como DigiBank, usando o mesmo método do 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

insira a descrição da imagem aqui
Neste ponto, ambas as organizações concordaram com o chaincode do papernet, o que também significa que o aplicativo cliente no canal pode chamar o contrato inteligente CommercialPaper no chaincode do papercontract. Aqui continuamos a usar a identidade do administrador do DigiBank para peer lifecycle chaincode commitenviar a definição do chaincode do papercontract ao mychannel usando o 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

insira a descrição da imagem aqui
Pode-se ver que o container papercontract foi iniciado nos dois nós pares e o código papercontract foi implantado no canal.A seguir, o aplicativo MagnetoCorp é usado para emitir papel comercial.

5.4 Estrutura do Aplicativo

O contrato inteligente incluído no papercontract é chamado pelo aplicativo issue.js da MagnetoCorp. Vamos dar uma olhada cd commercial-paper/organization/magnetocorp/application. Neste diretório, existem issue.js
insira a descrição da imagem aqui
algumas importações definidas na frente do código como visto na figura acima. Agora vamos instalar esses pacotes importados primeiro. para baixo:

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

insira a descrição da imagem aqui
Quando olhamos para node_modules, vemos que muitos pacotes já estão instalados, porque eles próprios estãojs-yaml embutidos em outros pacotes npm! O arquivo identifica com precisão a versão instalada.fabric-networkpackage-lock.json

5.5 Carteiras

Porque issue.jssignifica Isabella, também significa MagnetoCorp, e issue.jsusará a identidade na carteira Isabella que reflete os fatos acima. Agora precisamos realizar essa atividade única para adicionar o certificado X.509 à carteira de Isabella.
Run node enrollUser.jsadiciona informações de identidade à carteira dela:
insira a descrição da imagem aqui
Vamos ls ../identity/user/isabella/wallet/ver o que está na carteira novamente:
insira a descrição da imagem aqui
Isabella pode armazenar várias identidades em sua carteira, mas em nosso exemplo, ela usa apenas uma. Dentro da pasta wallet há um arquivo isabella.id que fornece as informações que Isabella precisa para se conectar à rede.
insira a descrição da imagem aqui

5.6 Aplicativos de publicação

Isabella agora pode usar o issue.js para enviar uma transação que emitirá o papel comercial 00001 da MagnetoCorp:

node issue.js

insira a descrição da imagem aqui
Processar a resposta da transação de emissão.
{“class”:“org.papernet.commercialpaper”,
“currentState”:1,
“issuer”:“MagnetoCorp”,
“paperNumber”:“00001”,
“issueDateTime”:“2020-05-31”,
“maturityDateTime” :“2020-11-30”,
“faceValue”:5000000,
“mspid”:“Org2MSP”,
“proprietário”:“MagnetoCorp”}

5.7 Aplicativo DigiBank

Agora usamos a identidade do DigiBank para usar as operações de compra e resgate:

cd commercial-paper/organization/digibank/application/

Dê uma olhada nos dois arquivos deste diretório. O
insira a descrição da imagem aqui
processo de operação é o mesmo da MagnetoCorp:

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

insira a descrição da imagem aqui

Assim como Isabella, as informações de identidade de um balaji são adicionadas à carteira do DigiBank para transações de compra e resgate. Em seguida, vamos tentar comprar e resgatar!

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

insira a descrição da imagem aqui

Por fim, não se esqueça de limpar esses dados:

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

Se você precisar executar pela segunda vez, será necessário excluir manualmente algumas pastas, como a pasta identity em digibank e magnetocorp, e o pacote node_moudle do npm install.
Somente após a exclusão, a segunda execução desses códigos pode ser bem-sucedida, ou a instalação não será executada novamente. O código dependente também funciona.

Questões adicionais

  1. Obteve permissão negada ao tentar se conectar ao soquete do daemon do Docker em...
    Solução:
    A conta que executa o comando não tem permissão. A conta que uso para executar o comando é uma conta normal sem permissão de root. Ou alterne para o root user ou alterar os usuários atuais são adicionados, lembre-se de atualizar o grupo de usuários!

    	#将用户添加到docker组,确保在用户命令下可以执行
    	sudo gpasswd -a $USER docker
    	#更新用户组
    	newgrp docker
    
  2. curl: (7) Falha ao conectar à porta raw.githubusercontent.com 443: Conexão recusada
    Solução:
    Abra o site: https://www.ipaddress.com/
    para verificar o endereço IP correspondente a raw.githubusercontent.com
    insira a descrição da imagem aqui
    insira a descrição da imagem aqui
    e digite-o na linha de comando sudo vi /etc/hosts

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

    Pode falhar, tente mais algumas vezes, provavelmente terei que repetir o comando de download 6-8 vezes antes de ter sucesso!

  3. A instalação do Chaincode em peer0.org1 falhou insira a descrição da imagem aqui
    . O prazo de contexto excedido foi excedido. Outras operações também podem causar isso. Observe que essas operações devem ser feitas de uma só vez, não suspenda a máquina virtual ou interrompa a operação, caso contrário haverá um muito Problema, outro, lembre-se de fazer backups, snapshots, para poder voltar ao nó anterior e evitar re-excluir e alterar.

  4. Erro: a instalação do chaincode falhou com o status: 500 - falha ao invocar a implementação de backup de 'InstallChaincode': não foi possível compilar o chaincode: docker build failed: docker image build failed: docker build failed: Erro retornado da compilação: 1 "+ INPUT_DIR=/chaincode /input
    error: Falha na instalação do Chaincode, status: 500 - Falha ao invocar a implementação de suporte para 'InstallChaincode': Falha ao compilar chaincode: falha na criação do docker: falha na criação da imagem do docker: falha na criação do docker: erro retornado da compilação: 1" + INPUT_DIR= O problema com /chaincode/input
    é que há um problema com a compilação do docker, porque eu suspendi a máquina virtual antes e o contêiner do docker não foi reiniciado. Tente reiniciá-lo:

    systemctl restart docker
    
  5. Não foi possível resolver o host: github.com
    puxou o espelho e encontrou este problema. Talvez a rede tenha desaparecido. Veja se o ícone de rede no canto superior direito ainda está lá? Se ele sumir, execute o seguinte comando:

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

    insira a descrição da imagem aqui

    #把false改成true,再重启网络
    sudo service network-manager restart
    
  6. peer lifecycle chaincode install cp.tar.gzError: chaincode install failed with status: 500 - falhou ao invocar a implementação de apoio de 'InstallChaincode': não foi possível construir chaincode: docker build failed: docker image build failed: docker build failed: Erro retornado da compilação : 1 "+ INPUT_DIR=/chaincode/input+ OUTPUT_DIR=/chaincode/output+ cp -R /chaincode/input/src/. /chaincode/output+ cd /chaincode/output+ '[' -f package-lock.json -o -f npm-shrinkwrap.json ]+ npm install
    --production npm ERR! code EAI_AGAIN
    npm ERR! errno EAI_AGAIN
    npm ERR! solicitação para https://registry.npmjs.org/fabric-shim falhou, motivo: getaddrinfo EAI_AGAIN registry.npmjs. org
    npm ERR! Um log completo desta execução pode ser encontrado em:
    npm ERR! /root/.npm/_logs/2022-05-24T06_09_07_419Z-debug.log
    insira a descrição da imagem aqui
    Eu verifiquei muitas informações na Internet e todos disseram que era um problema com a versão do go. Você pode mudar para go1.13. Eu usei go1.18 antes.

Epílogo

O acima é a análise e operação de todos os exemplos oficiais. Basicamente, eu pisei no poço do tutorial oficial para referência de amigos que são novos no tecido hyperledger. O estudo de acompanhamento e o projeto blockchain que vou implantar serão também ser atualizado no blockchain. no tópico. Se houver algo errado, por favor me corrija; se você tiver outras dúvidas, por favor deixe uma mensagem, se for útil para você, por favor me dê um like!

Acho que você gosta

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