四語分析 - ブロックチェーン ハイパーレジャー ファブリック 2.2 展開の実践的なチュートリアル

I.はじめに

このチュートリアルは ubuntu20 版で動作します. 操作を行う前に ubuntu20 環境をデプロイしてください. すべてのデプロイは公式文書hyperledger fabricに従って行われます. 操作中に発生する問題についても説明します. , 最初にブロックチェーンの概念を参照してください. 理解に問題がある場合は、それを批判して修正してください.

2.ハイパーレジャーファブリックの紹介

Hyperledger Fabric は、Hyperledger (Super Book) のブロックチェーン プロジェクトの 1 つであり、古典的なコンソーシアム チェーンの 1 つです。参加者がトランザクションを管理するシステムであるスマート コントラクトを使用した台帳がありますが、完全に分散化されているわけではありません。つまり、コンソーシアムに参加したいメンバーは、信頼できるメンバーシップ サービス プロバイダー (MSP) から登録する必要があります。いくつかの関連する概念。

名詞 説明
資産 記録されたデータ。通常はキーと値のペアのコレクションを表す json 形式です
チェーンコード ビジネス ロジック、つまりスマート コントラクトは、トランザクションの指示を定義および変更します。
資産 記録されたデータ。通常はキーと値のペアのコレクションを表す json 形式です
元帳機能 キーベース、範囲ベース、複合クエリなどの機能
プライバシー 互いに分離されたチャネルが作成され、組織間でネットワーク インフラストラクチャを共有できる一方で、民営化も可能
セキュリティと会員サービス すべてのメンバーはオープンであり、より幅広いネットワークとチャネルでデータを操作および管理できます
コンセンサス 提案と承認から選別、検証、提出まで、トランザクションが合意に達し、二重支出を防ぐための合意検証があります。
ブロックチェーン ネットワーク アプリケーション台帳とスマート コントラクト (チェーンコード) の技術インフラストラクチャ

次の図は、ファブリックの構造を示しています:
ここに画像の説明を挿入
次の図は、Hyperledger Fabric の構造を示しています. 詳細については、ブロックチェーンネットワークを参照してください:
ここに画像の説明を挿入

3. テストネットワークの例

3.1 開発環境を構築する

1. git をインストールする

sudo apt-get install git

2.カールをインストールする

sudo apt-get install curl

3.ドッカーをインストールする

# 安装并检查版本
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. go をインストールする

インストールと解凍:

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

go ディレクトリを作成し、環境を構成します。

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 サンプル、バイナリ、Docker イメージのインストール

1.hyperledger/fabric-samplesリポジトリを複製する

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. 適切なバージョン タグを選択し、ディレクトリに入り、ブランチを切り替えます

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

ここに画像の説明を挿入
3. 指定されたバージョンの Hyperledger Fabric プラットフォーム固有のバイナリーと構成ファイル/bin/configfabric-samples の下のディレクトリーとディレクトリーにインストールし、指定されたバージョンの Hyperledger Fabric Docker イメージをダウンロードします

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

数回試してみると、成功するでしょう!
ここに画像の説明を挿入
すべてのダウンロードが完了したことがわかります
ここに画像の説明を挿入

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

ここに画像の説明を挿入

環境変数の設定

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

ここに画像の説明を挿入

3.3 Fabric を使用してネットワークをテストする

注意: これが表示されたら、環境がデプロイされたことを意味します。次に、テスト ネットワークを使用する必要があります。操作は完全な時間内に実行する必要があることに注意してください。次の操作を断続的に実行しないでください。 、そうじゃないかもしれません初心者には解けない問題がたくさん出てきます!

さらに重要なことは、
問題が発生したときにデバッグ モードをオンにすることです。
デバッグモードをオンに!
デバッグモードをオンに!

export FABRIC_LOGGING_SPEC=debug

1. テスト ネットワークを開始し、次を
入力して network.sh スクリプトを分析します。fabric-samplestest-network

# 脚本有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 

次のコマンドを実行してスクリプトを実行しますnetwork.sh

./network.sh up

