Centos7 Fabric2.4ネットワーク構築(3)

ヒント: 前の記事ではチャネルの作成について説明しました。発注者は osnadmin コマンドを使用してチャネルをアクティブ化し、ピアがチャネルに参加し、アンカー ノードを更新します。次に、チェーン コードをインストールします。

目次

序文

1. メインスクリプトにチェーンコードをインストールします

2.CC.shをデプロイする 

2.1 チェーンコード

 2.2 包装チェーンコード

2.3 ピアノードにチェーンコードをインストールする

2.4 チェーンコード定義の承認

2.5 チェーンコード定義をチャネルに送信する

2.6 コールチェーンコード


序文

前編:Centos7 Fabric2.4 ネットワーク構築 (1)_大. 上司のブログ - CSDN ブログ

第2回:Centos7 Fabric2.4ネットワーク構築(2)_大ボスのブログ - CSDNブログ


提示:用的是官方的例子学习搭建自己的网络,本次是用cryptogen生成证书,单机多节点部署

エンドユーザーは、スマート コントラクトを呼び出してブロックチェーン台帳と対話します。Hyperledger Fabric では、スマート コントラクトはチェーンコードと呼ばれるパッケージにデプロイされます。トランザクションを検証したり台帳をクエリしたりする組織は、ピア ノードにチェーン コードをインストールする必要があります。チャネルに参加するすべてのピア ノードは、チェーン コードをインストールできます。チェーン コードがインストールされると、チャネル メンバーはチェーン コードをチャネルに展開して、使用できるようになります。コード内のスマート コントラクトは、チャネル台帳上の資産を作成または更新します。

トランザクションを検証したり、台帳にクエリを実行したい組織は、ピアにチェーンコードをインストールする必要があります。チャネルに参加しているノードにチェーンコードがインストールされると、チャネルメンバーはチェーンコードをチャネルにデプロイし、チェーンコード内のスマートコントラクトを使用してチャネル台帳上のアセットを作成または更新できます。

1. メインスクリプトにチェーンコードをインストールします

ユーザーは最終的にスマート コントラクトを呼び出してブロックチェーン台帳を操作します。ハイパーレジャー ファブリックでは、スマート コントラクトはチェーン コードと呼ばれるパッケージにデプロイされます。

チェーンコードをチャネルにデプロイすることで、チャネルが正常に作成されたことを確認できます。network.sh スクリプトを使用して、作成したチャネルにアセット転送のチェーン コードをデプロイできます。次のコマンドを使用して、チェーン コードをチャネルにデプロイします。

./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go

## 调用脚本将链码部署到通道
function deployCC() {
  scripts/deployCC.sh $CHANNEL_NAME $CC_NAME $CC_SRC_PATH $CC_SRC_LANGUAGE $CC_VERSION $CC_SEQUENCE $CC_INIT_FCN $CC_END_POLICY $CC_COLL_CONFIG $CLI_DELAY $MAX_RETRY $VERBOSE

  if [ $? -ne 0 ]; then
    fatalln "Deploying chaincode failed"
  fi
}

2.CC.shをデプロイする 

2.1 チェーンコード

ピアノードにインストールする前に、まずチェーンコードをパッケージ化する必要がありますが、ここでは go のスマート コントラクトを使用します。

チェーンコードをパッケージ化する前に、チェーンコードの依存関係をインストールし、チェーンコードが配置されているフォルダーを開く必要があります。

 依存関係はディレクトリ内の go.mod ファイルにリストされています。

 go.mod ファイルは、ファブリック コントラクト API をスマート コントラクト パッケージにインポートします。chaincode/smartcontract.go を開いて、スマート コントラクトの開始時にスマート コントラクト タイプを定義するためにコントラクト API がどのように使用されるかを理解できます。

// SmartContract provides functions for managing an Asset
type SmartContract struct {
	contractapi.Contract
}

次に、SmartContract タイプを使用して、BlockChain 台帳の読み取りと書き込みを行うスマート コントラクトで定義された関数のトランザクション コンテキストを作成します。

