diff --git a/asset-transfer-basic/application-javascript/app.js b/asset-transfer-basic/application-javascript/app.js index b307ec83..43fd6260 100644 --- a/asset-transfer-basic/application-javascript/app.js +++ b/asset-transfer-basic/application-javascript/app.js @@ -6,16 +6,17 @@ 'use strict'; -const {Gateway, Wallets} = require('fabric-network'); +const { Gateway, Wallets } = require('fabric-network'); const FabricCAServices = require('fabric-ca-client'); const path = require('path'); -const {buildCAClient, registerAndEnrollUser, enrollAdmin} = require('../../test-application/javascript/CAUtil.js'); -const {buildCCP, buildWallet} = require('../../test-application/javascript/AppUtil.js'); +const { buildCAClient, registerAndEnrollUser, enrollAdmin } = require('../../test-application/javascript/CAUtil.js'); +const { buildCCPOrg1, buildWallet } = require('../../test-application/javascript/AppUtil.js'); const channelName = 'mychannel'; const chaincodeName = 'basic'; +const mspOrg1 = 'Org1MSP'; const walletPath = path.join(__dirname, 'wallet'); -const userId = 'appUser'; +const org1UserId = 'appUser'; function prettyJSONString(inputString) { return JSON.stringify(JSON.parse(inputString), null, 2); @@ -71,21 +72,21 @@ function prettyJSONString(inputString) { async function main() { try { // build an in memory object with the network configuration (also known as a connection profile) - const ccp = buildCCP(); + const ccp = buildCCPOrg1(); // build an instance of the fabric ca services client based on // the information in the network configuration - const caClient = buildCAClient(FabricCAServices, ccp); + const caClient = buildCAClient(FabricCAServices, ccp, 'ca.org1.example.com'); // setup the wallet to hold the credentials of the application user const wallet = await buildWallet(Wallets, walletPath); // in a real application this would be done on an administrative flow, and only once - await enrollAdmin(caClient, wallet); + await enrollAdmin(caClient, wallet, mspOrg1); // in a real application this would be done only when a new user was required to be added // and would be part of an administrative flow - await registerAndEnrollUser(caClient, wallet, userId, 'org1.department1'); + await registerAndEnrollUser(caClient, wallet, mspOrg1, org1UserId, 'org1.department1'); // Create a new gateway instance for interacting with the fabric network. // In a real application this would be done as the backend server session is setup for @@ -99,8 +100,8 @@ async function main() { // signed by this user using the credentials stored in the wallet. await gateway.connect(ccp, { wallet, - identity: userId, - discovery: {enabled: true, asLocalhost: true} // using asLocalhost as this gateway is using a fabric network deployed locally + identity: org1UserId, + discovery: { enabled: true, asLocalhost: true } // using asLocalhost as this gateway is using a fabric network deployed locally }); // Build a network instance based on the channel where the smart contract is deployed diff --git a/asset-transfer-ledger-queries/application-javascript/app.js b/asset-transfer-ledger-queries/application-javascript/app.js index ef9bb653..75fe3045 100644 --- a/asset-transfer-ledger-queries/application-javascript/app.js +++ b/asset-transfer-ledger-queries/application-javascript/app.js @@ -6,14 +6,16 @@ 'use strict'; -const {Gateway, Wallets} = require('fabric-network'); +const { Gateway, Wallets } = require('fabric-network'); const FabricCAServices = require('fabric-ca-client'); const path = require('path'); -const {buildCAClient, registerAndEnrollUser, enrollAdmin} = require('../../test-application/javascript/CAUtil.js'); -const {buildCCP, buildWallet} = require('../../test-application/javascript/AppUtil.js'); +const { buildCAClient, registerAndEnrollUser, enrollAdmin } = require('../../test-application/javascript/CAUtil.js'); +const { buildCCPOrg1, buildWallet } = require('../../test-application/javascript/AppUtil.js'); const channelName = 'mychannel'; const chaincodeName = 'ledger'; +const mspOrg1 = 'Org1MSP'; + const walletPath = path.join(__dirname, 'wallet'); const userId = 'appUser'; @@ -78,21 +80,21 @@ async function main() { try { // build an in memory object with the network configuration (also known as a connection profile) - const ccp = buildCCP(); + const ccp = buildCCPOrg1(); // build an instance of the fabric ca services client based on // the information in the network configuration - const caClient = buildCAClient(FabricCAServices, ccp); + const caClient = buildCAClient(FabricCAServices, ccp, 'ca.org1.example.com'); // setup the wallet to hold the credentials of the application user const wallet = await buildWallet(Wallets, walletPath); // in a real application this would be done on an administrative flow, and only once - await enrollAdmin(caClient, wallet); + await enrollAdmin(caClient, wallet, mspOrg1); // in a real application this would be done only when a new user was required to be added // and would be part of an administrative flow - await registerAndEnrollUser(caClient, wallet, userId, 'org1.department1'); + await registerAndEnrollUser(caClient, wallet, mspOrg1, userId, 'org1.department1'); // Create a new gateway instance for interacting with the fabric network. // In a real application this would be done as the backend server session is setup for @@ -107,7 +109,7 @@ async function main() { await gateway.connect(ccp, { wallet, identity: userId, - discovery: {enabled: true, asLocalhost: true} // using asLocalhost as this gateway is using a fabric network deployed locally + discovery: { enabled: true, asLocalhost: true } // using asLocalhost as this gateway is using a fabric network deployed locally }); // Build a network instance based on the channel where the smart contract is deployed @@ -125,7 +127,7 @@ async function main() { console.log('\n--> Submit Transaction: InitLedger, function creates the initial set of assets on the ledger'); await contract.submitTransaction('InitLedger'); console.log('*** Result: committed'); - } catch(initError) { + } catch (initError) { // this is error is OK if we are rerunning this app without restarting console.log(`******** initLedger failed :: ${initError}`) } @@ -189,7 +191,7 @@ async function main() { // Rich Query with Pagination (Only supported if CouchDB is used as state database) console.log('\n--> Evaluate Transaction: QueryAssetsWithPagination, function returns "Tom" assets'); - result = await contract.evaluateTransaction('QueryAssetsWithPagination', '{"selector":{"docType":"asset","owner":"Tom"}, "use_index":["_design/indexOwnerDoc", "indexOwner"]}','3',''); + result = await contract.evaluateTransaction('QueryAssetsWithPagination', '{"selector":{"docType":"asset","owner":"Tom"}, "use_index":["_design/indexOwnerDoc", "indexOwner"]}', '3', ''); console.log(`*** Result: ${prettyJSONString(result.toString())}`); console.log('\n--> Submit Transaction: TransferAssetByColor, transfer all yellow assets to new owner(Michel)'); diff --git a/asset-transfer-private-data/application-javascript/app.js b/asset-transfer-private-data/application-javascript/app.js index 93556f96..edac6185 100644 --- a/asset-transfer-private-data/application-javascript/app.js +++ b/asset-transfer-private-data/application-javascript/app.js @@ -8,10 +8,9 @@ const { Gateway, Wallets } = require('fabric-network'); const FabricCAServices = require('fabric-ca-client'); - const path = require('path'); -const fs = require('fs'); -const caUtils = require('./caUtils'); +const { buildCAClient, registerAndEnrollUser, enrollAdmin } = require('../../test-application/javascript/CAUtil.js'); +const { buildCCPOrg1, buildCCPOrg2, buildWallet } = require('../../test-application/javascript/AppUtil.js'); const myChannel = 'mychannel'; const myChaincodeName = 'private'; @@ -19,8 +18,11 @@ const myChaincodeName = 'private'; const memberAssetCollectionName = 'assetCollection'; const org1PrivateCollectionName = 'Org1MSPPrivateCollection'; const org2PrivateCollectionName = 'Org2MSPPrivateCollection'; -const mspOrg2 = 'Org2MSP'; const mspOrg1 = 'Org1MSP'; +const mspOrg2 = 'Org2MSP'; +const Org1UserId = 'appUser1'; +const Org2UserId = 'appUser2'; + function prettyJSONString(inputString) { if (inputString) { return JSON.stringify(JSON.parse(inputString), null, 2); @@ -31,36 +33,33 @@ function prettyJSONString(inputString) { } async function initContractFromOrg1Identity() { - console.log('\nFabric client user & Gateway init: Using Org1 identity to Org1 Peer'); - // load the network configuration - let ccpPath = path.resolve(__dirname, '..', '..', 'test-network', 'organizations', 'peerOrganizations', 'org1.example.com', 'connection-org1.json'); - let fileExists = fs.existsSync(ccpPath); - if (!fileExists) { - throw new Error(`no such file or directory: ${ccpPath}`); - } - let ccpOrg1 = JSON.parse(fs.readFileSync(ccpPath, 'utf8')); - // Create a new file system based wallet for managing identities. + console.log('\n--> Fabric client user & Gateway init: Using Org1 identity to Org1 Peer'); + // build an in memory object with the network configuration (also known as a connection profile) + const ccpOrg1 = buildCCPOrg1(); + + // build an instance of the fabric ca services client based on + // the information in the network configuration + const caOrg1Client = buildCAClient(FabricCAServices, ccpOrg1, 'ca.org1.example.com'); + + // setup the wallet to cache the credentials of the application user, on the app server locally const walletPathOrg1 = path.join(__dirname, 'wallet/org1'); - const walletOrg1 = await Wallets.newFileSystemWallet(walletPathOrg1); - console.log(`Org1 wallet path: ${walletPathOrg1}`); + const walletOrg1 = await buildWallet(Wallets, walletPathOrg1); - // Create a new CA client for interacting with this Orgs CA. - const caInfo = ccpOrg1.certificateAuthorities['ca.org1.example.com']; - const caTLSCACerts = caInfo.tlsCACerts.pem; - const caService = new FabricCAServices(caInfo.url, { trustedRoots: caTLSCACerts, verify: false }, caInfo.caName); - - // register & enroll admin user with CA, stores admin identity in local wallet - await caUtils.EnrollOrgAdminUser(mspOrg1, walletOrg1, caService); - - // register & enroll application user with CA, which is used as client identify to make chaincode calls, stores app user identity in local wallet - await caUtils.RegisterOrgUser(caUtils.Org1UserId, mspOrg1, walletOrg1, caService); + // in a real application this would be done on an administrative flow, and only once + // stores admin identity in local wallet, if needed + await enrollAdmin(caOrg1Client, walletOrg1, mspOrg1); + // register & enroll application user with CA, which is used as client identify to make chaincode calls + // and stores app user identity in local wallet + // In a real application this would be done only when a new user was required to be added + // and would be part of an administrative flow + await registerAndEnrollUser(caOrg1Client, walletOrg1, mspOrg1, Org1UserId, 'org1.department1'); try { // Create a new gateway for connecting to Org's peer node. const gatewayOrg1 = new Gateway(); //connect using Discovery enabled await gatewayOrg1.connect(ccpOrg1, - { wallet: walletOrg1, identity: caUtils.Org1UserId, discovery: { enabled: true, asLocalhost: true } }); + { wallet: walletOrg1, identity: Org1UserId, discovery: { enabled: true, asLocalhost: true } }); return gatewayOrg1; } catch (error) { @@ -70,35 +69,21 @@ async function initContractFromOrg1Identity() { } async function initContractFromOrg2Identity() { - console.log('\nFabric client user & Gateway init: Using Org2 identity to Org2 Peer'); - // load the network configuration - let ccpPath = path.resolve(__dirname, '..', '..', 'test-network', 'organizations', 'peerOrganizations', 'org2.example.com', 'connection-org2.json'); - let fileExists = fs.existsSync(ccpPath); - if (!fileExists) { - throw new Error(`no such file or directory: ${ccpPath}`); - } - const ccpOrg2 = JSON.parse(fs.readFileSync(ccpPath, 'utf8')); + console.log('\n--> Fabric client user & Gateway init: Using Org2 identity to Org2 Peer'); + const ccpOrg2 = buildCCPOrg2(); + const caOrg2Client = buildCAClient(FabricCAServices, ccpOrg2, 'ca.org2.example.com'); - // Create a new file system based wallet for managing identities. const walletPathOrg2 = path.join(__dirname, 'wallet/org2'); - const walletOrg2 = await Wallets.newFileSystemWallet(walletPathOrg2); - console.log(`Org2 wallet path: ${walletPathOrg2}`); + const walletOrg2 = await buildWallet(Wallets, walletPathOrg2); - // Create a new CA client for interacting with this Orgs CA. - const caInfo = ccpOrg2.certificateAuthorities['ca.org2.example.com']; - const caTLSCACerts = caInfo.tlsCACerts.pem; - const caService = new FabricCAServices(caInfo.url, { trustedRoots: caTLSCACerts, verify: false }, caInfo.caName); - - await caUtils.EnrollOrgAdminUser(mspOrg2, walletOrg2, caService); - - // register & enroll application user with CA, which is used as client identify to make chaincode calls, stores app user identity in local wallet - await caUtils.RegisterOrgUser(caUtils.Org2UserId, mspOrg2, walletOrg2, caService); + await enrollAdmin(caOrg2Client, walletOrg2, mspOrg2); + await registerAndEnrollUser(caOrg2Client, walletOrg2, mspOrg2, Org2UserId, 'org2.department1'); try { // Create a new gateway for connecting to Org's peer node. const gatewayOrg2 = new Gateway(); await gatewayOrg2.connect(ccpOrg2, - { wallet: walletOrg2, identity: caUtils.Org2UserId, discovery: { enabled: true, asLocalhost: true } }); + { wallet: walletOrg2, identity: Org2UserId, discovery: { enabled: true, asLocalhost: true } }); return gatewayOrg2; } catch (error) { @@ -149,7 +134,7 @@ async function main() { result = await statefulTxn.submit(); //Add asset2 - console.log('Submit Transaction: CreateAsset ' + assetID2); + console.log('\n--> Submit Transaction: CreateAsset ' + assetID2); statefulTxn = contractOrg1.createTransaction('CreateAsset'); tmapData = Buffer.from(JSON.stringify(asset2Data)); statefulTxn.setTransient({ @@ -157,21 +142,20 @@ async function main() { }); result = await statefulTxn.submit(); - console.log('\n***********************'); - console.log('Evaluate Transaction: GetAssetByRange asset0-asset9'); + + console.log('\n--> Evaluate Transaction: GetAssetByRange asset0-asset9'); // GetAssetByRange returns assets on the ledger with ID in the range of startKey (inclusive) and endKey (exclusive) result = await contractOrg1.evaluateTransaction('GetAssetByRange', 'asset0', 'asset9'); console.log(' result: ' + prettyJSONString(result.toString())); - console.log('\n***********************'); - console.log('Evaluate Transaction: ReadAssetPrivateDetails from ' + org1PrivateCollectionName); + console.log('\n--> Evaluate Transaction: ReadAssetPrivateDetails from ' + org1PrivateCollectionName); // ReadAssetPrivateDetails reads data from Org's private collection. Args: collectionName, assetID result = await contractOrg1.evaluateTransaction('ReadAssetPrivateDetails', org1PrivateCollectionName, assetID1); console.log(' result: ' + prettyJSONString(result.toString())); console.log('\n~~~~~~~~~~~~~~~~ As Org2 Client ~~~~~~~~~~~~~~~~'); - console.log('Evaluate Transaction: ReadAsset ' + assetID1); + console.log('\n--> Evaluate Transaction: ReadAsset ' + assetID1); result = await contractOrg2.evaluateTransaction('ReadAsset', assetID1); console.log(' result: ' + prettyJSONString(result.toString())); let assetOwner = JSON.parse(result.toString()).owner; @@ -183,7 +167,7 @@ async function main() { // Buyer from Org2 agrees to buy the asset assetID1 // // To purchase the asset, the buyer needs to agree to the same value as the asset owner let dataForAgreement = { assetID: assetID1, appraisedValue: 100 }; - console.log('\nSubmit Transaction: AgreeToTransfer payload ' + JSON.stringify(dataForAgreement)); + console.log('\n--> Submit Transaction: AgreeToTransfer payload ' + JSON.stringify(dataForAgreement)); statefulTxn = contractOrg2.createTransaction('AgreeToTransfer'); tmapData = Buffer.from(JSON.stringify(dataForAgreement)); statefulTxn.setTransient({ @@ -203,13 +187,13 @@ async function main() { console.log('\n**************** As Org1 Client ****************'); // All members can send txn ReadTransferAgreement, set by Org2 above - console.log('Evaluate Transaction: ReadTransferAgreement ' + assetID1); + console.log('\n--> Evaluate Transaction: ReadTransferAgreement ' + assetID1); result = await contractOrg1.evaluateTransaction('ReadTransferAgreement', assetID1); console.log(' result: ' + prettyJSONString(result.toString())); // Transfer the asset to Org2 // // To transfer the asset, the owner needs to pass the MSP ID of new asset owner, and initiate the transfer - console.log('Submit Transaction: TransferAsset ' + assetID1); + console.log('\n--> Submit Transaction: TransferAsset ' + assetID1); let buyerDetails = { assetID: assetID1, buyerMSP: mspOrg2 }; statefulTxn = contractOrg1.createTransaction('TransferAsset'); tmapData = Buffer.from(JSON.stringify(buyerDetails)); @@ -218,27 +202,27 @@ async function main() { }); result = await statefulTxn.submit(); - console.log('\n***********************'); + //Again ReadAsset : results will show that the buyer identity now owns the asset: - console.log('Evaluate Transaction: ReadAsset ' + assetID1); + console.log('\n--> Evaluate Transaction: ReadAsset ' + assetID1); result = await contractOrg1.evaluateTransaction('ReadAsset', assetID1); console.log(' result: ' + prettyJSONString(result.toString())); assetOwner = JSON.parse(result.toString()).owner; console.log(' Asset owner: ' + Buffer.from(assetOwner, 'base64').toString()); //Confirm that transfer removed the private details from the Org1 collection: - console.log('Evaluate Transaction: ReadAssetPrivateDetails'); + console.log('\n--> Evaluate Transaction: ReadAssetPrivateDetails'); // ReadAssetPrivateDetails reads data from Org's private collection: Should return empty result = await contractOrg1.evaluateTransaction('ReadAssetPrivateDetails', org1PrivateCollectionName, assetID1); console.log(' result: ' + prettyJSONString(result.toString())); - console.log('Evaluate Transaction: ReadAsset ' + assetID2); + console.log('\n--> Evaluate Transaction: ReadAsset ' + assetID2); result = await contractOrg1.evaluateTransaction('ReadAsset', assetID2); console.log(' result: ' + prettyJSONString(result.toString())); - console.log('\n***********************'); + console.log('\n********* Demo deleting asset **************'); // Delete Asset2 - console.log('Deleting Asset ' + assetID2); + console.log('--> Submit Transaction: DeleteAsset ' + assetID2); statefulTxn = contractOrg1.createTransaction('DeleteAsset'); let dataForDelete = { assetID: assetID2 }; @@ -247,13 +231,14 @@ async function main() { asset_delete: tmapData }); result = await statefulTxn.submit(); - console.log('Evaluate Transaction: ReadAsset ' + assetID2); + + console.log('\n--> Evaluate Transaction: ReadAsset ' + assetID2); result = await contractOrg1.evaluateTransaction('ReadAsset', assetID2); console.log(' result: ' + prettyJSONString(result.toString())); console.log('\n~~~~~~~~~~~~~~~~ As Org2 Client ~~~~~~~~~~~~~~~~'); // Org2 can ReadAssetPrivateDetails: Org2 is owner, and private details exist in new owner's Collection - console.log('Evaluate Transaction as Org2: ReadAssetPrivateDetails ' + assetID1 + ' from ' + org2PrivateCollectionName); + console.log('\n--> Evaluate Transaction as Org2: ReadAssetPrivateDetails ' + assetID1 + ' from ' + org2PrivateCollectionName); result = await contractOrg2.evaluateTransaction('ReadAssetPrivateDetails', org2PrivateCollectionName, assetID1); console.log(' result: ' + prettyJSONString(result.toString())); } finally { diff --git a/asset-transfer-private-data/application-javascript/caUtils.js b/asset-transfer-private-data/application-javascript/caUtils.js deleted file mode 100644 index 645a8378..00000000 --- a/asset-transfer-private-data/application-javascript/caUtils.js +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright IBM Corp. All Rights Reserved. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -'use strict'; - -const adminUserId = 'admin'; -const adminUserPasswd = 'adminpw'; -const org1UserId = 'appUser1'; -const org2UserId = 'appUser2'; -const caChaincodeUserRole = 'client'; - -async function registerOrgUser(appUserId, mspId, wallet, caService) { - try { - // Check to see if we've already enrolled the user. - const userIdentity = await wallet.get(appUserId); - if (userIdentity) { - console.log('An identity for the user ' + appUserId + ' already exists in the wallet'); - return; - } - - // Check to see if we've already enrolled the admin user. - const adminIdentity = await wallet.get(adminUserId); - if (!adminIdentity) { - console.log('An identity for the admin user does not exist in the wallet'); - console.log('Call enrollAdmin for admin user enroll before retrying'); - return; - } - - // build a user object for authenticating with the CA - const provider = wallet.getProviderRegistry().getProvider(adminIdentity.type); - const adminUser = await provider.getUserContext(adminIdentity, adminUserId); - - // Register the user, enroll the user, and import the new identity into the wallet. - // if affiliation is specified by client, the affiliation value must be configured in CA - const secret = await caService.register({ - affiliation: 'org2.department1', - enrollmentID: appUserId, - role: caChaincodeUserRole - }, adminUser); - const enrollment = await caService.enroll({ - enrollmentID: appUserId, - enrollmentSecret: secret - }); - const x509Identity = { - credentials: { - certificate: enrollment.certificate, - privateKey: enrollment.key.toBytes(), - }, - mspId: mspId, - type: 'X.509', - }; - await wallet.put(appUserId, x509Identity); - console.log('Successfully registered and enrolled user ' + appUserId + ' and imported it into the wallet'); - - } catch (error) { - console.error(`Failed to register user : ${error}`); - process.exit(1); - } -} - -async function enrollOrgAdminUser(mspId, wallet, caService) { - try { - - // Check to see if we've already enrolled the admin user. - const identity = await wallet.get(adminUserId); - if (identity) { - console.log('An identity for the admin user already exists in the wallet'); - return; - } - - // Enroll the admin user, and import the new identity into the wallet. - const enrollment = await caService.enroll({ enrollmentID: adminUserId, enrollmentSecret: adminUserPasswd }); - const x509Identity = { - credentials: { - certificate: enrollment.certificate, - privateKey: enrollment.key.toBytes(), - }, - mspId: mspId, - type: 'X.509', - }; - await wallet.put(adminUserId, x509Identity); - console.log('Successfully enrolled admin user and imported it into the wallet'); - - } catch (error) { - console.error(`Failed to enroll admin user : ${error}`); - process.exit(1); - } -} - -exports.AdminUserId = adminUserId; -exports.Org1UserId = org1UserId; -exports.Org2UserId = org2UserId; -exports.RegisterOrgUser = registerOrgUser; -exports.EnrollOrgAdminUser = enrollOrgAdminUser; \ No newline at end of file diff --git a/test-application/javascript/AppUtil.js b/test-application/javascript/AppUtil.js index 50640306..ef1b0df8 100644 --- a/test-application/javascript/AppUtil.js +++ b/test-application/javascript/AppUtil.js @@ -9,7 +9,7 @@ const fs = require('fs'); const path = require('path'); -exports.buildCCP = () => { +exports.buildCCPOrg1 = () => { // load the common connection configuration file const ccpPath = path.resolve(__dirname, '..', '..', 'test-network', 'organizations', 'peerOrganizations', 'org1.example.com', 'connection-org1.json'); const fileExists = fs.existsSync(ccpPath); @@ -25,6 +25,23 @@ exports.buildCCP = () => { return ccp; }; +exports.buildCCPOrg2 = () => { + // load the common connection configuration file + const ccpPath = path.resolve(__dirname, '..', '..', 'test-network', + 'organizations', 'peerOrganizations', 'org2.example.com', 'connection-org2.json'); + const fileExists = fs.existsSync(ccpPath); + if (!fileExists) { + throw new Error(`no such file or directory: ${ccpPath}`); + } + const contents = fs.readFileSync(ccpPath, 'utf8'); + + // build a JSON object from the file contents + const ccp = JSON.parse(contents); + + console.log(`Loaded the network configuration located at ${ccpPath}`); + return ccp; +}; + exports.buildWallet = async (Wallets, walletPath) => { // Create a new wallet : Note that wallet is for managing identities. let wallet; diff --git a/test-application/javascript/CAUtil.js b/test-application/javascript/CAUtil.js index 1d192352..10ec7344 100644 --- a/test-application/javascript/CAUtil.js +++ b/test-application/javascript/CAUtil.js @@ -14,9 +14,9 @@ const adminUserPasswd = 'adminpw'; * @param {*} FabricCAServices * @param {*} ccp */ -exports.buildCAClient = (FabricCAServices, ccp) => { +exports.buildCAClient = (FabricCAServices, ccp, caHostName) => { // Create a new CA client for interacting with the CA. - const caInfo = ccp.certificateAuthorities['ca.org1.example.com']; + const caInfo = ccp.certificateAuthorities[caHostName]; //lookup CA details from config const caTLSCACerts = caInfo.tlsCACerts.pem; const caClient = new FabricCAServices(caInfo.url, { trustedRoots: caTLSCACerts, verify: false }, caInfo.caName); @@ -24,7 +24,7 @@ exports.buildCAClient = (FabricCAServices, ccp) => { return caClient; }; -exports.enrollAdmin = async (caClient, wallet) => { +exports.enrollAdmin = async (caClient, wallet, orgMspId) => { try { // Check to see if we've already enrolled the admin user. const identity = await wallet.get(adminUserId); @@ -40,7 +40,7 @@ exports.enrollAdmin = async (caClient, wallet) => { certificate: enrollment.certificate, privateKey: enrollment.key.toBytes(), }, - mspId: 'Org1MSP', + mspId: orgMspId, type: 'X.509', }; await wallet.put(adminUserId, x509Identity); @@ -50,7 +50,7 @@ exports.enrollAdmin = async (caClient, wallet) => { } }; -exports.registerAndEnrollUser = async (caClient, wallet, userId, affiliation) => { +exports.registerAndEnrollUser = async (caClient, wallet, orgMspId, userId, affiliation) => { try { // Check to see if we've already enrolled the user const userIdentity = await wallet.get(userId); @@ -87,7 +87,7 @@ exports.registerAndEnrollUser = async (caClient, wallet, userId, affiliation) = certificate: enrollment.certificate, privateKey: enrollment.key.toBytes(), }, - mspId: 'Org1MSP', + mspId: orgMspId, type: 'X.509', }; await wallet.put(userId, x509Identity);