実行後、注文組織orderer、アライアンスメンバーorg1のpeer0ノード、アライアンスメンバーorg2のpeer0ノード、および対応するミラーイメージが作成されたことがわかります。
ここに画像の説明を挿入
2. テスト ネットワークのコンポーネントが
実行されます.docker ps -a
作成された 3 つのノードと、以前にテストされた hello-world Fabric ネットワークのメンバーであるすべての組織が
ここに画像の説明を挿入
アライアンスと呼ばれることがわかります. このテスト ネットワークには、2 つのアライアンス メンバー org1 と 2 があります。 1 つはネットワーク順序付けサービスを維持し、組織の順序付け担当者である各組織は、peer0.org1.example.com および peer0.org2.example.com というピア ノードを操作します。
ピア ノードは、ファブリック ネットワークの基本コンポーネントです. 最も一般的なピア ノードは承認ノードです. ピア ノードは、トランザクション前の検証のためにブロックチェーン台帳を保存します.
サンプル ネットワークでは単一ノードの Raft 順序付けサービスを使用します。以前のバージョンにはソロ モードと kafka モードがありました。このテストでは単一ノードの順序付けサービスのみを使用しますが、実際のネットワークには複数の順序付けノードがあり、1 つ以上の順序付けプログラムによって編成されます。

3.チャンネルを作成する

./network.sh createChannelorg1 と org2 の間にチャネルを作成し、以下を使用してピアに参加するには、いくつかの方法があります。

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

ここに画像の説明を挿入

4. チャネルでチェーン コードを開始する
ファブリックでは、チェーン コードはスマート コントラクトを指します。
After the channel is created, start deploying the chaincode to interact with the channel ledger. チェーンコードには、ブロックチェーン台帳上の資産のビジネス ロジックが含まれており、後で詳しく説明する go 言語で記述されています。メンバーによって実行されるアプリケーションのネットワークは、台帳上のコントラクトのみを呼び出して、資産を作成、変更、および転送できます。
トランザクションが有効であることを保証するために、スマート コントラクトを使用して作成されたトランザクションは、元帳に送信される前に複数の組織からの署名が必要です。合格に同意する、メンバーの半数が合格に同意する、など。
チャネルを作成したら、チェーンコードを開始します。

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

次の図は、チェーン コードが正常に開始されたことを示してい
ここに画像の説明を挿入
ます。 5. ネットワークと対話し
ますファイルの下fabric-samplesbinバイナリ ファイルを CLI パスに追加します。

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

その中のファイルを指すようにfabric-samplesコードベースに設定する必要もあります。FABRIC_CFG_PATHcore.yaml

export FABRIC_CFG_PATH=$PWD/../config/

ユーザーがピアの CLI を 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

Next, you can call the InitLedger method of the chaincode (Go) to assign some initial assets on the ledger. 次のコマンドを実行して、台帳をいくつかの資産で初期化します。

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

図のように初期化成功!
ここに画像の説明を挿入
次に、CLI ツールを使用して台帳にクエリを実行できます。

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

ここに画像の説明を挿入
資産の所有者を譲渡または変更することもできます (つまり、データベースでの変更操作)。

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

実行後、再度確認すると、図のように ID が asset6 の所有者が Christopher になっていることがわかります:
ここに画像の説明を挿入
次に、org2 のピアを介してクエリを実行できます.その前に、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

再び確かめる

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

結果は org1 と同じで、asset6 は Christopher という名前の人に転送されます.
ここに画像の説明を挿入
この時点で、テストは完了し、ネットワークを閉じます./network.sh down

3.4 認証機関とのネットワーク

Hyperledger Fabric は、Public Key Infrastructure (PKI) を使用して、すべてのネットワーク参加者のアクションを検証します。各ノード、ネットワーク管理者、およびユーザーによって送信されたトランザクションには、身元を確認するための公開証明書と秘密鍵が必要です。これらの ID には、ネットワークのメンバーである組織によって発行された有効なルート オブ トラストが必要です。
テスト ネットワークでnetwork.shは、cryptogen ツールを使用して、ノードを作成する前にこれらの暗号化マテリアルを作成しました。

./network.sh up -ca

ここに画像の説明を挿入
スクリプトが orderer、org1、および org2 の 3 つの CA を開始することがわかります。興味のある友人は、起動後にスクリプトが何を行ったかを確認するので、ここでは詳しく説明しません。
以下では、org1 の MSP フォルダーも確認できます。このフォルダーには、各 ID の証明書と秘密鍵が含まれています。

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