// CreateAsset issues a new asset to the world state with given details.
func (s *SmartContract) CreateAsset(ctx contractapi.TransactionContextInterface, id string, color string, size int, owner string, appraisedValue int) error {
	exists, err := s.AssetExists(ctx, id)
	if err != nil {
		return err
	}
	if exists {
		return fmt.Errorf("the asset %s already exists", id)
	}

	asset := Asset{
		ID:             id,
		Color:          color,
		Size:           size,
		Owner:          owner,
		AppraisedValue: appraisedValue,
	}
	assetJSON, err := json.Marshal(asset)
	if err != nil {
		return err
	}

	return ctx.GetStub().PutState(id, assetJSON)
}

 2.2 包装チェーンコード

スマート コントラクトの依存関係をインストールするには、asset-transfer-basic/chaincode-go ディレクトリから次のコマンドを実行します。

GO111MODULE=on go mod vendor

コマンドが成功すると、go パッケージがベンダー フォルダーにインストールされます。

依存関係が得られたので、チェーンコード パッケージを作業ディレクトリにパッケージして戻し、チェーンコード パッケージを他のネットワーク アーティファクトと一緒にパッケージ化できます。

ピア CLI を使用して、必要な形式でチェーンコード パッケージを作成できます。ピア バイナリ ファイルは、作業ディレクトリの bin フォルダにあります。また、作業ディレクトリ内の core.yaml ファイルを指すように FABRIC_CFG_PATH を設定する必要があります。

export PATH=${ROOTDIR}/bin:${PWD}/bin:$PATH
export FABRIC_CFG_PATH=${PWD}/config/

ピア CLI が使用できるかどうかを確認したい場合は、ピアのバージョンを確認すると、必要なバージョンが 2.0.0 以降であることが表示されます。

次に、peer lifecycle package コマンドを使用してチェーンコードを作成します。

peer lifecycle chaincode package basic.tar.gz --path ./asset-transfer-basic/chaincode-go/ --lang golang --label basic_1.0

このコマンドは、現在のディレクトリに basic.tar.gz という名前のパッケージを作成します。--lang フラグはチェーンコード言語を指定するために使用され、--path フラグはスマート コントラクト コードの場所を指定します。パスは完全修飾パスまたは現在の作業ディレクトリからの相対パスである必要があります。--label フラグは、インストール後にチェーンコードを識別するチェーンコード ラベルを指定するために使用されます。ラベルにはチェーンコードの名前とバージョンを含めることをお勧めします。

2.3 ピアノードにチェーンコードをインストールする

資産転送 (基本) スマート コントラクトをパッケージ化した後、ピアノードにチェーンコードをインストールできます。チェーンコードは、トランザクションをサポートするすべてのピアにインストールする必要があります。Org1 と Org2 からの承認を要求するように承認ポリシーを設定するので、両方の組織によって運営されているピアにチェーンコードをインストールする必要があります。

  • ピア0.org1.hmw.com
  • ピア1.org1.hmw.com
  • ピア0.org2.hmw.com
  • ピア1.org2.hmw.com

まずチェーンコードを Org1 ピア 0 にインストールし、次の環境変数を設定して、Org1 管理者ユーザーとしてピア CLI を操作してみましょう。CORE_PEER_ADDRESS がpeer0.org1.hmw.comを指すように設定します。

export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.hmw.com/tlsca/tlsca.org1.hmw.com-cert.pem
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.hmw.com/users/[email protected]/msp
export CORE_PEER_ADDRESS=localhost:8051

ピア ライフ サイクル チェーンコード インストール コマンドを送信して、peer0.org1 にチェーンコードをインストールします。

peer lifecycle chaincode install basic.tar.gz

コマンドが成功すると、ピアはバンドル ID を生成して返します。このバンドル ID は、次のステップでチェーンコードを承認するために使用されます。次のような出力が表示されるはずです。 

 同様に、残りのピアノードにもチェーンコードをインストールします。

チェーンコードがインストールされると、ピアによってチェーンコードが構築されます。スマート コントラクト コードに問題がある場合、インストール コマンドはチェーンコードからビルド エラーを返します。

