Add sdk node sample
parent
9bd2bb397a
commit
be15c3ad6f
|
@ -1,41 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Install a chaincode
|
|
||||||
# Usage: ./script mspId peerAddr mspPath=${PWD}/msp-mspId name version path
|
|
||||||
|
|
||||||
# Entry function
|
|
||||||
main() {
|
|
||||||
if [ $# -lt 5 ]; then
|
|
||||||
echo "Not enough argument supplied"
|
|
||||||
echo "$(basename $0) mspId peerAddr mspPath=${PWD}/msp-mspId name version path"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
local mspId=$1
|
|
||||||
local peerAddr=$2
|
|
||||||
local mspPath=${3:-${PWD}/msp-${mspId}} # Suppose the local msp path named as msp-${msp_id}
|
|
||||||
local name=$4
|
|
||||||
local version=$5
|
|
||||||
local path=$6
|
|
||||||
local lang="golang"
|
|
||||||
|
|
||||||
export FABRIC_LOGGING_SPEC="debug"
|
|
||||||
export CORE_PEER_ADDRESS="${peerAddr}"
|
|
||||||
export CORE_PEER_LOCALMSPID=${mspId}
|
|
||||||
export CORE_PEER_MSPCONFIGPATH=${mspPath}
|
|
||||||
export CORE_PEER_TLS_ROOTCERT_FILE=${mspPath}/tlscacerts/tlsca.cert
|
|
||||||
export CORE_PEER_TLS_ENABLED=true
|
|
||||||
|
|
||||||
#export GRPC_GO_REQUIRE_HANDSHAKE=off
|
|
||||||
|
|
||||||
peer chaincode install \
|
|
||||||
-n ${name} \
|
|
||||||
-v $version \
|
|
||||||
-p ${path} \
|
|
||||||
-l ${lang} \
|
|
||||||
--peerAddresses "${peerAddr}" \
|
|
||||||
--tlsRootCertFiles "${CORE_PEER_TLS_ROOTCERT_FILE}"
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
|
@ -29,6 +29,12 @@ main() {
|
||||||
--peerAddresses "${peerAddr}" \
|
--peerAddresses "${peerAddr}" \
|
||||||
--tlsRootCertFiles "${CORE_PEER_TLS_ROOTCERT_FILE}"
|
--tlsRootCertFiles "${CORE_PEER_TLS_ROOTCERT_FILE}"
|
||||||
|
|
||||||
|
peer chaincode list \
|
||||||
|
--connTimeout=30s \
|
||||||
|
--instantiated \
|
||||||
|
--peerAddresses "${peerAddr}" \
|
||||||
|
--tlsRootCertFiles "${CORE_PEER_TLS_ROOTCERT_FILE}"
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Fetch a config block and decode it
|
|
||||||
|
|
||||||
setupChaincode() {
|
|
||||||
local channel=$1
|
|
||||||
local peerAddresses=$2
|
|
||||||
local tlsca_file=$3
|
|
||||||
|
|
||||||
peer chaincode instantiate \
|
|
||||||
-o "dhnodeouf5-bcsnativepreprod-iad.blockchain.ocp.oc-test.com:20003" \
|
|
||||||
-C ${channel} \
|
|
||||||
-n "exp02" \
|
|
||||||
-v "v1" \
|
|
||||||
-c '{"Args":["init","a","100","b","200"]}' \
|
|
||||||
-P "OR ('dhnodeOUf5.peer','dhnodeOUf6.peer')" \
|
|
||||||
--tls \
|
|
||||||
--cafile ${tlsca_file} \
|
|
||||||
--peerAddresses ${peerAddresses} \
|
|
||||||
--tlsRootCertFiles ${tlsca_file}
|
|
||||||
}
|
|
||||||
|
|
||||||
# getInstantiatedChaincode get the instantiated chaincode information
|
|
||||||
# Usage: getInstantiatedChaincode channel peer-addresses
|
|
||||||
getInstantiatedChaincode() {
|
|
||||||
local channel=$1
|
|
||||||
local peerAddresses=$2
|
|
||||||
local tlsca_file=$3
|
|
||||||
|
|
||||||
peer chaincode query \
|
|
||||||
--connTimeout 10s \
|
|
||||||
--channelID ${channel} \
|
|
||||||
-n "lscc" \
|
|
||||||
-c '{"Args":["getccdata","default","c040953"]}' \
|
|
||||||
--tls \
|
|
||||||
--peerAddresses ${peerAddresses} \
|
|
||||||
--tlsRootCertFiles ${tlsca_file}
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ $# -eq 0 ]; then
|
|
||||||
echo "Please use the <mspId> <channel> <ordererURL> as the argument"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
msp_id=$1
|
|
||||||
channel=$2
|
|
||||||
peerAddresses=$3
|
|
||||||
|
|
||||||
echo "msp_id=${msp_id}"
|
|
||||||
echo "channel=${channel}"
|
|
||||||
echo "peerAddresses=${peerAddresses}"
|
|
||||||
|
|
||||||
msp_path=${PWD}/msp-${msp_id} # Suppose the local msp path named as msp-${msp_id}
|
|
||||||
|
|
||||||
export FABRIC_LOGGING_SPEC="debug"
|
|
||||||
export CORE_PEER_LOCALMSPID=${msp_id}
|
|
||||||
#export CORE_PEER_ADDRESS=${peerAddresses}
|
|
||||||
export CORE_PEER_MSPCONFIGPATH=${msp_path}
|
|
||||||
export CORE_PEER_TLS_ROOTCERT_FILE=${msp_path}/tlscacerts/tlsca.cert
|
|
||||||
export CORE_PEER_TLS_ENABLED=true
|
|
||||||
|
|
||||||
setupChaincode ${channel} ${peerAddresses} ${msp_path}/tlscacerts/tlsca.cert
|
|
||||||
#getInstantiatedChaincode ${channel} ${peerAddresses} ${msp_path}/tlscacerts/tlsca.cert
|
|
|
@ -0,0 +1 @@
|
||||||
|
{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICKDCCAc+gAwIBAgIQSdBFJUgRkBhzmW9htYh+UjAKBggqhkjOPQQDAjBzMQsw\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\nYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu\nb3JnMS5leGFtcGxlLmNvbTAeFw0yMDA3MTcxODE5MDBaFw0zMDA3MTUxODE5MDBa\nMGsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T\nYW4gRnJhbmNpc2NvMQ4wDAYDVQQLEwVhZG1pbjEfMB0GA1UEAwwWQWRtaW5Ab3Jn\nMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJ2unYyG7FEY\n9oSq2tgtR7AMc0tto36cbwsLHEQ6aVPPwZAjkuTij6MpQxMf8gfLlw6cdBA898bG\nrL2DlttnwM6jTTBLMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1Ud\nIwQkMCKAIKqf36g/sCvMlxb5pAHInL/lz2U6RJfYRzgbC38Wrp5QMAoGCCqGSM49\nBAMCA0cAMEQCIBL+/AwRBeh13pl+cY8ZlcJsNPDXPDc41wKKche8zdSSAiB5i5Lu\n+1Tnoy4T4l3DSf2K8xrx9UgFNn73kGfpYR12UQ==\n-----END CERTIFICATE-----","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg4ui7zz4MlrLCpncs\r\nYHdQQS6qp8M5JE3f8ZowaU+BBfahRANCAASdrp2MhuxRGPaEqtrYLUewDHNLbaN+\r\nnG8LCxxEOmlTz8GQI5Lk4o+jKUMTH/IHy5cOnHQQPPfGxqy9g5bbZ8DO\r\n-----END PRIVATE KEY-----"},"mspId":"Org1MSP","type":"X.509","version":1}
|
|
@ -0,0 +1,65 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const User = require('fabric-common/lib/User');
|
||||||
|
const Signer = require('fabric-common/lib/Signer');
|
||||||
|
const Utils = require('fabric-common/lib/Utils');
|
||||||
|
const {common: commonProto} = require('fabric-protos');
|
||||||
|
const {Wallets} = require('fabric-network');
|
||||||
|
|
||||||
|
const mspId = 'Org1MSP';
|
||||||
|
const baseMSPPath='../crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp'
|
||||||
|
const signCertPath = path.resolve(baseMSPPath+'/signcerts/Admin@org1.example.com-cert.pem');
|
||||||
|
const signKeyPath = path.resolve(baseMSPPath+'/keystore/priv_sk');
|
||||||
|
|
||||||
|
const signCert = fs.readFileSync(signCertPath).toString();
|
||||||
|
const signKey = fs.readFileSync(signKeyPath).toString();
|
||||||
|
|
||||||
|
class gwSigningIdentity {
|
||||||
|
constructor(signingIdentity) {
|
||||||
|
this.type = 'X.509';
|
||||||
|
this.mspId = signingIdentity._mspId;
|
||||||
|
this.credentials = {
|
||||||
|
certificate: signingIdentity._certificate.toString().trim(),
|
||||||
|
privateKey: signingIdentity._signer._key.toBytes().trim(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main entrance method
|
||||||
|
* @returns {Promise<*>}
|
||||||
|
*/
|
||||||
|
const main = async () => {
|
||||||
|
const user = loadUser('testAdmin', signCert, signKey);
|
||||||
|
const identity = new gwSigningIdentity(user._signingIdentity);
|
||||||
|
const wallet = await Wallets.newFileSystemWallet('/opt/test/wallet');
|
||||||
|
await wallet.put(mspId+'-admin', identity);
|
||||||
|
return "wallet is created"
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a user object based on given cert and key strings
|
||||||
|
* @param {string} name Name to assign to the user
|
||||||
|
* @param {string} signCert Certificate string to sign
|
||||||
|
* @param {string} signKey Private key string to sign
|
||||||
|
* @returns {User} User object
|
||||||
|
*/
|
||||||
|
const loadUser = (name, signCert, signKey) => {
|
||||||
|
const SigningIdentity = require('fabric-common/lib/SigningIdentity');
|
||||||
|
const user = new User(name);
|
||||||
|
user._cryptoSuite = Utils.newCryptoSuite();
|
||||||
|
const privateKey = user._cryptoSuite.createKeyFromRaw(signKey);
|
||||||
|
const {_cryptoSuite} = user;
|
||||||
|
const pubKey = _cryptoSuite.createKeyFromRaw(signCert);
|
||||||
|
user._signingIdentity = new SigningIdentity(signCert, pubKey, mspId, _cryptoSuite, new Signer(_cryptoSuite, privateKey));
|
||||||
|
user.getIdentity = () => {
|
||||||
|
return user._signingIdentity;
|
||||||
|
};
|
||||||
|
return user;
|
||||||
|
};
|
||||||
|
|
||||||
|
main()
|
||||||
|
.then(console.log)
|
||||||
|
.catch(console.error);
|
|
@ -8,7 +8,7 @@ const User = require('fabric-common/lib/User');
|
||||||
const Signer = require('fabric-common/lib/Signer');
|
const Signer = require('fabric-common/lib/Signer');
|
||||||
const Utils = require('fabric-common/lib/Utils');
|
const Utils = require('fabric-common/lib/Utils');
|
||||||
const {common: commonProto} = require('fabric-protos');
|
const {common: commonProto} = require('fabric-protos');
|
||||||
const {Gateway} = require('fabric-network');
|
const {Gateway, Wallets} = require('fabric-network');
|
||||||
const IdentityContext = require('fabric-common/lib/IdentityContext');
|
const IdentityContext = require('fabric-common/lib/IdentityContext');
|
||||||
|
|
||||||
const mspId = 'Org1MSP';
|
const mspId = 'Org1MSP';
|
||||||
|
@ -92,6 +92,10 @@ const callChaincode = async (channelName, chaincodeId, fcn, args, endorser, user
|
||||||
gateWay.identity = identity;
|
gateWay.identity = identity;
|
||||||
gateWay.identityContext = new IdentityContext(user, client);
|
gateWay.identityContext = new IdentityContext(user, client);
|
||||||
|
|
||||||
|
// test wallet, safe to remove following 2 lines
|
||||||
|
//const wallet = await Wallets.newFileSystemWallet('/opt/test/wallet');
|
||||||
|
//await wallet.put('org1admin', identity);
|
||||||
|
|
||||||
const channel = client.newChannel(channelName);
|
const channel = client.newChannel(channelName);
|
||||||
client.channels.set(channelName, channel);
|
client.channels.set(channelName, channel);
|
||||||
channel.getEndorsers = () => Array.from(channel.endorsers.values());
|
channel.getEndorsers = () => Array.from(channel.endorsers.values());
|
||||||
|
@ -104,6 +108,7 @@ const callChaincode = async (channelName, chaincodeId, fcn, args, endorser, user
|
||||||
const network = await gateWay.getNetwork(channelName);
|
const network = await gateWay.getNetwork(channelName);
|
||||||
const contract = network.getContract(chaincodeId);
|
const contract = network.getContract(chaincodeId);
|
||||||
const tx = contract.createTransaction(fcn);
|
const tx = contract.createTransaction(fcn);
|
||||||
|
//const response = contract.evaluateTransaction(fcn, args)
|
||||||
|
|
||||||
return tx.evaluate(...args);
|
return tx.evaluate(...args);
|
||||||
}
|
}
|
|
@ -0,0 +1,155 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const {Endorser, Endpoint, Discoverer} = require('fabric-common');
|
||||||
|
const Client = require('fabric-common/lib/Client');
|
||||||
|
const User = require('fabric-common/lib/User');
|
||||||
|
const Signer = require('fabric-common/lib/Signer');
|
||||||
|
const Utils = require('fabric-common/lib/Utils');
|
||||||
|
const {common: commonProto} = require('fabric-protos');
|
||||||
|
const {Gateway} = require('fabric-network');
|
||||||
|
const IdentityContext = require('fabric-common/lib/IdentityContext');
|
||||||
|
|
||||||
|
const mspId = 'Org1MSP';
|
||||||
|
const peerURL = `grpcs://peer1.org1.example.com:7051`;
|
||||||
|
const channelName = 'businesschannel';
|
||||||
|
const baseMSPPath='../crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp'
|
||||||
|
const tlsCAPath = path.resolve(baseMSPPath+'/tlscacerts/tlsca.org1.example.com-cert.pem');
|
||||||
|
const signCertPath = path.resolve(baseMSPPath+'/signcerts/Admin@org1.example.com-cert.pem');
|
||||||
|
const signKeyPath = path.resolve(baseMSPPath+'/keystore/priv_sk');
|
||||||
|
|
||||||
|
const chaincodeId = 'exp02';
|
||||||
|
const fcn = 'query';
|
||||||
|
const args = ['a'];
|
||||||
|
|
||||||
|
const tlsCACert = fs.readFileSync(tlsCAPath).toString();
|
||||||
|
const signCert = fs.readFileSync(signCertPath).toString();
|
||||||
|
const signKey = fs.readFileSync(signKeyPath).toString();
|
||||||
|
|
||||||
|
class gwSigningIdentity {
|
||||||
|
constructor(signingIdentity) {
|
||||||
|
this.type = 'X.509';
|
||||||
|
this.mspId = signingIdentity._mspId;
|
||||||
|
this.credentials = {
|
||||||
|
certificate: signingIdentity._certificate.toString().trim(),
|
||||||
|
privateKey: signingIdentity._signer._key.toBytes().trim(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main entrance method
|
||||||
|
* @returns {Promise<*>}
|
||||||
|
*/
|
||||||
|
const main = async () => {
|
||||||
|
const options = {
|
||||||
|
url: peerURL,
|
||||||
|
'grpc-wait-for-ready-timeout': 30000,
|
||||||
|
pem: tlsCACert
|
||||||
|
//'grpc.ssl_target_name_override': peerHost
|
||||||
|
};
|
||||||
|
const endpoint = new Endpoint(options);
|
||||||
|
const endorser = new Endorser('myEndorser', {}, mspId);
|
||||||
|
endorser.setEndpoint(endpoint);
|
||||||
|
await endorser.connect();
|
||||||
|
|
||||||
|
// Only for test purpose, safe to remove following 3 lines
|
||||||
|
const discoverer = new Discoverer('myDiscoverer', {}, mspId);
|
||||||
|
discoverer.setEndpoint(endpoint);
|
||||||
|
await discoverer.connect();
|
||||||
|
|
||||||
|
const user = loadUser('test-Admin', signCert, signKey);
|
||||||
|
//---- query on chaincode
|
||||||
|
return queryChaincode(channelName, chaincodeId, fcn, args, endorser, user)
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the blockchain info from given channel
|
||||||
|
* @param {string} channelName Channel to fetch blockchain info
|
||||||
|
* @param {string} chaincodeId Id of the chaincode
|
||||||
|
* @param {string} fcn Chaincode method to call
|
||||||
|
* @param {array} args Chaincode method arguments
|
||||||
|
* @param {Endorser} endorser Endorser to send the request to
|
||||||
|
* @param {User} user Identity to use
|
||||||
|
* @returns {BlockchainInfo} Parsed blockchain info struct
|
||||||
|
*/
|
||||||
|
const queryChaincode = async (channelName,chaincodeId, fcn, args, endorser, user) => {
|
||||||
|
let result = await callChaincode(channelName, chaincodeId, fcn, args, endorser, user)
|
||||||
|
return parseQueryResponse(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call a chaincode and return the response in raw proto
|
||||||
|
* @param {string} channelName Name of the channel
|
||||||
|
* @param {string} chaincodeId Name of the chaincode
|
||||||
|
* @param {string} fcn Name of the chaincode method to call
|
||||||
|
* @param {string} args Parameters for the Chaincode method
|
||||||
|
* @param {Endorser} endorser Endorser to send the request to
|
||||||
|
* @param {User} user Identity to use
|
||||||
|
* @returns {Promise<Buffer>}
|
||||||
|
*/
|
||||||
|
const callChaincode = async (channelName, chaincodeId, fcn, args, endorser, user) => {
|
||||||
|
const gateWay = new Gateway();
|
||||||
|
const client = new Client(null);
|
||||||
|
const identity = new gwSigningIdentity(user._signingIdentity);
|
||||||
|
gateWay.identity = identity;
|
||||||
|
gateWay.identityContext = new IdentityContext(user, client);
|
||||||
|
|
||||||
|
const channel = client.newChannel(channelName);
|
||||||
|
client.channels.set(channelName, channel);
|
||||||
|
channel.getEndorsers = () => Array.from(channel.endorsers.values());
|
||||||
|
channel.endorsers.set(endorser.toString(), endorser);
|
||||||
|
|
||||||
|
await gateWay.connect(client, {
|
||||||
|
wallet: {}, discovery: {enabled: false}, identity
|
||||||
|
});
|
||||||
|
|
||||||
|
const network = await gateWay.getNetwork(channelName);
|
||||||
|
const contract = network.getContract(chaincodeId);
|
||||||
|
const tx = contract.createTransaction(fcn);
|
||||||
|
//const response = contract.evaluateTransaction(fcn, args)
|
||||||
|
|
||||||
|
return tx.evaluate(...args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the result into the blockchain info structure
|
||||||
|
* @param {Buffer} _resultProto The original result from fabric network
|
||||||
|
* @returns {{previousBlockHash: string, currentBlockHash: string, height: number}}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse the query result
|
||||||
|
* @param _resultProto
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
const parseQueryResponse = (_resultProto) => {
|
||||||
|
return _resultProto.toString()
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a user object based on given cert and key strings
|
||||||
|
* @param {string} name Name to assign to the user
|
||||||
|
* @param {string} signCert Certificate string to sign
|
||||||
|
* @param {string} signKey Private key string to sign
|
||||||
|
* @returns {User} User object
|
||||||
|
*/
|
||||||
|
const loadUser = (name, signCert, signKey) => {
|
||||||
|
const SigningIdentity = require('fabric-common/lib/SigningIdentity');
|
||||||
|
const user = new User(name);
|
||||||
|
user._cryptoSuite = Utils.newCryptoSuite();
|
||||||
|
const privateKey = user._cryptoSuite.createKeyFromRaw(signKey);
|
||||||
|
const {_cryptoSuite} = user;
|
||||||
|
const pubKey = _cryptoSuite.createKeyFromRaw(signCert);
|
||||||
|
user._signingIdentity = new SigningIdentity(signCert, pubKey, mspId, _cryptoSuite, new Signer(_cryptoSuite, privateKey));
|
||||||
|
user.getIdentity = () => {
|
||||||
|
return user._signingIdentity;
|
||||||
|
};
|
||||||
|
return user;
|
||||||
|
};
|
||||||
|
|
||||||
|
main()
|
||||||
|
.then(console.log)
|
||||||
|
.catch(console.error);
|
|
@ -1,30 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const fs = require('fs')
|
|
||||||
|
|
||||||
const {Gateway, gatewayOptions} = require('fabric-network');
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
|
|
||||||
// read a common connection profile in json format
|
|
||||||
const data = fs.readFileSync('/opt/test/connection-profile.json');
|
|
||||||
const connectionProfile = JSON.parse(data);
|
|
||||||
|
|
||||||
const user =
|
|
||||||
{
|
|
||||||
credentials: {
|
|
||||||
certificate: '-----BEGIN CERTIFICATE-----MIICKDCCAc+gAwIBAgIQSdBFJUgRkBhzmW9htYh+UjAKBggqhkjOPQQDAjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDA3MTcxODE5MDBaFw0zMDA3MTUxODE5MDBaMGsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMQ4wDAYDVQQLEwVhZG1pbjEfMB0GA1UEAwwWQWRtaW5Ab3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJ2unYyG7FEY9oSq2tgtR7AMc0tto36cbwsLHEQ6aVPPwZAjkuTij6MpQxMf8gfLlw6cdBA898bGrL2DlttnwM6jTTBLMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIKqf36g/sCvMlxb5pAHInL/lz2U6RJfYRzgbC38Wrp5QMAoGCCqGSM49BAMCA0cAMEQCIBL+/AwRBeh13pl+cY8ZlcJsNPDXPDc41wKKche8zdSSAiB5i5Lu+1Tnoy4T4l3DSf2K8xrx9UgFNn73kGfpYR12UQ==-----END CERTIFICATE-----',
|
|
||||||
privateKey: '-----BEGIN PRIVATE KEY-----MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg4ui7zz4MlrLCpncsYHdQQS6qp8M5JE3f8ZowaU+BBfahRANCAASdrp2MhuxRGPaEqtrYLUewDHNLbaN+nG8LCxxEOmlTz8GQI5Lk4o+jKUMTH/IHy5cOnHQQPPfGxqy9g5bbZ8DO-----END PRIVATE KEY-----',
|
|
||||||
},
|
|
||||||
mspId: 'Org1MSP',
|
|
||||||
type: 'X.509',
|
|
||||||
};
|
|
||||||
|
|
||||||
// use the loaded connection profile
|
|
||||||
const gateway = new Gateway();
|
|
||||||
await gateway.connect(connectionProfile, { identity: user});
|
|
||||||
|
|
||||||
const network = await gateway.getNetwork('businesschannel');
|
|
||||||
}
|
|
||||||
|
|
||||||
main()
|
|
|
@ -1,43 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const fs = require('fs')
|
|
||||||
|
|
||||||
//const {Gateway} = require('fabric-network');
|
|
||||||
const {Client, Endorser, Endpoint} = require('fabric-common');
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
|
|
||||||
// read a common connection profile in json format
|
|
||||||
const data = fs.readFileSync('/opt/test/connection-profile.json');
|
|
||||||
const connectionProfile = JSON.parse(data);
|
|
||||||
|
|
||||||
const user =
|
|
||||||
{
|
|
||||||
credentials: {
|
|
||||||
certificate: '-----BEGIN CERTIFICATE-----MIICKDCCAc+gAwIBAgIQSdBFJUgRkBhzmW9htYh+UjAKBggqhkjOPQQDAjBzMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDA3MTcxODE5MDBaFw0zMDA3MTUxODE5MDBaMGsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMQ4wDAYDVQQLEwVhZG1pbjEfMB0GA1UEAwwWQWRtaW5Ab3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJ2unYyG7FEY9oSq2tgtR7AMc0tto36cbwsLHEQ6aVPPwZAjkuTij6MpQxMf8gfLlw6cdBA898bGrL2DlttnwM6jTTBLMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIKqf36g/sCvMlxb5pAHInL/lz2U6RJfYRzgbC38Wrp5QMAoGCCqGSM49BAMCA0cAMEQCIBL+/AwRBeh13pl+cY8ZlcJsNPDXPDc41wKKche8zdSSAiB5i5Lu+1Tnoy4T4l3DSf2K8xrx9UgFNn73kGfpYR12UQ==-----END CERTIFICATE-----',
|
|
||||||
privateKey: '-----BEGIN PRIVATE KEY-----MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg4ui7zz4MlrLCpncsYHdQQS6qp8M5JE3f8ZowaU+BBfahRANCAASdrp2MhuxRGPaEqtrYLUewDHNLbaN+nG8LCxxEOmlTz8GQI5Lk4o+jKUMTH/IHy5cOnHQQPPfGxqy9g5bbZ8DO-----END PRIVATE KEY-----',
|
|
||||||
},
|
|
||||||
mspId: 'org1MSP',
|
|
||||||
type: 'X.509',
|
|
||||||
};
|
|
||||||
|
|
||||||
const client = new Client("c1")
|
|
||||||
client.addTlsClientCertAndKey({
|
|
||||||
url: "grpcs://peer1.org1.example.com:7051",
|
|
||||||
pem: "-----BEGIN CERTIFICATE----- MIICVzCCAf2gAwIBAgIQQaMCImEphSvSI+GHAJmxqjAKBggqhkjOPQQDAjB2MQsw CQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxz Y2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDA3MTcxODE5MDBaFw0zMDA3MTUxODE5MDBaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH Ew1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYDVQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D AQcDQgAEVmrLLrpumifDP5gJfjVK3+RPl2W67+7NS/CV0rRfCG8d4xx+QvCRlaW/3LyIpcBMfGe7G9UgiaIVhhYHh+eNXKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1Ud JQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdDgQiBCAw6bXoQrmlIxGxtNMGQ0Vm+MGt3WFBoRP5kADb3O+TEjAKBggqhkjOPQQD AgNIADBFAiBkhGF4Adl6z0QfQlcAM85D2yFPVzC3/9WMJo/Qtjil9QIhAOfrSbTlIlN1ytBONKWl30rCv0pFOd6nTN7BOwllhWZq -----END CERTIFICATE-----",
|
|
||||||
clientKey:"-----BEGIN PRIVATE KEY-----MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgOQEb55wiTX74p7cAMi33at2kDn0hgN2Q9lWutWRjTm+hRANCAATZEXMExJbwUnRYm6Mha/hrjnXgbhLKLAkmwh9iFRrW1zWIxLbH+FLerQUWd/bveuhIS8koYab+3+a3twzYzwwx-----END PRIVATE KEY-----",
|
|
||||||
clientCert: "-----BEGIN CERTIFICATE-----MIICOzCCAeKgAwIBAgIRAPUP28xYwbLj0OAzFk4wlvgwCgYIKoZIzj0EAwIwdjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRsc2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMjAwNzE3MTgxOTAwWhcNMzAwNzE1MTgxOTAwWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWQWRtaW5Ab3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNkRcwTElvBSdFiboyFr+GuOdeBuEsosCSbCH2IVGtbXNYjEtsf4Ut6tBRZ39u966EhLyShhpv7f5re3DNjPDDGjbDBqMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADArBgNVHSMEJDAigCAw6bXoQrmlIxGxtNMGQ0Vm+MGt3WFBoRP5kADb3O+TEjAKBggqhkjOPQQDAgNHADBEAiAYQu0XAzDyrnlcJophUUV2HxnudmUGOXSLFONm4fa+6QIgRxeA7O1JDy9Yy2uM3aX5kNe9+WjSySGnp07ceLuRak4=-----END CERTIFICATE-----"
|
|
||||||
})
|
|
||||||
client.setTlsClientCertAndKey("-----BEGIN CERTIFICATE-----MIICOzCCAeKgAwIBAgIRAPUP28xYwbLj0OAzFk4wlvgwCgYIKoZIzj0EAwIwdjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHzAdBgNVBAMTFnRsc2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMjAwNzE3MTgxOTAwWhcNMzAwNzE1MTgxOTAwWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWQWRtaW5Ab3JnMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABNkRcwTElvBSdFiboyFr+GuOdeBuEsosCSbCH2IVGtbXNYjEtsf4Ut6tBRZ39u966EhLyShhpv7f5re3DNjPDDGjbDBqMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADArBgNVHSMEJDAigCAw6bXoQrmlIxGxtNMGQ0Vm+MGt3WFBoRP5kADb3O+TEjAKBggqhkjOPQQDAgNHADBEAiAYQu0XAzDyrnlcJophUUV2HxnudmUGOXSLFONm4fa+6QIgRxeA7O1JDy9Yy2uM3aX5kNe9+WjSySGnp07ceLuRak4=-----END CERTIFICATE-----","-----BEGIN PRIVATE KEY-----MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgOQEb55wiTX74p7cAMi33at2kDn0hgN2Q9lWutWRjTm+hRANCAATZEXMExJbwUnRYm6Mha/hrjnXgbhLKLAkmwh9iFRrW1zWIxLbH+FLerQUWd/bveuhIS8koYab+3+a3twzYzwwx-----END PRIVATE KEY-----")
|
|
||||||
|
|
||||||
const endPoint = new Endpoint({url:"grpcs://peer1.org1.example.com:7051", pem:"-----BEGIN CERTIFICATE----- MIICVzCCAf2gAwIBAgIQQaMCImEphSvSI+GHAJmxqjAKBggqhkjOPQQDAjB2MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy YW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEfMB0GA1UEAxMWdGxzY2Eub3JnMS5leGFtcGxlLmNvbTAeFw0yMDA3MTcxODE5MDBaFw0zMDA3MTUxODE5 MDBaMHYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRkwFwYDVQQKExBvcmcxLmV4YW1wbGUuY29tMR8wHQYD VQQDExZ0bHNjYS5vcmcxLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEVmrLLrpumifDP5gJfjVK3+RPl2W67+7NS/CV0rRfCG8d4xx+QvCRlaW/ 3LyIpcBMfGe7G9UgiaIVhhYHh+eNXKNtMGswDgYDVR0PAQH/BAQDAgGmMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1Ud DgQiBCAw6bXoQrmlIxGxtNMGQ0Vm+MGt3WFBoRP5kADb3O+TEjAKBggqhkjOPQQDAgNIADBFAiBkhGF4Adl6z0QfQlcAM85D2yFPVzC3/9WMJo/Qtjil9QIhAOfrSbTl IlN1ytBONKWl30rCv0pFOd6nTN7BOwllhWZq -----END CERTIFICATE-----", requestTimeout:30000})
|
|
||||||
|
|
||||||
const endorser = new Endorser("peer1-org1", client,"org1MSP")
|
|
||||||
await endorser.connect(endPoint)
|
|
||||||
// use the loaded connection profile
|
|
||||||
//const gateway = new Gateway();
|
|
||||||
//await gateway.connect(connectionProfile, { identity: user});
|
|
||||||
//const network = await gateway.getNetwork('businesschannel');
|
|
||||||
}
|
|
||||||
|
|
||||||
main()
|
|
|
@ -1,44 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const {Gateway, Wallets} = require('fabric-network');
|
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
const connectionProfileFileName = '/opt/test/connection-profile.json'
|
|
||||||
|
|
||||||
async function main() {
|
|
||||||
// Connect to a gateway peer
|
|
||||||
const connectionProfileJson = (await fs.promises.readFile(connectionProfileFileName)).toString();
|
|
||||||
const connectionProfile = JSON.parse(connectionProfileJson);
|
|
||||||
const wallet = await Wallets.newFileSystemWallet(walletDirectoryPath);
|
|
||||||
const gatewayOptions: GatewayOptions = {
|
|
||||||
identity: 'user@example.org', // Previously imported identity
|
|
||||||
wallet,
|
|
||||||
};
|
|
||||||
const gateway = new Gateway();
|
|
||||||
await gateway.connect(connectionProfile, gatewayOptions);
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
// Obtain the smart contract with which our application wants to interact
|
|
||||||
const network = await gateway.getNetwork(channelName);
|
|
||||||
const contract = network.getContract(chaincodeId);
|
|
||||||
|
|
||||||
// Submit transactions for the smart contract
|
|
||||||
const args = [arg1, arg2];
|
|
||||||
const submitResult = await contract.submitTransaction('transactionName', ...args);
|
|
||||||
|
|
||||||
// Evaluate queries for the smart contract
|
|
||||||
const evalResult = await contract.evaluateTransaction('transactionName', ...args);
|
|
||||||
|
|
||||||
// Create and submit transactions for the smart contract with transient data
|
|
||||||
const transientResult = await contract.createTransaction(transactionName)
|
|
||||||
.setTransient(privateData)
|
|
||||||
.submit(arg1, arg2);
|
|
||||||
|
|
||||||
} finally {
|
|
||||||
// Disconnect from the gateway peer when all work for this client identity is complete
|
|
||||||
gateway.disconnect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
main()
|
|
Loading…
Reference in New Issue