ここに画像の説明を挿入

#关闭网络
./network.sh down

4. 自動車生産への応用

4.1 開発環境の構築

Python2.7、make、gcc、npm をインストールし、リモート サービスを有効にしてドキュメントを表示する

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

fabric-samples倉庫に入りfabcar、javasript バージョンのスクリプトを使用してスマート コントラクトを開始します。

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

図のように起動に成功
ここに画像の説明を挿入

4.2 登録の運用と利用

このチュートリアルでは、nodejs 用に記述された例に JavaScript を使用します。最初に次のjavascriptフォルダーに入ります。

cd javascript

このディレクトリには、Fabric SDK for Node.js を使用して開発されたサンプル プログラムが含まれています。次のコマンドを実行して、アプリケーションの依存関係をインストールします。

npm install

完了後、ls次のコマンド
ここに画像の説明を挿入
を使用してサンプル JavaScript のアプリケーション ファイルを確認しenroll.jsます。キーと x.509 証明書:

node enrollAdmin.js

作成後、CA 管理者の証明書はwalletディレクトリに保存され、証明書と秘密鍵は admin.id にあります。次に、ブロックチェーンとの対話に使用される新しいアプリケーション ユーザーを作成します。次のコマンドを実行して、 という名前appUserの。

node registerUser.js

ここに画像の説明を挿入
次に、台帳にクエリを実行します. 最も一般的なクエリは、台帳の現在の値 (世界の状態) をクエリすることです. 最初にそれを使用しましょうquery.js:

node query.js

ここに画像の説明を挿入
出力結果にあるように、クエリデータはキーと値のペア、つまり json 形式であることがわかります.もちろん、データベース (CouchDB など) を構成することで、リッチクエリを使用することもできます.
興味のある友人はquery.jsそれを分析できます。理解しやすい定義がいくつかあります。

4.3 スマートコントラクト

fabric-samples リポジトリの FabCar スマート コントラクトの JavaScript バージョンに移動します。

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

Open fabcar.js、Contract クラスを使用してスマート コントラクトを定義する方法を説明します。次に、クエリ スコープ コード
ここに画像の説明を挿入
を変更しましょう。query.js

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

fabcar/javascripこのように保存した後、実行に戻ります。

node query.js

クエリ構造は、この車のデータをクエリするためにのみ変更されていることがわかります

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 台帳の更新

たった今、いくつかの台帳クエリを完了し、クエリを追加および変更しました. では、台帳を更新しましょう (つまり、データベース内で「増加」します).
それを開きinvoke.js
ここに画像の説明を挿入
ます. これで原理がわかり、実行を開始します.

node invoke.js

実行後、query.js を先ほどの世界の状態を問い合わせるコードに変更して確認

node query.js

図に示すように、CAR12 が
ここに画像の説明を挿入
変更機能に追加されていることがわかります。

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

再度確認するnode query.jsと、所有者が「Dave」になっていることがわかります。
この時点で終了し、fabcar ディレクトリに戻り、データをクリアして、テスト ネットワークを閉じます。

./networkDown.sh

5. コマーシャル・ペーパーの適用

このアプリケーションには、図に示すように、MagnetoCorp とDigiBankの 2 つの組織が含まれており、ブロックチェーン ネットワーク PaperNet を使用してコマーシャル ペーパーを相互に取引して
ここに画像の説明を挿入
います。
バラジは、このコマーシャル ペーパーを購入し、一定期間保持し、MagnetoCorp でわずかな利益と交換します。

5.1 ネットワークの実行

fabric-samplesディレクトリcommercial-paperに移動し、ネットワークを開始します。

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

ここでのテスト ネットワーク名は fabric_test であり、公式のチュートリアルは net_test であることに注意してください。コマンドを使用して、ローカル マシン上のファブリック ノードの動作を確認するように注意してください。コマンドを使用して確認することもでき
ここに画像の説明を挿入
ますdocker ps
ここに画像の説明を挿入
docker network inspect fabric_test
ここに画像の説明を挿入