2.4 チェーンコード定義の承認

チェーンコード パッケージをインストールした後、組織のチェーンコード定義を承認する必要があります。これには、名前、バージョン、チェーンコード承認ポリシーなどのチェーンコード パッケージの重要なパラメーターが含まれています。

チェーンコードをデプロイする前にチェーンコードを承認する必要がある一連のチャネル メンバーは、/Channel/Application/LifecycleEndorsement ポリシーによって管理されます。デフォルトでは、チェーンコードをチャネルで使用する前に、チャネル メンバーの過半数がそのチェーンコードを承認する必要があります。したがって、チャネルには組織が 2 つしかなく、2 つの組織の過半数は 2 であるため、Org1 と Org2 は基本チェーン コードを同時に承認する必要があります。

組織がピアにチェーンコードをインストールしている場合、組織が承認したチェーンコード定義に packageID を含める必要があります。packageID は、ピア ノードにインストールされているチェーンコードを承認されたチェーンコード定義と関連付けるために使用され、組織がチェーンコードを使用してトランザクションを承認できるようにします。ピア ライフサイクル チェーンコード queryinstalled コマンドを使用して、ピアにインストールされている packageID をクエリできます。

peer lifecycle chaincode queryinstalled

 packageID は、チェーンコード ラベルとチェーンコード バイナリのハッシュの組み合わせであり、各ピアは同じ packageID を生成します。

 次に、チェーンコードを承認するときに packageID を使用するため、環境変数を設定し、返された packageID を以下のコマンドに貼り付けます。注:すべてのユーザーが同じ packageID を持っているわけではありません。この手順は、クエリによって返された packageID に基づいて完了する必要があります。

export CC_PACKAGE_ID=basic_1.0:dee2d612e15f5059478b9048fa4b3c9f792096554841d642b9b59099fa0e04a4
export ORDERER_CA=${PWD}/organizations/ordererOrganizations/hmw.com/tlsca/tlsca.hmw.com-cert.pem
peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer0.hmw.com --tls --cafile "$ORDERER_CA" --channelID mychannel --name basic --version 1.0 --package-id $CC_PACKAGE_ID --sequence 1

上記のコマンドは、 --package-id フラグを使用して、チェーンコード定義にパッケージ識別子を含めます。 --sequence パラメーターは、チェーンコードが最初にチャネルにデプロイされてから、チェーンコードが定義または更新された回数を追跡する整数です, したがって、シーケンス番号は 1 です。基本チェーンコードをアップグレードすると、シリアル番号が 2 に増えます。提供されている低レベルのファブリック チェーンコード Shim API を使用している場合は、上記のコマンドに --init-required フラグを渡して、チェーンコードを初期化するための Init 関数の実行をリクエストできます。チェーンコード内の他の関数を使用して台帳と対話できるようにするには、チェーンコードへの最初の呼び出しで Init 関数をターゲットにし、 --isInit フラグを含める必要があります。

先ほどはOrg2のID承認チェーンコード定義を使用しましたが、Org1も同様に環境変数を設定してOrg1の承認チェーンコード定義を完成させます。

基本的なチェーンコードをチャネル上のほとんどのノードにデプロイしました。チェーンコード定義 (デフォルト ポリシー) を承認する必要があるのはほとんどの組織だけですが、ピアノードでチェーンコードを開始する前に、すべての組織がチェーンコード定義を承認する必要があります。チャネルメンバーがチェーンコードを承認する前に定義を送信すると、組織はトランザクションを承認できなくなるため、すべてのチャネルメンバーがチェーンコードを送信する前に承認することをお勧めします。

2.5 チェーンコード定義をチャネルに送信する

十分な数の組織がチェーンコード定義を承認した後、組織はチェーンコード定義をチャネルに送信できます。チャネル メンバーの過半数がチェーンコード定義を承認すると、トランザクションは正常に送信され、チェーンコード定義で合意されたパラメータがチャンネル上で実現しました。

