mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-18 16:05:10 +00:00
For some signing implementations, such as ed25519, a non-default hash implementation must be specified when creating the Gateway connection in client applications. Rather than relying on the default hash algorithm, it is probably good practice in general to specify an algorithm that is compatible with your signing implementation. This change explicitly specifies the hash algorithm to raise visibility of the option to select the hash algorithm. Signed-off-by: Mark S. Lewis <Mark.S.Lewis@outlook.com>
102 lines
3.9 KiB
TypeScript
102 lines
3.9 KiB
TypeScript
import * as grpc from '@grpc/grpc-js';
|
|
import { connect, Contract, hash, Identity, Signer, signers } from '@hyperledger/fabric-gateway';
|
|
import * as crypto from 'crypto';
|
|
import * as path from 'path';
|
|
|
|
import { promises as fs } from 'fs';
|
|
const channelName = envOrDefault('CHANNEL_NAME', 'mychannel');
|
|
const chaincodeName = envOrDefault('CHAINCODE_NAME', 'asset-transfer');
|
|
const mspId = envOrDefault('MSP_ID', 'Org1MSP');
|
|
//Local development and testing uncomment below code
|
|
// const WORKSHOP_CRYPTO =envOrDefault('CRYPTO_PATH', path.resolve(__dirname, '..','..', '..', 'infrastructure', 'sample-network', 'temp'));
|
|
// const keyPath = WORKSHOP_CRYPTO + "/enrollments/org1/users/org1user/msp/keystore/key.pem";
|
|
// const certPath = WORKSHOP_CRYPTO + "/enrollments/org1/users/org1user/msp/signcerts/cert.pem"
|
|
// const tlsCertPath = WORKSHOP_CRYPTO + "/channel-msp/peerOrganizations/org1/msp/tlscacerts/tlsca-signcert.pem";
|
|
|
|
// //kubenetes certificates file path
|
|
const WORKSHOP_CRYPTO = "/etc/secret-volume/"
|
|
const keyPath = WORKSHOP_CRYPTO + "keyPath";
|
|
const certPath = WORKSHOP_CRYPTO + "certPath"
|
|
const tlsCertPath = WORKSHOP_CRYPTO + "tlsCertPath";
|
|
console.log("keyPath " + keyPath);
|
|
console.log("certPath " + certPath);
|
|
console.log("tlsCertPath " + tlsCertPath);
|
|
const peerEndpoint = "test-network-org1-peer1-peer.localho.st:443";
|
|
const peerHostAlias = "test-network-org1-peer1-peer.localho.st";
|
|
export class Connection {
|
|
public static contract: Contract;
|
|
public init() {
|
|
initFabric();
|
|
}
|
|
}
|
|
async function initFabric(): Promise<void> {
|
|
// The gRPC client connection should be shared by all Gateway connections to this endpoint.
|
|
const client = await newGrpcConnection();
|
|
|
|
const gateway = connect({
|
|
client,
|
|
identity: await newIdentity(),
|
|
signer: await newSigner(),
|
|
hash: hash.sha256,
|
|
// Default timeouts for different gRPC calls
|
|
evaluateOptions: () => {
|
|
return { deadline: Date.now() + 5000 }; // 5 seconds
|
|
},
|
|
endorseOptions: () => {
|
|
return { deadline: Date.now() + 15000 }; // 15 seconds
|
|
},
|
|
submitOptions: () => {
|
|
return { deadline: Date.now() + 5000 }; // 5 seconds
|
|
},
|
|
commitStatusOptions: () => {
|
|
return { deadline: Date.now() + 60000 }; // 1 minute
|
|
},
|
|
});
|
|
|
|
try {
|
|
// Get a network instance representing the channel where the smart contract is deployed.
|
|
const network = gateway.getNetwork(channelName);
|
|
|
|
// Get the smart contract from the network.
|
|
const contract = network.getContract(chaincodeName);
|
|
Connection.contract = contract;
|
|
|
|
// Initialize a set of asset data on the ledger using the chaincode 'InitLedger' function.
|
|
// await initLedger(contract);
|
|
|
|
|
|
} catch (e: any) {
|
|
console.log('sample log');
|
|
console.log(e.message);
|
|
} finally {
|
|
console.log('error log ');
|
|
// gateway.close();
|
|
// client.close();
|
|
}
|
|
}
|
|
async function newGrpcConnection(): Promise<grpc.Client> {
|
|
const tlsRootCert = await fs.readFile(tlsCertPath);
|
|
const tlsCredentials = grpc.credentials.createSsl(tlsRootCert);
|
|
return new grpc.Client(peerEndpoint, tlsCredentials, {
|
|
'grpc.ssl_target_name_override': peerHostAlias,
|
|
});
|
|
}
|
|
|
|
async function newIdentity(): Promise<Identity> {
|
|
const credentials = await fs.readFile(certPath);
|
|
return { mspId, credentials };
|
|
}
|
|
|
|
async function newSigner(): Promise<Signer> {
|
|
//const files = await fs.readdir(keyDirectoryPath);
|
|
// path.resolve(keyDirectoryPath, files[0]);
|
|
const privateKeyPem = await fs.readFile(keyPath);
|
|
const privateKey = crypto.createPrivateKey(privateKeyPem);
|
|
return signers.newPrivateKeySigner(privateKey);
|
|
}
|
|
/**
|
|
* envOrDefault() will return the value of an environment variable, or a default value if the variable is undefined.
|
|
*/
|
|
function envOrDefault(key: string, defaultValue: string): string {
|
|
return process.env[key] || defaultValue;
|
|
}
|