註冊管理員賬號

在上一節中執行query和invote前,必須要先註冊管理員,因此本節我們重點來講解下注冊管理員的代碼

打開$GOPATH/src/github.com/hyperledger/fabric-samples/fabcar/javascript/enrollAdmin.js 文件,我們來看看代碼。

開啓javascript的嚴格模式,目的是指定代碼在嚴格條件下執行。嚴格模式下你不能使用未聲明的變量

'use strict';

加載fabric證書服務

const FabricCAServices = require('fabric-ca-client');

加載fabric的network網絡服務

const { Wallets } = require('fabric-network');

加載fs文件系統模塊,實現對文件或目錄的創建,修改和刪除等操作

const fs = require('fs');

加載path模塊,它提供了一些用於處理文件路徑的小工具

const path = require('path');

定義一個異步主函數,異步函數是指通過事件循環異步執行的函數,它會通過一個隱式的 Promise 返回其結果

async function main() {
    try {
        ...
    } catch (error) {
        console.error(`Failed to enroll admin user "admin": ${error}`);
        process.exit(1);
    }
}

接下來我們看看try部分裏面的業務代碼

第一部分:加載test-network網絡中組織1的的連接配置信息

path.resolve的可理解爲是當前目錄執行一個cd操作,從左到右執行,返回的是最後的當前目錄
如下面的語句就是:

cd __dirname  //返回:$GOPATH/src/github.com/hyperledger/fabric-samples/fabcar/javascript
cd ..  //返回:$GOPATH/src/github.com/hyperledger/fabric-samples/fabcar
cd ..  //返回:$GOPATH/src/github.com/hyperledger/fabric-samples
cd test-network  //返回:$GOPATH/src/github.com/hyperledger/fabric-samples/test-network

其它的類推,最終得到的ccpPath的值是:
$GOPATH/src/github.com/hyperledger/fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/connection-org1.json

const ccpPath = path.resolve(__dirname, '..', '..', 'test-network', 'organizations', 'peerOrganizations', 'org1.example.com', 'connection-org1.json');

獲取到connection-org1.json的參數並轉爲json格式,方便後面使用,這個文件的參數會在最後說明

const ccp = JSON.parse(fs.readFileSync(ccpPath, 'utf8'));

第二部分:創建一個新的CA客戶端以與CA服務進行交互.

先獲取配置文件中的ca.org1.example.com選項的參數,caInfo得到的值爲:
{"url": "https://localhost:7054","caName": "ca-org1","tlsCACerts": {"pem": "內容太多,這是省略..."},"httpOptions": {"verify": false}}

const caInfo = ccp.certificateAuthorities['ca.org1.example.com'];

獲取配置文件中ca公鑰

const caTLSCACerts = caInfo.tlsCACerts.pem;

實例化一個CA服務

const ca = new FabricCAServices(caInfo.url, { trustedRoots: caTLSCACerts, verify: false }, caInfo.caName);

第三部分:創建一個新的基於文件系統的錢包來管理身份。

生成錢包的路徑。

process.cwd() 是獲取當前node命令執行時所在的文件夾目錄,與上面的__dirname不同,它指被執行js文件所在的文件夾目錄。當然我們這次就是在enrollAdmin.js根目錄下執行的,兩者得到的值是一樣的。

path.join是將路徑片段使用特定的分隔符(window:\)連接起來形成路徑,並規範化生成的路徑。

最終walletPath的值是:$GOPATH/src/github.com/hyperledger/fabric-samples/fabcar/javascript/wallet

const walletPath = path.join(process.cwd(), 'wallet');

根據錢包路徑生成錢包對應的目錄

const wallet = await Wallets.newFileSystemWallet(walletPath);
console.log(`Wallet path: ${walletPath}`);

如下圖我們看到它已經生成了wallet這個目錄

第四部分:查看我們是否已經註冊了管理員用戶

如果wallet目錄下已經存在admin.id這個文件就表示已經註冊過

const identity = await wallet.get('admin');
if (identity) {
      console.log('An identity for the admin user "admin" already exists in the wallet');
      return;
}

由此我們知道,註冊管理員只需要一次,後面不再需要重複註冊,如果要重新註冊,需要先刪除admin.id這個文件才行。

第五部分:註冊管理員用戶,並將新身份導入錢包

註冊賬號名爲admin,密碼爲adminpw的管理員賬號

const enrollment = await ca.enroll({ enrollmentID: 'admin', enrollmentSecret: 'adminpw' });

定義證書的參數,credentials是證書信息,mspId 組織ID,type要使用的證書類型

        const x509Identity = {
            credentials: {
                certificate: enrollment.certificate,
                privateKey: enrollment.key.toBytes(),
            },
            mspId: 'Org1MSP',
            type: 'X.509',
        };

通過同步的方式把admin管理員賬號註冊好並寫入到錢包目錄中

        await wallet.put('admin', x509Identity);
        console.log('Successfully enrolled admin user "admin" and imported it into the wallet');

// 執行主函數

main();

本文由小韋雲原創,轉載請註明出處:https://www.bctos.cn/doc/4/1831,否則追究其法律責任

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章