ピア ライフサイクル チェーンコード checkcommitreadiness コマンドを使用して、チャネル メンバーが同じチェーンコード定義を承認したかどうかを確認できます。この checkcommitreadiness コマンドに使用されるフラグは、組織のチェーンコードを承認するために使用されるものと同じです。ただし、--package は必要ありません。フラグ。

peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name basic --version 1.0 --sequence 1  --output json

このコマンドは、チャネルメンバーが checkcommitreadiness コマンドで指定されたパラメーターを承認するかどうかを示す JSON マップを生成します。

チャネルのメンバーである両方の組織が同じパラメータを承認しているため、チェーンコード定義をチャネルに送信する準備ができています。チェーンコードは、ピア ライフサイクル チェーンコード commit コマンドを使用してチャネルに送信できます。commit コマンドには組織管理者が必要です提出してください。

export PEER0_ORG1_CA=${PWD}/organizations/peerOrganizations/org1.hmw.com/tlsca/tlsca.org1.hmw.com-cert.pem
export PEER0_ORG2_CA=${PWD}/organizations/peerOrganizations/org2.hmw.com/tlsca/tlsca.org2.hmw.com-cert.pem
peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer0.hmw.com --channelID mychannel --name basic --version 1.0 --sequence 1 --tls --cafile "$ORDERER_CA" --peerAddresses localhost:8051 --tlsRootCertFiles "$PEER0_ORG1_CA" --peerAddresses localhost:8055 --tlsRootCertFiles "$PEER0_ORG2_CA"

上記のトランザクションでは、--peerAddresses フラグを使用して、Org1 のpeer0.org1.hmw.com と Org2 のpeer0.org2.hmw.com を見つけます。コミットトランザクションは、チャネルに参加しているピアに送信され、ピアを運営している組織によって承認されたチェーンコード定義を照会します。このコマンドは、チェーンコードを展開するためのポリシーを満たすために、十分な数の組織のピアをターゲットにする必要があります。承認は各組織内で分散されるため、チャネルのメンバーである任意のピアを対象にすることができます

チャネルメンバーによるチェーンコード定義の承認は、ブロックに追加されてチャネルに配布されるために順序付けサービスに送信されます。次に、チャネル上のピアは、十分な数の組織がチェーンコード定義を承認していることを確認し、ピア ライフサイクル チェーンコード commit コマンドは、応答を返す前にピアの検証を待機します。

ピア ライフサイクル チェーンコード querycommitted コマンドを使用して、チェーンコードがチャネルに送信されているかどうかを確認できます。

peer lifecycle chaincode querycommitted --channelID mychannel --name basic --cafile "$ORDERER_CA"

チェーンコードがチャネルに正常に送信されると、querycommitted コマンドはチェーンコードで定義されたシーケンスとバージョンを返します。

 

2.6 コールチェーンコード

チェーンコード定義がチャネルに送信されると、チェーンコードがインストールされているチャネルに参加するピアでチェーンコードが開始されます。これで、資産転送 (基本) チェーンコードをクライアント アプリケーションから呼び出す準備が整いました。次のコマンドを使用して、レジャー上に資産の初期セットを作成します。invoke コマンドは、チェーンコードの承認ポリシーを満たすのに十分な数のピアをターゲットにする必要があることに注意してください。(CLI はファブリック ゲートウェイ ピアにアクセスしないため、各承認ノードを指定する必要があることに注意してください。)

peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer0.hmw.com --tls --cafile "$ORDERER_CA" -C mychannel -n basic --peerAddresses localhost:8051 --tlsRootCertFiles "$PEER0_ORG1_CA" --peerAddresses localhost:8055 --tlsRootCertFiles "$PEER0_ORG2_CA" -c '{"function":"InitLedger","Args":[]}'

コマンドが成功すると、次のような応答が表示されるはずです。

 クエリ関数を使用して、チェーンコードによって作成された車のコレクションを読み取ることができます。

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

 コマンドが成功すると、次のような応答が表示されるはずです。

この時点でチェーンコードのインストールは完了です

関連コードについては、Centos7 Fabric2.4導入で使用するスクリプト_Bigを参照してください。


おすすめ

転載: blog.csdn.net/humingwei11/article/details/124128749