peer0.org1.example.com は DigiBank 組織
に属します peer0.org2.example.com は MagnetoCorp 組織に属し
ます . 起動されたネットワークは PaperNet と呼ばれます.
起動後、8 つの異なる IP に対応する 8 つのコンテナが生成されます1. Org1のピアdocker network inspect net_test—peer0.org1.example.com 2. Org2のピア—peer0.org2.example.com 3. のピアに対応する CouchDB データベースOrg1——couchdb0 4. Org2 のピアに対応する CouchDB データベース—— --couchdb1 5. Ordering Service Node -- orderer.example.com 6. Org1 の CA -- ca_org1 7. Org2 の CA -- ca_org2 8. Ordering Service組織の CA -- ca_orderer







5.2 マグネトコープとして

管理者ステータス

まず、MagnetoCorp ディレクトリに切り替えます。

cd commercial-paper/organization/magnetocorp

MagnetoCorp ディレクトリで、次のコマンドを実行してmonitordocker.shスクリプトを実行し、fabric_test で実行されている PaperNet に関連付けられたコンテナーの logspout ツールを開始します。

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

ここに画像の説明を挿入

開発者ステータス

コマーシャル ペーパー スマート コントラクトを確認
します。
MagnetoCorp 開発者に代わって新しいターミナルを開きます。

cd commercial-paper/organization/magnetocorp

contract/libpapercontract.jsでスマート コントラクトを表示します。これには、発行、購入、償還、クエリなどのトランザクション メソッドを定義するコマーシャル ペーパー スマート コントラクトが含まれます。
ここに画像の説明を挿入
スマート コントラクトをチャネルにデプロイする:
アプリケーションが papercontract を呼び出す前に、テスト ネットワークの適切なピア ノードにコントラクトをインストールする必要があります。次に、Fabric チェーンコード ライフサイクルを使用してチャネルで定義されるため、管理者である必要があります。 MagnetoCorp と DigiBank の同意チェーンコードをインストールして承認するための ID。
ここに画像の説明を挿入
1 つまたは複数のスマート コントラクトをチェーンコードで定義できます.チェーンコードをインストールすると、PaperNet のさまざまな組織がスマート コントラクトを使用できるようになります.また、管理者だけがチェーンコードに注意を払う必要があり、他の人はスマート コントラクトに注意を払うだけでよいことも意味します契約。
スマート コントラクトを MagnetoCorp としてインストールして承認します。
別のコマンド側を下に開きます。管理者はコンテナcd commercial-paper/organization/magnetocorpを使用しpeerて PaperNet と対話できます。コマンド ウィンドウでいくつかの環境変数を設定して、正しいpeerバイナリを使用して MagneoCorp にピアリングする必要があります。ノードのアドレスは、コマンドを実行し、正しい暗号化でリクエストに署名します。

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

管理者としてネットワークとの対話を開始します。

1. papercontract スマート コントラクトをインストールし、スマート コントラクトをチェーン コードにパッケージ化するために
使用します。peer lifecycle chaincode package

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

コマンドを使用しpeer lifecycle chaincode installて、MagnetoCorp のピア ノードにチェーンコードをインストールする

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

ここに画像の説明を挿入
2. チェーン コードの定義に同意 (検証) する
まず、ピアでチェーン コードの packageID をクエリします。

peer lifecycle chaincode queryinstalled

ここに画像の説明を挿入
次に、packageID を環境変数として保存する必要があります。

export PACKAGE_ID=cp_0:ddca913c004eb34f36dfb0b4c0bcc6d4afc1fa823520bb5966a3bfcf1808f40a

次に、次のコマンドを使用して、チェーンコードの定義に同意します。

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

チェーンコード定義を使用するために、チャネル メンバーは、最も重要なチェーンコード パラメーターの 1 つである承認ポリシーに同意する必要があります。承認ポリシーは、トランザクションが有効であると判断される前に、トランザクションを承認する必要がある一連の組織を記述します。--policy フラグを指定せずに papercontract チェーンコードに同意することで、チャネルのデフォルトの承認ポリシーを使用することに同意します。これは、チャネル上の組織の大部分にトランザクションを承認することを要求し、すべてのトランザクションは、有効かどうかに関係なく、ブロックチェーン台帳ですが、有効なトランザクションのみが世界の状態を更新します。

5.3 デジバンクとして

1. スマート コントラクトを
DigiBank としてインストールして承認する mychanner の LifecycleEndorsement ポリシーに基づいて、Fabric チェーンコードのライフサイクルでは、チャネルにチェーンコードを送信する前に、チャネル上のほとんどの組織がチェーンコードの定義に同意する必要があります。つまり、両方が同意する (MagnetoCorp と DigiBank)。 . digibank 環境のデプロイメントに切り替えます。

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

次に、MagnetoCorp と同じ方法を使用して、DigiBank として紙の契約をインストールして同意します。

# 打包链码
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

ここに画像の説明を挿入
この時点で、両組織は papernet チェーンコードに同意しています。これは、チャネル上のクライアント アプリケーションが papercontract チェーンコードで CommercialPaper スマート コントラクトを呼び出すことができることも意味します。ここでは引き続き、DigiBank 管理者の ID をpeer lifecycle chaincode commit使用して、次のコマンドを使用して papercontract のチェーンコード定義を mychannel に送信します。

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

ここに画像の説明を挿入
papercontract コンテナーが 2 つのピア ノードで開始され、papercontract コードがチャネルにデプロイされていることがわかります。次に、MagnetoCorp アプリケーションを使用してコマーシャル ペーパーを発行します。

5.4 アプリケーション構造

papercontract に含まれるスマート コントラクトは、MagnetoCorp のアプリケーション issue.js によって呼び出されます. 見てみましょうcd commercial-paper/organization/magnetocorp/application. このディレクトリにはissue.js
ここに画像の説明を挿入
、上の図に示すように、コードの前に定義されたインポートがいくつかあります. これらのインポートされたパッケージをインストールしましょう.最初に下に:

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

ここに画像の説明を挿入
node_modules を見ると、多くのパッケージが既にインストールされていることがわかります。これは、js-yamlおよびfabric-networkが他の npm パッケージに組み込まれているためです! package-lock.jsonこのファイルは、インストールされているバージョンを正確に識別します。

5.5 ウォレット

これissue.jsはIsabella を表すため、MagnetoCorp も表しissue.js、上記の事実を反映する Isabella ウォレットの ID を使用します。ここで、X.509 証明書を Isabella のウォレットに追加するために、この 1 回限りのアクティビティを実行する必要があります。
Runnode enrollUser.jsは自分のウォレットに ID 情報を追加します。もう一度ウォレットの内容を見てみ
ここに画像の説明を挿入
ましょう。Isabella は自分のウォレットに複数の ID を保存できますが、この例では 1 つしか使用していません。ウォレット フォルダー内には、Isabella がネットワークに接続するために必要な情報を提供する isabella.id ファイルがあります。ls ../identity/user/isabella/wallet/
ここに画像の説明を挿入

ここに画像の説明を挿入

5.6 アプリケーションの公開

Isabella は issue.js を使用して、MagnetoCorp コマーシャル ペーパー 00001 を発行するトランザクションを送信できるようになりました。

node issue.js

ここに画像の説明を挿入
発行トランザクション応答を処理します。
{“class”:“org.papernet.commercialpaper”,
“currentState”:1,
“issuer”:“MagnetoCorp”,
“paperNumber”:“00001”,
“issueDateTime”:“2020-05-31”,
“maturityDateTime” :“2020-11-30”,
“faceValue”:5000000,
“mspid”:“Org2MSP”,
“owner”:“MagnetoCorp”}

5.7 デジバンクアプリ

ここで、DigiBank の ID を使用して、購入および償還操作を使用します。

cd commercial-paper/organization/digibank/application/

このディレクトリ内の 2 つのファイルをよく見てください。
ここに画像の説明を挿入
操作プロセスは、MagnetoCorp の場合と同じです。

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

ここに画像の説明を挿入

Isabella のように、Balaji の ID 情報が DigiBank のウォレットに追加され、購入および償還取引が行われます。

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

ここに画像の説明を挿入

最後に、次のデータをクリーンアップすることを忘れないでください。

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

2 回目の実行が必要な場合は、digibank と magnetocorp の下の ID フォルダー、および npm install のパッケージ node_moudle などのいくつかのフォルダーを手動で削除する必要があります.
削除した後にのみ、これらのコードの 2 回目の実行が成功するか、またはインストールが再度実行されることはありません。依存コードも機能します。

追加の質問

  1. で Docker デーモン ソケットに接続しようとしているときに権限が拒否されました...
    解決策:
    コマンドを実行するアカウントには権限がありません。コマンドを実行するために使用するアカウントは、ルート権限のない通常のアカウントです。ルートに切り替えますユーザーを変更するか、現在のユーザーが追加されている場合は、忘れずにユーザー グループを更新してください。

    	#将用户添加到docker组,确保在用户命令下可以执行
    	sudo gpasswd -a $USER docker
    	#更新用户组
    	newgrp docker
    

  2. curl : (7) raw.githubusercontent.com ポート 443 への接続に失敗しました: 接続が拒否

    れまし
    ここに画像の説明を挿入
    ここに画像の説明を挿入
    たコマンドラインで sudo vi /etc/hosts

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

    失敗するかもしれません。あと数回試してみてください。成功するまでにダウンロード コマンドを 6 ~ 8 回繰り返す必要があります。

  3. peer0.org1 へのチェーンコードのインストールに失敗しましたここに画像の説明を挿入
    。コンテキストの期限を超えました。他の操作によってもこの問題が発生する可能性があります。これらの操作は一度に実行する必要があることに注意してください。仮想マシンを一時停止したり、操作を中断したりしないでください。多くの問題、別の、バックアップ、スナップショットを作成することを忘れないでください。これにより、前のノードに戻って、再削除や変更を避けることができます。

  4. エラー: チェーンコードのインストールがステータスで失敗しました: 500 - 'InstallChaincode' のバッキング実装の呼び出しに失敗しました: チェーンコードをビルドできませんでした: docker ビルドに失敗しました: docker イメージのビルドに失敗しました: docker ビルドに失敗しました: ビルドから返されたエラー: 1 "+ INPUT_DIR=/chaincode /入力
    エラー: チェーンコードのインストールに失敗しました、ステータス: 500 - 'InstallChaincode' のサポート実装の呼び出しに失敗しました: チェーンコードのビルドに失敗しました: docker ビルドに失敗しました: docker イメージのビルドに失敗しました: docker ビルドに失敗しました: ビルドからエラーが返されました: 1" + INPUT_DIR= /chaincode/input
    の問題は、以前に仮想マシンを一時停止して docker コンテナーが再起動しなかったため、docker ビルドに問題があることです。再起動してみてください。

    systemctl restart docker
    
  5. ホストを解決できませんでした: github.com
    がミラーをプルしたところ、この問題が見つかりました. ネットワークがなくなっている可能性があります. 画面の右上隅にあるネットワーク アイコンがまだそこにあるかどうかを確認してください? なくなっている場合は、次のコマンドを実行します。

    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
    
  6. ピア ライフサイクル チェーンコード インストール cp.tar.gzError: チェーンコードのインストールがステータスで失敗しました: 500 - 'InstallChaincode' のバッキング実装の呼び出しに失敗しました: チェーンコードをビルドできませんでした: docker ビルドに失敗しました: docker イメージのビルドに失敗しました: docker ビルドに失敗しました: ビルドからエラーが返されました: 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! コード EAI_AGAIN
    npm ERR! errno EAI_AGAIN
    npm ERR! https://registry.npmjs.org/fabric-shim へのリクエストが失敗しました。理由: getaddrinfo EAI_AGAIN registry.npmjs. org
    npm ERR! この実行の完全なログは、
    npm ERR! /root/.npm/_logs/2022-05-24T06_09_07_419Z-debug.logにあります。
    ここに画像の説明を挿入
    ネットでいろいろ調べたところ、goのバージョンの問題だということで、go1.13に変更してもいいとのことで、以前はgo1.18を使っていました。

エピローグ

上記はすべての公式の例の分析と操作です. 私は基本的にハイパーレジャーファブリックに慣れていない友人の参考のために公式チュートリアルのピットを踏みました. 追跡調査と私が展開するブロックチェーンプロジェクトはブロックチェーンでも更新されます。何か問題がある場合は、私を修正してください; 他の質問がある場合は、メッセージを残してください。

おすすめ

転載: blog.csdn.net/weixin_44165950/article/details/124857431