mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-23 01:55:10 +00:00
Initial check-in for HF and contract
This commit is contained in:
parent
a3d26a136d
commit
43b6de9793
63 changed files with 8093 additions and 0 deletions
202
hyperledger-fabric/LICENSE
Normal file
202
hyperledger-fabric/LICENSE
Normal file
|
|
@ -0,0 +1,202 @@
|
|||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "{}"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright {yyyy} {name of copyright owner}
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
4
hyperledger-fabric/chaincode/fhir-data/.gitignore
vendored
Normal file
4
hyperledger-fabric/chaincode/fhir-data/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
.DS_Store
|
||||
node_modules
|
||||
.nyc_output
|
||||
coverage
|
||||
2
hyperledger-fabric/chaincode/fhir-data/dist/index.d.ts
vendored
Normal file
2
hyperledger-fabric/chaincode/fhir-data/dist/index.d.ts
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
export { PatientContract } from './patient-contract';
|
||||
export declare const contracts: any[];
|
||||
10
hyperledger-fabric/chaincode/fhir-data/dist/index.js
vendored
Normal file
10
hyperledger-fabric/chaincode/fhir-data/dist/index.js
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
"use strict";
|
||||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const patient_contract_1 = require("./patient-contract");
|
||||
var patient_contract_2 = require("./patient-contract");
|
||||
exports.PatientContract = patient_contract_2.PatientContract;
|
||||
exports.contracts = [patient_contract_1.PatientContract];
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
hyperledger-fabric/chaincode/fhir-data/dist/index.js.map
vendored
Normal file
1
hyperledger-fabric/chaincode/fhir-data/dist/index.js.map
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAEH,yDAAqD;AACrD,uDAAqD;AAA5C,6CAAA,eAAe,CAAA;AAEX,QAAA,SAAS,GAAU,CAAE,kCAAe,CAAE,CAAC"}
|
||||
8
hyperledger-fabric/chaincode/fhir-data/dist/patient-contract.d.ts
vendored
Normal file
8
hyperledger-fabric/chaincode/fhir-data/dist/patient-contract.d.ts
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
import { Context, Contract } from 'fabric-contract-api';
|
||||
export declare class PatientContract extends Contract {
|
||||
initLedger(ctx: Context): Promise<void>;
|
||||
queryPatient(ctx: Context, id: string): Promise<string>;
|
||||
addPatient(ctx: Context, id: string, patientStr: string): Promise<void>;
|
||||
replacePatient(ctx: Context, id: string, patientStr: string): Promise<void>;
|
||||
updatePatient(ctx: Context, id: string, patientStr: string): Promise<void>;
|
||||
}
|
||||
62
hyperledger-fabric/chaincode/fhir-data/dist/patient-contract.js
vendored
Normal file
62
hyperledger-fabric/chaincode/fhir-data/dist/patient-contract.js
vendored
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const fabric_contract_api_1 = require("fabric-contract-api");
|
||||
const ts_deepmerge_1 = require("ts-deepmerge");
|
||||
class PatientContract extends fabric_contract_api_1.Contract {
|
||||
async initLedger(ctx) {
|
||||
console.info('============= START : Initialize Ledger ===========');
|
||||
console.info('============= END : Initialize Ledger ===========');
|
||||
}
|
||||
// GET patient by id
|
||||
async queryPatient(ctx, id) {
|
||||
const patientBytes = await ctx.stub.getState(id);
|
||||
if (!patientBytes || patientBytes.length === 0) {
|
||||
throw new Error(`Patient with id '${id}' does not exist`);
|
||||
}
|
||||
console.log(patientBytes.toString());
|
||||
return patientBytes.toString();
|
||||
}
|
||||
// POST patient
|
||||
async addPatient(ctx, id, patientStr) {
|
||||
console.info('============= START : addPatient ===========');
|
||||
const patientBytes = await ctx.stub.getState(id);
|
||||
if (patientBytes && patientBytes.length > 0) {
|
||||
throw new Error(`Patient with id '${id}' exists; use updatePatient instead.`);
|
||||
}
|
||||
const patient = JSON.parse(patientStr);
|
||||
console.info(`addPatient: received id: '${id}' patient: ` + JSON.stringify(patient));
|
||||
await ctx.stub.putState(id, Buffer.from(JSON.stringify(patient)));
|
||||
console.info('============= END : addPatient ===========');
|
||||
}
|
||||
// PUT patient
|
||||
async replacePatient(ctx, id, patientStr) {
|
||||
console.info('============= START : replacePatient ===========');
|
||||
const patientBytes = await ctx.stub.getState(id);
|
||||
if (!patientBytes || patientBytes.length === 0) {
|
||||
throw new Error(`Patient with id '${id}' does not exist`);
|
||||
}
|
||||
const patient = JSON.parse(patientStr);
|
||||
console.info(`updatePatient: received id: '${id}' patient: ` + JSON.stringify(patient));
|
||||
await ctx.stub.putState(id, Buffer.from(JSON.stringify(patient)));
|
||||
console.info('============= END : replacePatient ===========');
|
||||
}
|
||||
// PATCH patient
|
||||
async updatePatient(ctx, id, patientStr) {
|
||||
console.info('============= START : updatePatient ===========');
|
||||
const patientBytes = await ctx.stub.getState(id);
|
||||
if (!patientBytes || patientBytes.length === 0) {
|
||||
throw new Error(`Patient with id '${id}' does not exist`);
|
||||
}
|
||||
const existingPatient = JSON.parse(patientBytes.toString());
|
||||
const newPatient = JSON.parse(patientStr);
|
||||
console.info(`updatePatient: id: '${id}' existingPatient: ` + JSON.stringify(existingPatient));
|
||||
console.info(`updatePatient: id: '${id}' newPatient: ` + JSON.stringify(newPatient));
|
||||
// Merge the values from newPatient into existingPatient
|
||||
const result = ts_deepmerge_1.default(existingPatient, newPatient);
|
||||
console.info(`updatePatient: id: '${id}' merged Patient: ` + JSON.stringify(result));
|
||||
await ctx.stub.putState(id, Buffer.from(JSON.stringify(result)));
|
||||
console.info('============= END : updatePatient ===========');
|
||||
}
|
||||
}
|
||||
exports.PatientContract = PatientContract;
|
||||
//# sourceMappingURL=patient-contract.js.map
|
||||
1
hyperledger-fabric/chaincode/fhir-data/dist/patient-contract.js.map
vendored
Normal file
1
hyperledger-fabric/chaincode/fhir-data/dist/patient-contract.js.map
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"patient-contract.js","sourceRoot":"","sources":["../src/patient-contract.ts"],"names":[],"mappings":";;AACA,6DAAwD;AACxD,+CAAiC;AAGjC,MAAa,eAAgB,SAAQ,8BAAQ;IAElC,KAAK,CAAC,UAAU,CAAC,GAAY;QAChC,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACtE,CAAC;IAED,oBAAoB;IACb,KAAK,CAAC,YAAY,CAAC,GAAY,EAAE,EAAU;QAC9C,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5C,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;SAC7D;QACD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrC,OAAO,YAAY,CAAC,QAAQ,EAAE,CAAC;IACnC,CAAC;IAED,eAAe;IACR,KAAK,CAAC,UAAU,CAAC,GAAY,EAAE,EAAU,EAAE,UAAkB;QAChE,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC7D,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YACzC,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,sCAAsC,CAAC,CAAC;SACjF;QAED,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAErF,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC/D,CAAC;IAED,cAAc;IACP,KAAK,CAAC,cAAc,CAAC,GAAY,EAAE,EAAU,EAAE,UAAkB;QACpE,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QACjE,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5C,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;SAC7D;QAED,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAExF,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IACnE,CAAC;IAED,gBAAgB;IACT,KAAK,CAAC,aAAa,CAAC,GAAY,EAAE,EAAU,EAAE,UAAkB;QACnE,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAChE,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5C,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;SAC7D;QAED,MAAM,eAAe,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrE,MAAM,UAAU,GAAY,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC;QAC/F,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;QAErF,wDAAwD;QACxD,MAAM,MAAM,GAAG,sBAAK,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAErF,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAClE,CAAC;CACJ;AAnED,0CAmEC"}
|
||||
160
hyperledger-fabric/chaincode/fhir-data/dist/patient.d.ts
vendored
Normal file
160
hyperledger-fabric/chaincode/fhir-data/dist/patient.d.ts
vendored
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
interface ICoding {
|
||||
system?: string;
|
||||
version?: string;
|
||||
code?: string;
|
||||
display?: string;
|
||||
userSelected?: boolean;
|
||||
}
|
||||
interface IType {
|
||||
coding?: ICoding[];
|
||||
text?: string;
|
||||
}
|
||||
interface IPeriod {
|
||||
start?: string;
|
||||
end?: string;
|
||||
}
|
||||
interface IIdentifier {
|
||||
use?: string;
|
||||
type?: IType;
|
||||
system?: string;
|
||||
value?: string;
|
||||
period?: IPeriod;
|
||||
}
|
||||
interface ISecurity {
|
||||
system?: string;
|
||||
version?: string;
|
||||
code?: string;
|
||||
display?: string;
|
||||
userSelected?: boolean;
|
||||
}
|
||||
interface ITag {
|
||||
system?: string;
|
||||
version?: string;
|
||||
code?: string;
|
||||
display?: string;
|
||||
userSelected?: boolean;
|
||||
}
|
||||
interface IMeta {
|
||||
versionId?: string;
|
||||
lastUpdated?: string;
|
||||
source?: string;
|
||||
profile?: string[];
|
||||
security?: ISecurity[];
|
||||
tag?: ITag[];
|
||||
}
|
||||
interface IName {
|
||||
use?: string;
|
||||
text?: string;
|
||||
family?: string;
|
||||
given?: string[];
|
||||
prefix?: string[];
|
||||
suffix?: string[];
|
||||
period?: IPeriod;
|
||||
}
|
||||
interface ITelecom {
|
||||
system?: string;
|
||||
value?: string;
|
||||
use?: string;
|
||||
rank?: number;
|
||||
period?: IPeriod;
|
||||
}
|
||||
interface IAddress {
|
||||
use?: string;
|
||||
type?: string;
|
||||
text?: string;
|
||||
line?: string[];
|
||||
city?: string;
|
||||
district?: string;
|
||||
state?: string;
|
||||
postalCode?: string;
|
||||
country?: string;
|
||||
period?: IPeriod;
|
||||
}
|
||||
interface IMaritalStatus {
|
||||
coding?: ICoding[];
|
||||
text?: string;
|
||||
}
|
||||
interface IPhoto {
|
||||
contentType?: string;
|
||||
language?: string;
|
||||
data?: string;
|
||||
url?: string;
|
||||
size?: number;
|
||||
hash?: string;
|
||||
title?: string;
|
||||
creation?: string;
|
||||
}
|
||||
interface IRelationship {
|
||||
coding?: ICoding[];
|
||||
text?: string;
|
||||
}
|
||||
interface IOrganization {
|
||||
reference?: string;
|
||||
type?: string;
|
||||
identifier?: IIdentifier;
|
||||
display?: string;
|
||||
}
|
||||
interface IContact {
|
||||
relationship?: IRelationship[];
|
||||
name?: IName;
|
||||
telecom?: ITelecom[];
|
||||
address?: IAddress;
|
||||
gender: string;
|
||||
organization?: IOrganization;
|
||||
period?: IPeriod;
|
||||
}
|
||||
interface ILanguage {
|
||||
coding?: ICoding[];
|
||||
text?: string;
|
||||
}
|
||||
interface ICommunication {
|
||||
language?: ILanguage;
|
||||
preferred?: boolean;
|
||||
}
|
||||
interface IGeneralPractitioner {
|
||||
reference?: string;
|
||||
type?: string;
|
||||
identifier?: IIdentifier;
|
||||
display?: string;
|
||||
}
|
||||
interface IManagingOrganization {
|
||||
reference?: string;
|
||||
type?: string;
|
||||
identifier?: IIdentifier;
|
||||
display?: string;
|
||||
}
|
||||
interface IOther {
|
||||
reference?: string;
|
||||
type?: string;
|
||||
identifier?: IIdentifier;
|
||||
display?: string;
|
||||
}
|
||||
interface ILink {
|
||||
other?: IOther;
|
||||
type: string;
|
||||
}
|
||||
export declare class Patient {
|
||||
resourceType?: string;
|
||||
id?: string;
|
||||
meta?: IMeta;
|
||||
implicitRules?: string;
|
||||
language?: string;
|
||||
Text?: Text;
|
||||
identifier?: IIdentifier[];
|
||||
active?: boolean;
|
||||
name?: IName[];
|
||||
telecom?: ITelecom[];
|
||||
gender: string;
|
||||
birthDate?: string;
|
||||
deceasedBoolean?: boolean;
|
||||
address?: IAddress[];
|
||||
maritalStatus?: IMaritalStatus;
|
||||
multipleBirthBoolean?: boolean;
|
||||
photo?: IPhoto[];
|
||||
contact?: IContact[];
|
||||
communication?: ICommunication[];
|
||||
generalPractitioner?: IGeneralPractitioner[];
|
||||
managingOrganization?: IManagingOrganization[];
|
||||
link?: ILink[];
|
||||
}
|
||||
export {};
|
||||
7
hyperledger-fabric/chaincode/fhir-data/dist/patient.js
vendored
Normal file
7
hyperledger-fabric/chaincode/fhir-data/dist/patient.js
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
// Patient is an asset
|
||||
class Patient {
|
||||
}
|
||||
exports.Patient = Patient;
|
||||
//# sourceMappingURL=patient.js.map
|
||||
1
hyperledger-fabric/chaincode/fhir-data/dist/patient.js.map
vendored
Normal file
1
hyperledger-fabric/chaincode/fhir-data/dist/patient.js.map
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"patient.js","sourceRoot":"","sources":["../src/patient.ts"],"names":[],"mappings":";;AAiKA,sBAAsB;AACtB,MAAa,OAAO;CAuBnB;AAvBD,0BAuBC"}
|
||||
2682
hyperledger-fabric/chaincode/fhir-data/package-lock.json
generated
Normal file
2682
hyperledger-fabric/chaincode/fhir-data/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
63
hyperledger-fabric/chaincode/fhir-data/package.json
Normal file
63
hyperledger-fabric/chaincode/fhir-data/package.json
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
{
|
||||
"name": "fhir-data",
|
||||
"version": "1.0.0",
|
||||
"description": "FHIR Patient contract implemented in TypeScript",
|
||||
"main": "dist/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"engines": {
|
||||
"node": ">=8",
|
||||
"npm": ">=5"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "tslint -c tslint.json 'src/**/*.ts'",
|
||||
"pretest": "npm run lint",
|
||||
"test": "nyc mocha -r ts-node/register src/**/*.spec.ts",
|
||||
"start": "fabric-chaincode-node start",
|
||||
"build": "tsc",
|
||||
"build:watch": "tsc -w",
|
||||
"prepublishOnly": "npm run build"
|
||||
},
|
||||
"engineStrict": true,
|
||||
"author": "Carole Corley",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"fabric-contract-api": "^2.0.0",
|
||||
"fabric-shim": "^2.0.0",
|
||||
"ts-deepmerge": "^1.0.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/chai": "^4.1.7",
|
||||
"@types/mocha": "^5.2.5",
|
||||
"@types/node": "^10.12.10",
|
||||
"@types/sinon": "^5.0.7",
|
||||
"@types/sinon-chai": "^3.2.1",
|
||||
"chai": "^4.2.0",
|
||||
"mocha": "^5.2.0",
|
||||
"nyc": "^14.1.1",
|
||||
"sinon": "^7.1.1",
|
||||
"sinon-chai": "^3.3.0",
|
||||
"ts-node": "^7.0.1",
|
||||
"tslint": "^5.11.0",
|
||||
"typescript": "^3.1.6"
|
||||
},
|
||||
"nyc": {
|
||||
"extension": [
|
||||
".ts",
|
||||
".tsx"
|
||||
],
|
||||
"exclude": [
|
||||
"coverage/**",
|
||||
"dist/**"
|
||||
],
|
||||
"reporter": [
|
||||
"text-summary",
|
||||
"html"
|
||||
],
|
||||
"all": true,
|
||||
"check-coverage": true,
|
||||
"statements": 100,
|
||||
"branches": 100,
|
||||
"functions": 100,
|
||||
"lines": 100
|
||||
}
|
||||
}
|
||||
8
hyperledger-fabric/chaincode/fhir-data/src/index.ts
Normal file
8
hyperledger-fabric/chaincode/fhir-data/src/index.ts
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import { PatientContract } from './patient-contract';
|
||||
export { PatientContract } from './patient-contract';
|
||||
|
||||
export const contracts: any[] = [ PatientContract ];
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
|
||||
import { Context, Contract } from 'fabric-contract-api';
|
||||
import merge from 'ts-deepmerge';
|
||||
import { Patient } from './patient';
|
||||
|
||||
export class PatientContract extends Contract {
|
||||
|
||||
public async initLedger(ctx: Context) {
|
||||
console.info('============= START : Initialize Ledger ===========');
|
||||
console.info('============= END : Initialize Ledger ===========');
|
||||
}
|
||||
|
||||
// GET patient by id
|
||||
public async queryPatient(ctx: Context, id: string): Promise<string> {
|
||||
const patientBytes = await ctx.stub.getState(id);
|
||||
if (!patientBytes || patientBytes.length === 0) {
|
||||
throw new Error(`Patient with id '${id}' does not exist`);
|
||||
}
|
||||
console.log(patientBytes.toString());
|
||||
return patientBytes.toString();
|
||||
}
|
||||
|
||||
// POST patient
|
||||
public async addPatient(ctx: Context, id: string, patientStr: string) {
|
||||
console.info('============= START : addPatient ===========');
|
||||
const patientBytes = await ctx.stub.getState(id);
|
||||
if (patientBytes && patientBytes.length > 0) {
|
||||
throw new Error(`Patient with id '${id}' exists; use updatePatient instead.`);
|
||||
}
|
||||
|
||||
const patient: Patient = JSON.parse(patientStr);
|
||||
console.info(`addPatient: received id: '${id}' patient: ` + JSON.stringify(patient));
|
||||
|
||||
await ctx.stub.putState(id, Buffer.from(JSON.stringify(patient)));
|
||||
console.info('============= END : addPatient ===========');
|
||||
}
|
||||
|
||||
// PUT patient
|
||||
public async replacePatient(ctx: Context, id: string, patientStr: string) {
|
||||
console.info('============= START : replacePatient ===========');
|
||||
const patientBytes = await ctx.stub.getState(id);
|
||||
if (!patientBytes || patientBytes.length === 0) {
|
||||
throw new Error(`Patient with id '${id}' does not exist`);
|
||||
}
|
||||
|
||||
const patient: Patient = JSON.parse(patientStr);
|
||||
console.info(`updatePatient: received id: '${id}' patient: ` + JSON.stringify(patient));
|
||||
|
||||
await ctx.stub.putState(id, Buffer.from(JSON.stringify(patient)));
|
||||
console.info('============= END : replacePatient ===========');
|
||||
}
|
||||
|
||||
// PATCH patient
|
||||
public async updatePatient(ctx: Context, id: string, patientStr: string) {
|
||||
console.info('============= START : updatePatient ===========');
|
||||
const patientBytes = await ctx.stub.getState(id);
|
||||
if (!patientBytes || patientBytes.length === 0) {
|
||||
throw new Error(`Patient with id '${id}' does not exist`);
|
||||
}
|
||||
|
||||
const existingPatient: Patient = JSON.parse(patientBytes.toString());
|
||||
const newPatient: Patient = JSON.parse(patientStr);
|
||||
console.info(`updatePatient: id: '${id}' existingPatient: ` + JSON.stringify(existingPatient));
|
||||
console.info(`updatePatient: id: '${id}' newPatient: ` + JSON.stringify(newPatient));
|
||||
|
||||
// Merge the values from newPatient into existingPatient
|
||||
const result = merge(existingPatient, newPatient);
|
||||
console.info(`updatePatient: id: '${id}' merged Patient: ` + JSON.stringify(result));
|
||||
|
||||
await ctx.stub.putState(id, Buffer.from(JSON.stringify(result)));
|
||||
console.info('============= END : updatePatient ===========');
|
||||
}
|
||||
}
|
||||
186
hyperledger-fabric/chaincode/fhir-data/src/patient.ts
Normal file
186
hyperledger-fabric/chaincode/fhir-data/src/patient.ts
Normal file
|
|
@ -0,0 +1,186 @@
|
|||
interface ICoding {
|
||||
system?: string;
|
||||
version?: string;
|
||||
code?: string;
|
||||
display?: string;
|
||||
userSelected?: boolean;
|
||||
}
|
||||
|
||||
interface IType {
|
||||
coding?: ICoding[];
|
||||
text?: string;
|
||||
}
|
||||
|
||||
interface IPeriod {
|
||||
start?: string;
|
||||
end?: string;
|
||||
}
|
||||
|
||||
interface IIdentifier {
|
||||
use?: string;
|
||||
type?: IType;
|
||||
system?: string;
|
||||
value?: string;
|
||||
period?: IPeriod;
|
||||
}
|
||||
|
||||
interface ISecurity {
|
||||
system?: string;
|
||||
version?: string;
|
||||
code?: string;
|
||||
display?: string;
|
||||
userSelected?: boolean;
|
||||
}
|
||||
|
||||
interface ITag {
|
||||
system?: string;
|
||||
version?: string;
|
||||
code?: string;
|
||||
display?: string;
|
||||
userSelected?: boolean;
|
||||
}
|
||||
|
||||
interface IMeta {
|
||||
versionId?: string;
|
||||
lastUpdated?: string;
|
||||
source?: string;
|
||||
profile?: string[];
|
||||
security?: ISecurity[];
|
||||
tag?: ITag[];
|
||||
}
|
||||
|
||||
interface IText {
|
||||
status?: string;
|
||||
div?: string;
|
||||
}
|
||||
|
||||
interface IName {
|
||||
use?: string;
|
||||
text?: string;
|
||||
family?: string;
|
||||
given?: string[];
|
||||
prefix?: string[];
|
||||
suffix?: string[];
|
||||
period?: IPeriod;
|
||||
}
|
||||
|
||||
interface ITelecom {
|
||||
system?: string;
|
||||
value?: string;
|
||||
use?: string;
|
||||
rank?: number;
|
||||
period?: IPeriod;
|
||||
}
|
||||
|
||||
interface IAddress {
|
||||
use?: string;
|
||||
type?: string;
|
||||
text?: string;
|
||||
line?: string[];
|
||||
city?: string;
|
||||
district?: string;
|
||||
state?: string;
|
||||
postalCode?: string;
|
||||
country?: string;
|
||||
period?: IPeriod;
|
||||
}
|
||||
|
||||
interface IMaritalStatus {
|
||||
coding?: ICoding[];
|
||||
text?: string;
|
||||
}
|
||||
|
||||
interface IPhoto {
|
||||
contentType?: string;
|
||||
language?: string;
|
||||
data?: string;
|
||||
url?: string;
|
||||
size?: number;
|
||||
hash?: string;
|
||||
title?: string;
|
||||
creation?: string;
|
||||
}
|
||||
|
||||
interface IRelationship {
|
||||
coding?: ICoding[];
|
||||
text?: string;
|
||||
}
|
||||
|
||||
interface IOrganization {
|
||||
reference?: string;
|
||||
type?: string;
|
||||
identifier?: IIdentifier;
|
||||
display?: string;
|
||||
}
|
||||
|
||||
interface IContact {
|
||||
relationship?: IRelationship[];
|
||||
name?: IName;
|
||||
telecom?: ITelecom[];
|
||||
address?: IAddress;
|
||||
gender: string;
|
||||
organization?: IOrganization;
|
||||
period?: IPeriod;
|
||||
}
|
||||
|
||||
interface ILanguage {
|
||||
coding?: ICoding[];
|
||||
text?: string;
|
||||
}
|
||||
|
||||
interface ICommunication {
|
||||
language?: ILanguage;
|
||||
preferred?: boolean;
|
||||
}
|
||||
|
||||
interface IGeneralPractitioner {
|
||||
reference?: string;
|
||||
type?: string;
|
||||
identifier?: IIdentifier;
|
||||
display?: string;
|
||||
}
|
||||
|
||||
interface IManagingOrganization {
|
||||
reference?: string;
|
||||
type?: string;
|
||||
identifier?: IIdentifier;
|
||||
display?: string;
|
||||
}
|
||||
|
||||
interface IOther {
|
||||
reference?: string;
|
||||
type?: string;
|
||||
identifier?: IIdentifier;
|
||||
display?: string;
|
||||
}
|
||||
|
||||
interface ILink {
|
||||
other?: IOther;
|
||||
type: string;
|
||||
}
|
||||
|
||||
// Patient is an asset
|
||||
export class Patient {
|
||||
public resourceType?: string;
|
||||
public id?: string;
|
||||
public meta?: IMeta;
|
||||
public implicitRules?: string;
|
||||
public language?: string;
|
||||
public Text?: Text;
|
||||
public identifier?: IIdentifier[];
|
||||
public active?: boolean;
|
||||
public name?: IName[];
|
||||
public telecom?: ITelecom[];
|
||||
public gender: string;
|
||||
public birthDate?: string;
|
||||
public deceasedBoolean?: boolean;
|
||||
public address?: IAddress[];
|
||||
public maritalStatus?: IMaritalStatus;
|
||||
public multipleBirthBoolean?: boolean;
|
||||
public photo?: IPhoto[];
|
||||
public contact?: IContact[];
|
||||
public communication?: ICommunication[];
|
||||
public generalPractitioner?: IGeneralPractitioner[];
|
||||
public managingOrganization?: IManagingOrganization[];
|
||||
public link?: ILink[];
|
||||
}
|
||||
16
hyperledger-fabric/chaincode/fhir-data/tsconfig.json
Normal file
16
hyperledger-fabric/chaincode/fhir-data/tsconfig.json
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"outDir": "dist",
|
||||
"target": "es2017",
|
||||
"moduleResolution": "node",
|
||||
"module": "commonjs",
|
||||
"declaration": true,
|
||||
"sourceMap": true
|
||||
},
|
||||
"include": [
|
||||
"./src/**/*"
|
||||
],
|
||||
"exclude": [
|
||||
"./src/**/*.spec.ts"
|
||||
]
|
||||
}
|
||||
21
hyperledger-fabric/chaincode/fhir-data/tslint.json
Normal file
21
hyperledger-fabric/chaincode/fhir-data/tslint.json
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"defaultSeverity": "error",
|
||||
"extends": [
|
||||
"tslint:recommended"
|
||||
],
|
||||
"jsRules": {},
|
||||
"rules": {
|
||||
"indent": [true, "spaces", 4],
|
||||
"linebreak-style": [true, "LF"],
|
||||
"quotemark": [true, "single"],
|
||||
"semicolon": [true, "always"],
|
||||
"no-console": false,
|
||||
"curly": true,
|
||||
"triple-equals": true,
|
||||
"no-string-throw": true,
|
||||
"no-var-keyword": true,
|
||||
"no-trailing-whitespace": true,
|
||||
"object-literal-key-quotes": [true, "as-needed"]
|
||||
},
|
||||
"rulesDirectory": []
|
||||
}
|
||||
606
hyperledger-fabric/config/configtx.yaml
Normal file
606
hyperledger-fabric/config/configtx.yaml
Normal file
|
|
@ -0,0 +1,606 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
---
|
||||
################################################################################
|
||||
#
|
||||
# ORGANIZATIONS
|
||||
#
|
||||
# This section defines the organizational identities that can be referenced
|
||||
# in the configuration profiles.
|
||||
#
|
||||
################################################################################
|
||||
Organizations:
|
||||
|
||||
# SampleOrg defines an MSP using the sampleconfig. It should never be used
|
||||
# in production but may be used as a template for other definitions.
|
||||
- &SampleOrg
|
||||
# Name is the key by which this org will be referenced in channel
|
||||
# configuration transactions.
|
||||
# Name can include alphanumeric characters as well as dots and dashes.
|
||||
Name: SampleOrg
|
||||
|
||||
# SkipAsForeign can be set to true for org definitions which are to be
|
||||
# inherited from the orderer system channel during channel creation. This
|
||||
# is especially useful when an admin of a single org without access to the
|
||||
# MSP directories of the other orgs wishes to create a channel. Note
|
||||
# this property must always be set to false for orgs included in block
|
||||
# creation.
|
||||
SkipAsForeign: false
|
||||
|
||||
# ID is the key by which this org's MSP definition will be referenced.
|
||||
# ID can include alphanumeric characters as well as dots and dashes.
|
||||
ID: SampleOrg
|
||||
|
||||
# MSPDir is the filesystem path which contains the MSP configuration.
|
||||
MSPDir: msp
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For organization policies, their canonical path is usually
|
||||
# /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
|
||||
Policies: &SampleOrgPolicies
|
||||
Readers:
|
||||
Type: Signature
|
||||
Rule: "OR('SampleOrg.member')"
|
||||
# If your MSP is configured with the new NodeOUs, you might
|
||||
# want to use a more specific rule like the following:
|
||||
# Rule: "OR('SampleOrg.admin', 'SampleOrg.peer', 'SampleOrg.client')"
|
||||
Writers:
|
||||
Type: Signature
|
||||
Rule: "OR('SampleOrg.member')"
|
||||
# If your MSP is configured with the new NodeOUs, you might
|
||||
# want to use a more specific rule like the following:
|
||||
# Rule: "OR('SampleOrg.admin', 'SampleOrg.client')"
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('SampleOrg.admin')"
|
||||
Endorsement:
|
||||
Type: Signature
|
||||
Rule: "OR('SampleOrg.member')"
|
||||
|
||||
# OrdererEndpoints is a list of all orderers this org runs which clients
|
||||
# and peers may to connect to to push transactions and receive blocks respectively.
|
||||
OrdererEndpoints:
|
||||
- "127.0.0.1:7050"
|
||||
|
||||
# AnchorPeers defines the location of peers which can be used for
|
||||
# cross-org gossip communication. Note, this value is only encoded in
|
||||
# the genesis block in the Application section context.
|
||||
AnchorPeers:
|
||||
- Host: 127.0.0.1
|
||||
Port: 7051
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# CAPABILITIES
|
||||
#
|
||||
# This section defines the capabilities of fabric network. This is a new
|
||||
# concept as of v1.1.0 and should not be utilized in mixed networks with
|
||||
# v1.0.x peers and orderers. Capabilities define features which must be
|
||||
# present in a fabric binary for that binary to safely participate in the
|
||||
# fabric network. For instance, if a new MSP type is added, newer binaries
|
||||
# might recognize and validate the signatures from this type, while older
|
||||
# binaries without this support would be unable to validate those
|
||||
# transactions. This could lead to different versions of the fabric binaries
|
||||
# having different world states. Instead, defining a capability for a channel
|
||||
# informs those binaries without this capability that they must cease
|
||||
# processing transactions until they have been upgraded. For v1.0.x if any
|
||||
# capabilities are defined (including a map with all capabilities turned off)
|
||||
# then the v1.0.x peer will deliberately crash.
|
||||
#
|
||||
################################################################################
|
||||
Capabilities:
|
||||
# Channel capabilities apply to both the orderers and the peers and must be
|
||||
# supported by both.
|
||||
# Set the value of the capability to true to require it.
|
||||
Channel: &ChannelCapabilities
|
||||
# V2.0 for Channel is a catchall flag for behavior which has been
|
||||
# determined to be desired for all orderers and peers running at the v2.0.0
|
||||
# level, but which would be incompatible with orderers and peers from
|
||||
# prior releases.
|
||||
# Prior to enabling V2.0 channel capabilities, ensure that all
|
||||
# orderers and peers on a channel are at v2.0.0 or later.
|
||||
V2_0: true
|
||||
|
||||
# Orderer capabilities apply only to the orderers, and may be safely
|
||||
# used with prior release peers.
|
||||
# Set the value of the capability to true to require it.
|
||||
Orderer: &OrdererCapabilities
|
||||
# V1.1 for Orderer is a catchall flag for behavior which has been
|
||||
# determined to be desired for all orderers running at the v1.1.x
|
||||
# level, but which would be incompatible with orderers from prior releases.
|
||||
# Prior to enabling V2.0 orderer capabilities, ensure that all
|
||||
# orderers on a channel are at v2.0.0 or later.
|
||||
V2_0: true
|
||||
|
||||
# Application capabilities apply only to the peer network, and may be safely
|
||||
# used with prior release orderers.
|
||||
# Set the value of the capability to true to require it.
|
||||
Application: &ApplicationCapabilities
|
||||
# V2.0 for Application enables the new non-backwards compatible
|
||||
# features and fixes of fabric v2.0.
|
||||
# Prior to enabling V2.0 orderer capabilities, ensure that all
|
||||
# orderers on a channel are at v2.0.0 or later.
|
||||
V2_0: true
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# APPLICATION
|
||||
#
|
||||
# This section defines the values to encode into a config transaction or
|
||||
# genesis block for application-related parameters.
|
||||
#
|
||||
################################################################################
|
||||
Application: &ApplicationDefaults
|
||||
ACLs: &ACLsDefault
|
||||
# This section provides defaults for policies for various resources
|
||||
# in the system. These "resources" could be functions on system chaincodes
|
||||
# (e.g., "GetBlockByNumber" on the "qscc" system chaincode) or other resources
|
||||
# (e.g.,who can receive Block events). This section does NOT specify the resource's
|
||||
# definition or API, but just the ACL policy for it.
|
||||
#
|
||||
# Users can override these defaults with their own policy mapping by defining the
|
||||
# mapping under ACLs in their channel definition
|
||||
|
||||
#---New Lifecycle System Chaincode (_lifecycle) function to policy mapping for access control--#
|
||||
|
||||
# ACL policy for _lifecycle's "CheckCommitReadiness" function
|
||||
_lifecycle/CheckCommitReadiness: /Channel/Application/Writers
|
||||
|
||||
# ACL policy for _lifecycle's "CommitChaincodeDefinition" function
|
||||
_lifecycle/CommitChaincodeDefinition: /Channel/Application/Writers
|
||||
|
||||
# ACL policy for _lifecycle's "QueryChaincodeDefinition" function
|
||||
_lifecycle/QueryChaincodeDefinition: /Channel/Application/Readers
|
||||
|
||||
# ACL policy for _lifecycle's "QueryChaincodeDefinitions" function
|
||||
_lifecycle/QueryChaincodeDefinitions: /Channel/Application/Readers
|
||||
|
||||
#---Lifecycle System Chaincode (lscc) function to policy mapping for access control---#
|
||||
|
||||
# ACL policy for lscc's "getid" function
|
||||
lscc/ChaincodeExists: /Channel/Application/Readers
|
||||
|
||||
# ACL policy for lscc's "getdepspec" function
|
||||
lscc/GetDeploymentSpec: /Channel/Application/Readers
|
||||
|
||||
# ACL policy for lscc's "getccdata" function
|
||||
lscc/GetChaincodeData: /Channel/Application/Readers
|
||||
|
||||
# ACL Policy for lscc's "getchaincodes" function
|
||||
lscc/GetInstantiatedChaincodes: /Channel/Application/Readers
|
||||
|
||||
#---Query System Chaincode (qscc) function to policy mapping for access control---#
|
||||
|
||||
# ACL policy for qscc's "GetChainInfo" function
|
||||
qscc/GetChainInfo: /Channel/Application/Readers
|
||||
|
||||
# ACL policy for qscc's "GetBlockByNumber" function
|
||||
qscc/GetBlockByNumber: /Channel/Application/Readers
|
||||
|
||||
# ACL policy for qscc's "GetBlockByHash" function
|
||||
qscc/GetBlockByHash: /Channel/Application/Readers
|
||||
|
||||
# ACL policy for qscc's "GetTransactionByID" function
|
||||
qscc/GetTransactionByID: /Channel/Application/Readers
|
||||
|
||||
# ACL policy for qscc's "GetBlockByTxID" function
|
||||
qscc/GetBlockByTxID: /Channel/Application/Readers
|
||||
|
||||
#---Configuration System Chaincode (cscc) function to policy mapping for access control---#
|
||||
|
||||
# ACL policy for cscc's "GetConfigBlock" function
|
||||
cscc/GetConfigBlock: /Channel/Application/Readers
|
||||
|
||||
# ACL policy for cscc's "GetConfigTree" function
|
||||
cscc/GetConfigTree: /Channel/Application/Readers
|
||||
|
||||
# ACL policy for cscc's "SimulateConfigTreeUpdate" function
|
||||
cscc/SimulateConfigTreeUpdate: /Channel/Application/Readers
|
||||
|
||||
#---Miscellanesous peer function to policy mapping for access control---#
|
||||
|
||||
# ACL policy for invoking chaincodes on peer
|
||||
peer/Propose: /Channel/Application/Writers
|
||||
|
||||
# ACL policy for chaincode to chaincode invocation
|
||||
peer/ChaincodeToChaincode: /Channel/Application/Readers
|
||||
|
||||
#---Events resource to policy mapping for access control###---#
|
||||
|
||||
# ACL policy for sending block events
|
||||
event/Block: /Channel/Application/Readers
|
||||
|
||||
# ACL policy for sending filtered block events
|
||||
event/FilteredBlock: /Channel/Application/Readers
|
||||
|
||||
# Organizations lists the orgs participating on the application side of the
|
||||
# network.
|
||||
Organizations:
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For Application policies, their canonical path is
|
||||
# /Channel/Application/<PolicyName>
|
||||
Policies: &ApplicationDefaultPolicies
|
||||
LifecycleEndorsement:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Endorsement"
|
||||
Endorsement:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Endorsement"
|
||||
Readers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Readers"
|
||||
Writers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Writers"
|
||||
Admins:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Admins"
|
||||
|
||||
# Capabilities describes the application level capabilities, see the
|
||||
# dedicated Capabilities section elsewhere in this file for a full
|
||||
# description
|
||||
Capabilities:
|
||||
<<: *ApplicationCapabilities
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# ORDERER
|
||||
#
|
||||
# This section defines the values to encode into a config transaction or
|
||||
# genesis block for orderer related parameters.
|
||||
#
|
||||
################################################################################
|
||||
Orderer: &OrdererDefaults
|
||||
|
||||
# Orderer Type: The orderer implementation to start.
|
||||
# Available types are "solo", "kafka" and "etcdraft".
|
||||
OrdererType: solo
|
||||
|
||||
# Addresses used to be the list of orderer addresses that clients and peers
|
||||
# could connect to. However, this does not allow clients to associate orderer
|
||||
# addresses and orderer organizations which can be useful for things such
|
||||
# as TLS validation. The preferred way to specify orderer addresses is now
|
||||
# to include the OrdererEndpoints item in your org definition
|
||||
Addresses:
|
||||
# - 127.0.0.1:7050
|
||||
|
||||
# Batch Timeout: The amount of time to wait before creating a batch.
|
||||
BatchTimeout: 2s
|
||||
|
||||
# Batch Size: Controls the number of messages batched into a block.
|
||||
# The orderer views messages opaquely, but typically, messages may
|
||||
# be considered to be Fabric transactions. The 'batch' is the group
|
||||
# of messages in the 'data' field of the block. Blocks will be a few kb
|
||||
# larger than the batch size, when signatures, hashes, and other metadata
|
||||
# is applied.
|
||||
BatchSize:
|
||||
|
||||
# Max Message Count: The maximum number of messages to permit in a
|
||||
# batch. No block will contain more than this number of messages.
|
||||
MaxMessageCount: 500
|
||||
|
||||
# Absolute Max Bytes: The absolute maximum number of bytes allowed for
|
||||
# the serialized messages in a batch. The maximum block size is this value
|
||||
# plus the size of the associated metadata (usually a few KB depending
|
||||
# upon the size of the signing identities). Any transaction larger than
|
||||
# this value will be rejected by ordering. If the "kafka" OrdererType is
|
||||
# selected, set 'message.max.bytes' and 'replica.fetch.max.bytes' on
|
||||
# the Kafka brokers to a value that is larger than this one.
|
||||
AbsoluteMaxBytes: 10 MB
|
||||
|
||||
# Preferred Max Bytes: The preferred maximum number of bytes allowed
|
||||
# for the serialized messages in a batch. Roughly, this field may be considered
|
||||
# the best effort maximum size of a batch. A batch will fill with messages
|
||||
# until this size is reached (or the max message count, or batch timeout is
|
||||
# exceeded). If adding a new message to the batch would cause the batch to
|
||||
# exceed the preferred max bytes, then the current batch is closed and written
|
||||
# to a block, and a new batch containing the new message is created. If a
|
||||
# message larger than the preferred max bytes is received, then its batch
|
||||
# will contain only that message. Because messages may be larger than
|
||||
# preferred max bytes (up to AbsoluteMaxBytes), some batches may exceed
|
||||
# the preferred max bytes, but will always contain exactly one transaction.
|
||||
PreferredMaxBytes: 2 MB
|
||||
|
||||
# Max Channels is the maximum number of channels to allow on the ordering
|
||||
# network. When set to 0, this implies no maximum number of channels.
|
||||
MaxChannels: 0
|
||||
|
||||
Kafka:
|
||||
# Brokers: A list of Kafka brokers to which the orderer connects. Edit
|
||||
# this list to identify the brokers of the ordering service.
|
||||
# NOTE: Use IP:port notation.
|
||||
Brokers:
|
||||
- kafka0:9092
|
||||
- kafka1:9092
|
||||
- kafka2:9092
|
||||
|
||||
# EtcdRaft defines configuration which must be set when the "etcdraft"
|
||||
# orderertype is chosen.
|
||||
EtcdRaft:
|
||||
# The set of Raft replicas for this network. For the etcd/raft-based
|
||||
# implementation, we expect every replica to also be an OSN. Therefore,
|
||||
# a subset of the host:port items enumerated in this list should be
|
||||
# replicated under the Orderer.Addresses key above.
|
||||
Consenters:
|
||||
- Host: raft0.example.com
|
||||
Port: 7050
|
||||
ClientTLSCert: path/to/ClientTLSCert0
|
||||
ServerTLSCert: path/to/ServerTLSCert0
|
||||
- Host: raft1.example.com
|
||||
Port: 7050
|
||||
ClientTLSCert: path/to/ClientTLSCert1
|
||||
ServerTLSCert: path/to/ServerTLSCert1
|
||||
- Host: raft2.example.com
|
||||
Port: 7050
|
||||
ClientTLSCert: path/to/ClientTLSCert2
|
||||
ServerTLSCert: path/to/ServerTLSCert2
|
||||
|
||||
# Options to be specified for all the etcd/raft nodes. The values here
|
||||
# are the defaults for all new channels and can be modified on a
|
||||
# per-channel basis via configuration updates.
|
||||
Options:
|
||||
# TickInterval is the time interval between two Node.Tick invocations.
|
||||
TickInterval: 500ms
|
||||
|
||||
# ElectionTick is the number of Node.Tick invocations that must pass
|
||||
# between elections. That is, if a follower does not receive any
|
||||
# message from the leader of current term before ElectionTick has
|
||||
# elapsed, it will become candidate and start an election.
|
||||
# ElectionTick must be greater than HeartbeatTick.
|
||||
ElectionTick: 10
|
||||
|
||||
# HeartbeatTick is the number of Node.Tick invocations that must
|
||||
# pass between heartbeats. That is, a leader sends heartbeat
|
||||
# messages to maintain its leadership every HeartbeatTick ticks.
|
||||
HeartbeatTick: 1
|
||||
|
||||
# MaxInflightBlocks limits the max number of in-flight append messages
|
||||
# during optimistic replication phase.
|
||||
MaxInflightBlocks: 5
|
||||
|
||||
# SnapshotIntervalSize defines number of bytes per which a snapshot is taken
|
||||
SnapshotIntervalSize: 16 MB
|
||||
|
||||
# Organizations lists the orgs participating on the orderer side of the
|
||||
# network.
|
||||
Organizations:
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For Orderer policies, their canonical path is
|
||||
# /Channel/Orderer/<PolicyName>
|
||||
Policies:
|
||||
Readers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Readers"
|
||||
Writers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Writers"
|
||||
Admins:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Admins"
|
||||
# BlockValidation specifies what signatures must be included in the block
|
||||
# from the orderer for the peer to validate it.
|
||||
BlockValidation:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Writers"
|
||||
|
||||
# Capabilities describes the orderer level capabilities, see the
|
||||
# dedicated Capabilities section elsewhere in this file for a full
|
||||
# description
|
||||
Capabilities:
|
||||
<<: *OrdererCapabilities
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# CHANNEL
|
||||
#
|
||||
# This section defines the values to encode into a config transaction or
|
||||
# genesis block for channel related parameters.
|
||||
#
|
||||
################################################################################
|
||||
Channel: &ChannelDefaults
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For Channel policies, their canonical path is
|
||||
# /Channel/<PolicyName>
|
||||
Policies:
|
||||
# Who may invoke the 'Deliver' API
|
||||
Readers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Readers"
|
||||
# Who may invoke the 'Broadcast' API
|
||||
Writers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Writers"
|
||||
# By default, who may modify elements at this config level
|
||||
Admins:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Admins"
|
||||
|
||||
|
||||
# Capabilities describes the channel level capabilities, see the
|
||||
# dedicated Capabilities section elsewhere in this file for a full
|
||||
# description
|
||||
Capabilities:
|
||||
<<: *ChannelCapabilities
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# PROFILES
|
||||
#
|
||||
# Different configuration profiles may be encoded here to be specified as
|
||||
# parameters to the configtxgen tool. The profiles which specify consortiums
|
||||
# are to be used for generating the orderer genesis block. With the correct
|
||||
# consortium members defined in the orderer genesis block, channel creation
|
||||
# requests may be generated with only the org member names and a consortium
|
||||
# name.
|
||||
#
|
||||
################################################################################
|
||||
Profiles:
|
||||
|
||||
# SampleSingleMSPSolo defines a configuration which uses the Solo orderer,
|
||||
# and contains a single MSP definition (the MSP sampleconfig).
|
||||
# The Consortium SampleConsortium has only a single member, SampleOrg.
|
||||
SampleSingleMSPSolo:
|
||||
<<: *ChannelDefaults
|
||||
Orderer:
|
||||
<<: *OrdererDefaults
|
||||
Organizations:
|
||||
- *SampleOrg
|
||||
Consortiums:
|
||||
SampleConsortium:
|
||||
Organizations:
|
||||
- *SampleOrg
|
||||
|
||||
# SampleSingleMSPKafka defines a configuration that differs from the
|
||||
# SampleSingleMSPSolo one only in that it uses the Kafka-based orderer.
|
||||
SampleSingleMSPKafka:
|
||||
<<: *ChannelDefaults
|
||||
Orderer:
|
||||
<<: *OrdererDefaults
|
||||
OrdererType: kafka
|
||||
Organizations:
|
||||
- *SampleOrg
|
||||
Consortiums:
|
||||
SampleConsortium:
|
||||
Organizations:
|
||||
- *SampleOrg
|
||||
|
||||
# SampleInsecureSolo defines a configuration which uses the Solo orderer,
|
||||
# contains no MSP definitions, and allows all transactions and channel
|
||||
# creation requests for the consortium SampleConsortium.
|
||||
SampleInsecureSolo:
|
||||
<<: *ChannelDefaults
|
||||
Orderer:
|
||||
<<: *OrdererDefaults
|
||||
Consortiums:
|
||||
SampleConsortium:
|
||||
Organizations:
|
||||
|
||||
# SampleInsecureKafka defines a configuration that differs from the
|
||||
# SampleInsecureSolo one only in that it uses the Kafka-based orderer.
|
||||
SampleInsecureKafka:
|
||||
<<: *ChannelDefaults
|
||||
Orderer:
|
||||
OrdererType: kafka
|
||||
<<: *OrdererDefaults
|
||||
Consortiums:
|
||||
SampleConsortium:
|
||||
Organizations:
|
||||
|
||||
# SampleDevModeSolo defines a configuration which uses the Solo orderer,
|
||||
# contains the sample MSP as both orderer and consortium member, and
|
||||
# requires only basic membership for admin privileges. It also defines
|
||||
# an Application on the ordering system channel, which should usually
|
||||
# be avoided.
|
||||
SampleDevModeSolo:
|
||||
<<: *ChannelDefaults
|
||||
Orderer:
|
||||
<<: *OrdererDefaults
|
||||
Organizations:
|
||||
- <<: *SampleOrg
|
||||
Policies:
|
||||
<<: *SampleOrgPolicies
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('SampleOrg.member')"
|
||||
Application:
|
||||
<<: *ApplicationDefaults
|
||||
Organizations:
|
||||
- <<: *SampleOrg
|
||||
Policies:
|
||||
<<: *SampleOrgPolicies
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('SampleOrg.member')"
|
||||
Consortiums:
|
||||
SampleConsortium:
|
||||
Organizations:
|
||||
- <<: *SampleOrg
|
||||
Policies:
|
||||
<<: *SampleOrgPolicies
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('SampleOrg.member')"
|
||||
|
||||
# SampleDevModeKafka defines a configuration that differs from the
|
||||
# SampleDevModeSolo one only in that it uses the Kafka-based orderer.
|
||||
SampleDevModeKafka:
|
||||
<<: *ChannelDefaults
|
||||
Orderer:
|
||||
<<: *OrdererDefaults
|
||||
OrdererType: kafka
|
||||
Organizations:
|
||||
- <<: *SampleOrg
|
||||
Policies:
|
||||
<<: *SampleOrgPolicies
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('SampleOrg.member')"
|
||||
Application:
|
||||
<<: *ApplicationDefaults
|
||||
Organizations:
|
||||
- <<: *SampleOrg
|
||||
Policies:
|
||||
<<: *SampleOrgPolicies
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('SampleOrg.member')"
|
||||
Consortiums:
|
||||
SampleConsortium:
|
||||
Organizations:
|
||||
- <<: *SampleOrg
|
||||
Policies:
|
||||
<<: *SampleOrgPolicies
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('SampleOrg.member')"
|
||||
|
||||
# SampleSingleMSPChannel defines a channel with only the sample org as a
|
||||
# member. It is designed to be used in conjunction with SampleSingleMSPSolo
|
||||
# and SampleSingleMSPKafka orderer profiles. Note, for channel creation
|
||||
# profiles, only the 'Application' section and consortium # name are
|
||||
# considered.
|
||||
SampleSingleMSPChannel:
|
||||
<<: *ChannelDefaults
|
||||
Consortium: SampleConsortium
|
||||
Application:
|
||||
<<: *ApplicationDefaults
|
||||
Organizations:
|
||||
- <<: *SampleOrg
|
||||
|
||||
# SampleDevModeEtcdRaft defines a configuration that differs from the
|
||||
# SampleDevModeSolo one only in that it uses the etcd/raft-based orderer.
|
||||
SampleDevModeEtcdRaft:
|
||||
<<: *ChannelDefaults
|
||||
Orderer:
|
||||
<<: *OrdererDefaults
|
||||
OrdererType: etcdraft
|
||||
Organizations:
|
||||
- <<: *SampleOrg
|
||||
Policies:
|
||||
<<: *SampleOrgPolicies
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('SampleOrg.member')"
|
||||
Application:
|
||||
<<: *ApplicationDefaults
|
||||
Organizations:
|
||||
- <<: *SampleOrg
|
||||
Policies:
|
||||
<<: *SampleOrgPolicies
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('SampleOrg.member')"
|
||||
Consortiums:
|
||||
SampleConsortium:
|
||||
Organizations:
|
||||
- <<: *SampleOrg
|
||||
Policies:
|
||||
<<: *SampleOrgPolicies
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('SampleOrg.member')"
|
||||
727
hyperledger-fabric/config/core.yaml
Normal file
727
hyperledger-fabric/config/core.yaml
Normal file
|
|
@ -0,0 +1,727 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Peer section
|
||||
#
|
||||
###############################################################################
|
||||
peer:
|
||||
|
||||
# The peer id provides a name for this peer instance and is used when
|
||||
# naming docker resources.
|
||||
id: jdoe
|
||||
|
||||
# The networkId allows for logical separation of networks and is used when
|
||||
# naming docker resources.
|
||||
networkId: dev
|
||||
|
||||
# The Address at local network interface this Peer will listen on.
|
||||
# By default, it will listen on all network interfaces
|
||||
listenAddress: 0.0.0.0:7051
|
||||
|
||||
# The endpoint this peer uses to listen for inbound chaincode connections.
|
||||
# If this is commented-out, the listen address is selected to be
|
||||
# the peer's address (see below) with port 7052
|
||||
# chaincodeListenAddress: 0.0.0.0:7052
|
||||
|
||||
# The endpoint the chaincode for this peer uses to connect to the peer.
|
||||
# If this is not specified, the chaincodeListenAddress address is selected.
|
||||
# And if chaincodeListenAddress is not specified, address is selected from
|
||||
# peer listenAddress.
|
||||
# chaincodeAddress: 0.0.0.0:7052
|
||||
|
||||
# When used as peer config, this represents the endpoint to other peers
|
||||
# in the same organization. For peers in other organization, see
|
||||
# gossip.externalEndpoint for more info.
|
||||
# When used as CLI config, this means the peer's endpoint to interact with
|
||||
address: 0.0.0.0:7051
|
||||
|
||||
# Whether the Peer should programmatically determine its address
|
||||
# This case is useful for docker containers.
|
||||
addressAutoDetect: false
|
||||
|
||||
# Keepalive settings for peer server and clients
|
||||
keepalive:
|
||||
# Interval is the duration after which if the server does not see
|
||||
# any activity from the client it pings the client to see if it's alive
|
||||
interval: 7200s
|
||||
# Timeout is the duration the server waits for a response
|
||||
# from the client after sending a ping before closing the connection
|
||||
timeout: 20s
|
||||
# MinInterval is the minimum permitted time between client pings.
|
||||
# If clients send pings more frequently, the peer server will
|
||||
# disconnect them
|
||||
minInterval: 60s
|
||||
# Client keepalive settings for communicating with other peer nodes
|
||||
client:
|
||||
# Interval is the time between pings to peer nodes. This must
|
||||
# greater than or equal to the minInterval specified by peer
|
||||
# nodes
|
||||
interval: 60s
|
||||
# Timeout is the duration the client waits for a response from
|
||||
# peer nodes before closing the connection
|
||||
timeout: 20s
|
||||
# DeliveryClient keepalive settings for communication with ordering
|
||||
# nodes.
|
||||
deliveryClient:
|
||||
# Interval is the time between pings to ordering nodes. This must
|
||||
# greater than or equal to the minInterval specified by ordering
|
||||
# nodes.
|
||||
interval: 60s
|
||||
# Timeout is the duration the client waits for a response from
|
||||
# ordering nodes before closing the connection
|
||||
timeout: 20s
|
||||
|
||||
|
||||
# Gossip related configuration
|
||||
gossip:
|
||||
# Bootstrap set to initialize gossip with.
|
||||
# This is a list of other peers that this peer reaches out to at startup.
|
||||
# Important: The endpoints here have to be endpoints of peers in the same
|
||||
# organization, because the peer would refuse connecting to these endpoints
|
||||
# unless they are in the same organization as the peer.
|
||||
bootstrap: 127.0.0.1:7051
|
||||
|
||||
# NOTE: orgLeader and useLeaderElection parameters are mutual exclusive.
|
||||
# Setting both to true would result in the termination of the peer
|
||||
# since this is undefined state. If the peers are configured with
|
||||
# useLeaderElection=false, make sure there is at least 1 peer in the
|
||||
# organization that its orgLeader is set to true.
|
||||
|
||||
# Defines whenever peer will initialize dynamic algorithm for
|
||||
# "leader" selection, where leader is the peer to establish
|
||||
# connection with ordering service and use delivery protocol
|
||||
# to pull ledger blocks from ordering service. It is recommended to
|
||||
# use leader election for large networks of peers.
|
||||
useLeaderElection: true
|
||||
# Statically defines peer to be an organization "leader",
|
||||
# where this means that current peer will maintain connection
|
||||
# with ordering service and disseminate block across peers in
|
||||
# its own organization
|
||||
orgLeader: false
|
||||
|
||||
# Interval for membershipTracker polling
|
||||
membershipTrackerInterval: 5s
|
||||
|
||||
# Overrides the endpoint that the peer publishes to peers
|
||||
# in its organization. For peers in foreign organizations
|
||||
# see 'externalEndpoint'
|
||||
endpoint:
|
||||
# Maximum count of blocks stored in memory
|
||||
maxBlockCountToStore: 100
|
||||
# Max time between consecutive message pushes(unit: millisecond)
|
||||
maxPropagationBurstLatency: 10ms
|
||||
# Max number of messages stored until a push is triggered to remote peers
|
||||
maxPropagationBurstSize: 10
|
||||
# Number of times a message is pushed to remote peers
|
||||
propagateIterations: 1
|
||||
# Number of peers selected to push messages to
|
||||
propagatePeerNum: 3
|
||||
# Determines frequency of pull phases(unit: second)
|
||||
# Must be greater than digestWaitTime + responseWaitTime
|
||||
pullInterval: 4s
|
||||
# Number of peers to pull from
|
||||
pullPeerNum: 3
|
||||
# Determines frequency of pulling state info messages from peers(unit: second)
|
||||
requestStateInfoInterval: 4s
|
||||
# Determines frequency of pushing state info messages to peers(unit: second)
|
||||
publishStateInfoInterval: 4s
|
||||
# Maximum time a stateInfo message is kept until expired
|
||||
stateInfoRetentionInterval:
|
||||
# Time from startup certificates are included in Alive messages(unit: second)
|
||||
publishCertPeriod: 10s
|
||||
# Should we skip verifying block messages or not (currently not in use)
|
||||
skipBlockVerification: false
|
||||
# Dial timeout(unit: second)
|
||||
dialTimeout: 3s
|
||||
# Connection timeout(unit: second)
|
||||
connTimeout: 2s
|
||||
# Buffer size of received messages
|
||||
recvBuffSize: 20
|
||||
# Buffer size of sending messages
|
||||
sendBuffSize: 200
|
||||
# Time to wait before pull engine processes incoming digests (unit: second)
|
||||
# Should be slightly smaller than requestWaitTime
|
||||
digestWaitTime: 1s
|
||||
# Time to wait before pull engine removes incoming nonce (unit: milliseconds)
|
||||
# Should be slightly bigger than digestWaitTime
|
||||
requestWaitTime: 1500ms
|
||||
# Time to wait before pull engine ends pull (unit: second)
|
||||
responseWaitTime: 2s
|
||||
# Alive check interval(unit: second)
|
||||
aliveTimeInterval: 5s
|
||||
# Alive expiration timeout(unit: second)
|
||||
aliveExpirationTimeout: 25s
|
||||
# Reconnect interval(unit: second)
|
||||
reconnectInterval: 25s
|
||||
# This is an endpoint that is published to peers outside of the organization.
|
||||
# If this isn't set, the peer will not be known to other organizations.
|
||||
externalEndpoint:
|
||||
# Leader election service configuration
|
||||
election:
|
||||
# Longest time peer waits for stable membership during leader election startup (unit: second)
|
||||
startupGracePeriod: 15s
|
||||
# Interval gossip membership samples to check its stability (unit: second)
|
||||
membershipSampleInterval: 1s
|
||||
# Time passes since last declaration message before peer decides to perform leader election (unit: second)
|
||||
leaderAliveThreshold: 10s
|
||||
# Time between peer sends propose message and declares itself as a leader (sends declaration message) (unit: second)
|
||||
leaderElectionDuration: 5s
|
||||
|
||||
pvtData:
|
||||
# pullRetryThreshold determines the maximum duration of time private data corresponding for a given block
|
||||
# would be attempted to be pulled from peers until the block would be committed without the private data
|
||||
pullRetryThreshold: 60s
|
||||
# As private data enters the transient store, it is associated with the peer's ledger's height at that time.
|
||||
# transientstoreMaxBlockRetention defines the maximum difference between the current ledger's height upon commit,
|
||||
# and the private data residing inside the transient store that is guaranteed not to be purged.
|
||||
# Private data is purged from the transient store when blocks with sequences that are multiples
|
||||
# of transientstoreMaxBlockRetention are committed.
|
||||
transientstoreMaxBlockRetention: 1000
|
||||
# pushAckTimeout is the maximum time to wait for an acknowledgement from each peer
|
||||
# at private data push at endorsement time.
|
||||
pushAckTimeout: 3s
|
||||
# Block to live pulling margin, used as a buffer
|
||||
# to prevent peer from trying to pull private data
|
||||
# from peers that is soon to be purged in next N blocks.
|
||||
# This helps a newly joined peer catch up to current
|
||||
# blockchain height quicker.
|
||||
btlPullMargin: 10
|
||||
# the process of reconciliation is done in an endless loop, while in each iteration reconciler tries to
|
||||
# pull from the other peers the most recent missing blocks with a maximum batch size limitation.
|
||||
# reconcileBatchSize determines the maximum batch size of missing private data that will be reconciled in a
|
||||
# single iteration.
|
||||
reconcileBatchSize: 10
|
||||
# reconcileSleepInterval determines the time reconciler sleeps from end of an iteration until the beginning
|
||||
# of the next reconciliation iteration.
|
||||
reconcileSleepInterval: 1m
|
||||
# reconciliationEnabled is a flag that indicates whether private data reconciliation is enable or not.
|
||||
reconciliationEnabled: true
|
||||
# skipPullingInvalidTransactionsDuringCommit is a flag that indicates whether pulling of invalid
|
||||
# transaction's private data from other peers need to be skipped during the commit time and pulled
|
||||
# only through reconciler.
|
||||
skipPullingInvalidTransactionsDuringCommit: false
|
||||
# implicitCollectionDisseminationPolicy specifies the dissemination policy for the peer's own implicit collection.
|
||||
# When a peer endorses a proposal that writes to its own implicit collection, below values override the default values
|
||||
# for disseminating private data.
|
||||
# Note that it is applicable to all channels the peer has joined. The implication is that requiredPeerCount has to
|
||||
# be smaller than the number of peers in a channel that has the lowest numbers of peers from the organization.
|
||||
implicitCollectionDisseminationPolicy:
|
||||
# requiredPeerCount defines the minimum number of eligible peers to which the peer must successfully
|
||||
# disseminate private data for its own implicit collection during endorsement. Default value is 0.
|
||||
requiredPeerCount: 0
|
||||
# maxPeerCount defines the maximum number of eligible peers to which the peer will attempt to
|
||||
# disseminate private data for its own implicit collection during endorsement. Default value is 1.
|
||||
maxPeerCount: 1
|
||||
|
||||
# Gossip state transfer related configuration
|
||||
state:
|
||||
# indicates whenever state transfer is enabled or not
|
||||
# default value is true, i.e. state transfer is active
|
||||
# and takes care to sync up missing blocks allowing
|
||||
# lagging peer to catch up to speed with rest network
|
||||
enabled: true
|
||||
# checkInterval interval to check whether peer is lagging behind enough to
|
||||
# request blocks via state transfer from another peer.
|
||||
checkInterval: 10s
|
||||
# responseTimeout amount of time to wait for state transfer response from
|
||||
# other peers
|
||||
responseTimeout: 3s
|
||||
# batchSize the number of blocks to request via state transfer from another peer
|
||||
batchSize: 10
|
||||
# blockBufferSize reflects the size of the re-ordering buffer
|
||||
# which captures blocks and takes care to deliver them in order
|
||||
# down to the ledger layer. The actually buffer size is bounded between
|
||||
# 0 and 2*blockBufferSize, each channel maintains its own buffer
|
||||
blockBufferSize: 100
|
||||
# maxRetries maximum number of re-tries to ask
|
||||
# for single state transfer request
|
||||
maxRetries: 3
|
||||
|
||||
# TLS Settings
|
||||
tls:
|
||||
# Require server-side TLS
|
||||
enabled: false
|
||||
# Require client certificates / mutual TLS.
|
||||
# Note that clients that are not configured to use a certificate will
|
||||
# fail to connect to the peer.
|
||||
clientAuthRequired: false
|
||||
# X.509 certificate used for TLS server
|
||||
cert:
|
||||
file: tls/server.crt
|
||||
# Private key used for TLS server (and client if clientAuthEnabled
|
||||
# is set to true
|
||||
key:
|
||||
file: tls/server.key
|
||||
# Trusted root certificate chain for tls.cert
|
||||
rootcert:
|
||||
file: tls/ca.crt
|
||||
# Set of root certificate authorities used to verify client certificates
|
||||
clientRootCAs:
|
||||
files:
|
||||
- tls/ca.crt
|
||||
# Private key used for TLS when making client connections. If
|
||||
# not set, peer.tls.key.file will be used instead
|
||||
clientKey:
|
||||
file:
|
||||
# X.509 certificate used for TLS when making client connections.
|
||||
# If not set, peer.tls.cert.file will be used instead
|
||||
clientCert:
|
||||
file:
|
||||
|
||||
# Authentication contains configuration parameters related to authenticating
|
||||
# client messages
|
||||
authentication:
|
||||
# the acceptable difference between the current server time and the
|
||||
# client's time as specified in a client request message
|
||||
timewindow: 15m
|
||||
|
||||
# Path on the file system where peer will store data (eg ledger). This
|
||||
# location must be access control protected to prevent unintended
|
||||
# modification that might corrupt the peer operations.
|
||||
fileSystemPath: /var/hyperledger/production
|
||||
|
||||
# BCCSP (Blockchain crypto provider): Select which crypto implementation or
|
||||
# library to use
|
||||
BCCSP:
|
||||
Default: SW
|
||||
# Settings for the SW crypto provider (i.e. when DEFAULT: SW)
|
||||
SW:
|
||||
# TODO: The default Hash and Security level needs refactoring to be
|
||||
# fully configurable. Changing these defaults requires coordination
|
||||
# SHA2 is hardcoded in several places, not only BCCSP
|
||||
Hash: SHA2
|
||||
Security: 256
|
||||
# Location of Key Store
|
||||
FileKeyStore:
|
||||
# If "", defaults to 'mspConfigPath'/keystore
|
||||
KeyStore:
|
||||
# Settings for the PKCS#11 crypto provider (i.e. when DEFAULT: PKCS11)
|
||||
PKCS11:
|
||||
# Location of the PKCS11 module library
|
||||
Library:
|
||||
# Token Label
|
||||
Label:
|
||||
# User PIN
|
||||
Pin:
|
||||
Hash:
|
||||
Security:
|
||||
|
||||
# Path on the file system where peer will find MSP local configurations
|
||||
mspConfigPath: msp
|
||||
|
||||
# Identifier of the local MSP
|
||||
# ----!!!!IMPORTANT!!!-!!!IMPORTANT!!!-!!!IMPORTANT!!!!----
|
||||
# Deployers need to change the value of the localMspId string.
|
||||
# In particular, the name of the local MSP ID of a peer needs
|
||||
# to match the name of one of the MSPs in each of the channel
|
||||
# that this peer is a member of. Otherwise this peer's messages
|
||||
# will not be identified as valid by other nodes.
|
||||
localMspId: SampleOrg
|
||||
|
||||
# CLI common client config options
|
||||
client:
|
||||
# connection timeout
|
||||
connTimeout: 3s
|
||||
|
||||
# Delivery service related config
|
||||
deliveryclient:
|
||||
# It sets the total time the delivery service may spend in reconnection
|
||||
# attempts until its retry logic gives up and returns an error
|
||||
reconnectTotalTimeThreshold: 3600s
|
||||
|
||||
# It sets the delivery service <-> ordering service node connection timeout
|
||||
connTimeout: 3s
|
||||
|
||||
# It sets the delivery service maximal delay between consecutive retries
|
||||
reConnectBackoffThreshold: 3600s
|
||||
|
||||
# A list of orderer endpoint addresses which should be overridden
|
||||
# when found in channel configurations.
|
||||
addressOverrides:
|
||||
# - from:
|
||||
# to:
|
||||
# caCertsFile:
|
||||
# - from:
|
||||
# to:
|
||||
# caCertsFile:
|
||||
|
||||
# Type for the local MSP - by default it's of type bccsp
|
||||
localMspType: bccsp
|
||||
|
||||
# Used with Go profiling tools only in none production environment. In
|
||||
# production, it should be disabled (eg enabled: false)
|
||||
profile:
|
||||
enabled: false
|
||||
listenAddress: 0.0.0.0:6060
|
||||
|
||||
# Handlers defines custom handlers that can filter and mutate
|
||||
# objects passing within the peer, such as:
|
||||
# Auth filter - reject or forward proposals from clients
|
||||
# Decorators - append or mutate the chaincode input passed to the chaincode
|
||||
# Endorsers - Custom signing over proposal response payload and its mutation
|
||||
# Valid handler definition contains:
|
||||
# - A name which is a factory method name defined in
|
||||
# core/handlers/library/library.go for statically compiled handlers
|
||||
# - library path to shared object binary for pluggable filters
|
||||
# Auth filters and decorators are chained and executed in the order that
|
||||
# they are defined. For example:
|
||||
# authFilters:
|
||||
# -
|
||||
# name: FilterOne
|
||||
# library: /opt/lib/filter.so
|
||||
# -
|
||||
# name: FilterTwo
|
||||
# decorators:
|
||||
# -
|
||||
# name: DecoratorOne
|
||||
# -
|
||||
# name: DecoratorTwo
|
||||
# library: /opt/lib/decorator.so
|
||||
# Endorsers are configured as a map that its keys are the endorsement system chaincodes that are being overridden.
|
||||
# Below is an example that overrides the default ESCC and uses an endorsement plugin that has the same functionality
|
||||
# as the default ESCC.
|
||||
# If the 'library' property is missing, the name is used as the constructor method in the builtin library similar
|
||||
# to auth filters and decorators.
|
||||
# endorsers:
|
||||
# escc:
|
||||
# name: DefaultESCC
|
||||
# library: /etc/hyperledger/fabric/plugin/escc.so
|
||||
handlers:
|
||||
authFilters:
|
||||
-
|
||||
name: DefaultAuth
|
||||
-
|
||||
name: ExpirationCheck # This filter checks identity x509 certificate expiration
|
||||
decorators:
|
||||
-
|
||||
name: DefaultDecorator
|
||||
endorsers:
|
||||
escc:
|
||||
name: DefaultEndorsement
|
||||
library:
|
||||
validators:
|
||||
vscc:
|
||||
name: DefaultValidation
|
||||
library:
|
||||
|
||||
# library: /etc/hyperledger/fabric/plugin/escc.so
|
||||
# Number of goroutines that will execute transaction validation in parallel.
|
||||
# By default, the peer chooses the number of CPUs on the machine. Set this
|
||||
# variable to override that choice.
|
||||
# NOTE: overriding this value might negatively influence the performance of
|
||||
# the peer so please change this value only if you know what you're doing
|
||||
validatorPoolSize:
|
||||
|
||||
# The discovery service is used by clients to query information about peers,
|
||||
# such as - which peers have joined a certain channel, what is the latest
|
||||
# channel config, and most importantly - given a chaincode and a channel,
|
||||
# what possible sets of peers satisfy the endorsement policy.
|
||||
discovery:
|
||||
enabled: true
|
||||
# Whether the authentication cache is enabled or not.
|
||||
authCacheEnabled: true
|
||||
# The maximum size of the cache, after which a purge takes place
|
||||
authCacheMaxSize: 1000
|
||||
# The proportion (0 to 1) of entries that remain in the cache after the cache is purged due to overpopulation
|
||||
authCachePurgeRetentionRatio: 0.75
|
||||
# Whether to allow non-admins to perform non channel scoped queries.
|
||||
# When this is false, it means that only peer admins can perform non channel scoped queries.
|
||||
orgMembersAllowedAccess: false
|
||||
|
||||
# Limits is used to configure some internal resource limits.
|
||||
limits:
|
||||
# Concurrency limits the number of concurrently running requests to a service on each peer.
|
||||
# Currently this option is only applied to endorser service and deliver service.
|
||||
# When the property is missing or the value is 0, the concurrency limit is disabled for the service.
|
||||
concurrency:
|
||||
# endorserService limits concurrent requests to endorser service that handles chaincode deployment, query and invocation,
|
||||
# including both user chaincodes and system chaincodes.
|
||||
endorserService: 2500
|
||||
# deliverService limits concurrent event listeners registered to deliver service for blocks and transaction events.
|
||||
deliverService: 2500
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# VM section
|
||||
#
|
||||
###############################################################################
|
||||
vm:
|
||||
|
||||
# Endpoint of the vm management system. For docker can be one of the following in general
|
||||
# unix:///var/run/docker.sock
|
||||
# http://localhost:2375
|
||||
# https://localhost:2376
|
||||
endpoint: unix:///var/run/docker.sock
|
||||
|
||||
# settings for docker vms
|
||||
docker:
|
||||
tls:
|
||||
enabled: false
|
||||
ca:
|
||||
file: docker/ca.crt
|
||||
cert:
|
||||
file: docker/tls.crt
|
||||
key:
|
||||
file: docker/tls.key
|
||||
|
||||
# Enables/disables the standard out/err from chaincode containers for
|
||||
# debugging purposes
|
||||
attachStdout: false
|
||||
|
||||
# Parameters on creating docker container.
|
||||
# Container may be efficiently created using ipam & dns-server for cluster
|
||||
# NetworkMode - sets the networking mode for the container. Supported
|
||||
# standard values are: `host`(default),`bridge`,`ipvlan`,`none`.
|
||||
# Dns - a list of DNS servers for the container to use.
|
||||
# Note: `Privileged` `Binds` `Links` and `PortBindings` properties of
|
||||
# Docker Host Config are not supported and will not be used if set.
|
||||
# LogConfig - sets the logging driver (Type) and related options
|
||||
# (Config) for Docker. For more info,
|
||||
# https://docs.docker.com/engine/admin/logging/overview/
|
||||
# Note: Set LogConfig using Environment Variables is not supported.
|
||||
hostConfig:
|
||||
NetworkMode: host
|
||||
Dns:
|
||||
# - 192.168.0.1
|
||||
LogConfig:
|
||||
Type: json-file
|
||||
Config:
|
||||
max-size: "50m"
|
||||
max-file: "5"
|
||||
Memory: 2147483648
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Chaincode section
|
||||
#
|
||||
###############################################################################
|
||||
chaincode:
|
||||
|
||||
# The id is used by the Chaincode stub to register the executing Chaincode
|
||||
# ID with the Peer and is generally supplied through ENV variables
|
||||
# the `path` form of ID is provided when installing the chaincode.
|
||||
# The `name` is used for all other requests and can be any string.
|
||||
id:
|
||||
path:
|
||||
name:
|
||||
|
||||
# Generic builder environment, suitable for most chaincode types
|
||||
builder: $(DOCKER_NS)/fabric-ccenv:$(TWO_DIGIT_VERSION)
|
||||
|
||||
# Enables/disables force pulling of the base docker images (listed below)
|
||||
# during user chaincode instantiation.
|
||||
# Useful when using moving image tags (such as :latest)
|
||||
pull: false
|
||||
|
||||
golang:
|
||||
# golang will never need more than baseos
|
||||
runtime: $(DOCKER_NS)/fabric-baseos:$(TWO_DIGIT_VERSION)
|
||||
|
||||
# whether or not golang chaincode should be linked dynamically
|
||||
dynamicLink: false
|
||||
|
||||
java:
|
||||
# This is an image based on java:openjdk-8 with addition compiler
|
||||
# tools added for java shim layer packaging.
|
||||
# This image is packed with shim layer libraries that are necessary
|
||||
# for Java chaincode runtime.
|
||||
runtime: $(DOCKER_NS)/fabric-javaenv:$(TWO_DIGIT_VERSION)
|
||||
|
||||
node:
|
||||
# This is an image based on node:$(NODE_VER)-alpine
|
||||
runtime: $(DOCKER_NS)/fabric-nodeenv:$(TWO_DIGIT_VERSION)
|
||||
|
||||
# List of directories to treat as external builders and launchers for
|
||||
# chaincode. The external builder detection processing will iterate over the
|
||||
# builders in the order specified below.
|
||||
externalBuilders: []
|
||||
# - path: /path/to/directory
|
||||
# name: descriptive-builder-name
|
||||
# environmentWhitelist:
|
||||
# - ENVVAR_NAME_TO_PROPAGATE_FROM_PEER
|
||||
# - GOPROXY
|
||||
|
||||
# The maximum duration to wait for the chaincode build and install process
|
||||
# to complete.
|
||||
installTimeout: 300s
|
||||
|
||||
# Timeout duration for starting up a container and waiting for Register
|
||||
# to come through.
|
||||
startuptimeout: 300s
|
||||
|
||||
# Timeout duration for Invoke and Init calls to prevent runaway.
|
||||
# This timeout is used by all chaincodes in all the channels, including
|
||||
# system chaincodes.
|
||||
# Note that during Invoke, if the image is not available (e.g. being
|
||||
# cleaned up when in development environment), the peer will automatically
|
||||
# build the image, which might take more time. In production environment,
|
||||
# the chaincode image is unlikely to be deleted, so the timeout could be
|
||||
# reduced accordingly.
|
||||
executetimeout: 30s
|
||||
|
||||
# There are 2 modes: "dev" and "net".
|
||||
# In dev mode, user runs the chaincode after starting peer from
|
||||
# command line on local machine.
|
||||
# In net mode, peer will run chaincode in a docker container.
|
||||
mode: net
|
||||
|
||||
# keepalive in seconds. In situations where the communication goes through a
|
||||
# proxy that does not support keep-alive, this parameter will maintain connection
|
||||
# between peer and chaincode.
|
||||
# A value <= 0 turns keepalive off
|
||||
keepalive: 0
|
||||
|
||||
# system chaincodes whitelist. To add system chaincode "myscc" to the
|
||||
# whitelist, add "myscc: enable" to the list below, and register in
|
||||
# chaincode/importsysccs.go
|
||||
system:
|
||||
_lifecycle: enable
|
||||
cscc: enable
|
||||
lscc: enable
|
||||
escc: enable
|
||||
vscc: enable
|
||||
qscc: enable
|
||||
|
||||
# Logging section for the chaincode container
|
||||
logging:
|
||||
# Default level for all loggers within the chaincode container
|
||||
level: info
|
||||
# Override default level for the 'shim' logger
|
||||
shim: warning
|
||||
# Format for the chaincode container logs
|
||||
format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Ledger section - ledger configuration encompasses both the blockchain
|
||||
# and the state
|
||||
#
|
||||
###############################################################################
|
||||
ledger:
|
||||
|
||||
blockchain:
|
||||
|
||||
state:
|
||||
# stateDatabase - options are "goleveldb", "CouchDB"
|
||||
# goleveldb - default state database stored in goleveldb.
|
||||
# CouchDB - store state database in CouchDB
|
||||
stateDatabase: goleveldb
|
||||
# Limit on the number of records to return per query
|
||||
totalQueryLimit: 100000
|
||||
couchDBConfig:
|
||||
# It is recommended to run CouchDB on the same server as the peer, and
|
||||
# not map the CouchDB container port to a server port in docker-compose.
|
||||
# Otherwise proper security must be provided on the connection between
|
||||
# CouchDB client (on the peer) and server.
|
||||
couchDBAddress: 127.0.0.1:5984
|
||||
# This username must have read and write authority on CouchDB
|
||||
username:
|
||||
# The password is recommended to pass as an environment variable
|
||||
# during start up (eg CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD).
|
||||
# If it is stored here, the file must be access control protected
|
||||
# to prevent unintended users from discovering the password.
|
||||
password:
|
||||
# Number of retries for CouchDB errors
|
||||
maxRetries: 3
|
||||
# Number of retries for CouchDB errors during peer startup
|
||||
maxRetriesOnStartup: 12
|
||||
# CouchDB request timeout (unit: duration, e.g. 20s)
|
||||
requestTimeout: 35s
|
||||
# Limit on the number of records per each CouchDB query
|
||||
# Note that chaincode queries are only bound by totalQueryLimit.
|
||||
# Internally the chaincode may execute multiple CouchDB queries,
|
||||
# each of size internalQueryLimit.
|
||||
internalQueryLimit: 1000
|
||||
# Limit on the number of records per CouchDB bulk update batch
|
||||
maxBatchUpdateSize: 1000
|
||||
# Warm indexes after every N blocks.
|
||||
# This option warms any indexes that have been
|
||||
# deployed to CouchDB after every N blocks.
|
||||
# A value of 1 will warm indexes after every block commit,
|
||||
# to ensure fast selector queries.
|
||||
# Increasing the value may improve write efficiency of peer and CouchDB,
|
||||
# but may degrade query response time.
|
||||
warmIndexesAfterNBlocks: 1
|
||||
# Create the _global_changes system database
|
||||
# This is optional. Creating the global changes database will require
|
||||
# additional system resources to track changes and maintain the database
|
||||
createGlobalChangesDB: false
|
||||
# CacheSize denotes the maximum mega bytes (MB) to be allocated for the in-memory state
|
||||
# cache. Note that CacheSize needs to be a multiple of 32 MB. If it is not a multiple
|
||||
# of 32 MB, the peer would round the size to the next multiple of 32 MB.
|
||||
# To disable the cache, 0 MB needs to be assigned to the cacheSize.
|
||||
cacheSize: 64
|
||||
|
||||
history:
|
||||
# enableHistoryDatabase - options are true or false
|
||||
# Indicates if the history of key updates should be stored.
|
||||
# All history 'index' will be stored in goleveldb, regardless if using
|
||||
# CouchDB or alternate database for the state.
|
||||
enableHistoryDatabase: true
|
||||
|
||||
pvtdataStore:
|
||||
# the maximum db batch size for converting
|
||||
# the ineligible missing data entries to eligible missing data entries
|
||||
collElgProcMaxDbBatchSize: 5000
|
||||
# the minimum duration (in milliseconds) between writing
|
||||
# two consecutive db batches for converting the ineligible missing data entries to eligible missing data entries
|
||||
collElgProcDbBatchesInterval: 1000
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Operations section
|
||||
#
|
||||
###############################################################################
|
||||
operations:
|
||||
# host and port for the operations server
|
||||
listenAddress: 127.0.0.1:9443
|
||||
|
||||
# TLS configuration for the operations endpoint
|
||||
tls:
|
||||
# TLS enabled
|
||||
enabled: false
|
||||
|
||||
# path to PEM encoded server certificate for the operations server
|
||||
cert:
|
||||
file:
|
||||
|
||||
# path to PEM encoded server key for the operations server
|
||||
key:
|
||||
file:
|
||||
|
||||
# most operations service endpoints require client authentication when TLS
|
||||
# is enabled. clientAuthRequired requires client certificate authentication
|
||||
# at the TLS layer to access all resources.
|
||||
clientAuthRequired: false
|
||||
|
||||
# paths to PEM encoded ca certificates to trust for client authentication
|
||||
clientRootCAs:
|
||||
files: []
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# Metrics section
|
||||
#
|
||||
###############################################################################
|
||||
metrics:
|
||||
# metrics provider is one of statsd, prometheus, or disabled
|
||||
provider: disabled
|
||||
|
||||
# statsd configuration
|
||||
statsd:
|
||||
# network type: tcp or udp
|
||||
network: udp
|
||||
|
||||
# statsd server address
|
||||
address: 127.0.0.1:8125
|
||||
|
||||
# the interval at which locally cached counters and gauges are pushed
|
||||
# to statsd; timings are pushed immediately
|
||||
writeInterval: 10s
|
||||
|
||||
# prefix is prepended to all emitted statsd metrics
|
||||
prefix:
|
||||
361
hyperledger-fabric/config/orderer.yaml
Normal file
361
hyperledger-fabric/config/orderer.yaml
Normal file
|
|
@ -0,0 +1,361 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
---
|
||||
################################################################################
|
||||
#
|
||||
# Orderer Configuration
|
||||
#
|
||||
# - This controls the type and configuration of the orderer.
|
||||
#
|
||||
################################################################################
|
||||
General:
|
||||
# Listen address: The IP on which to bind to listen.
|
||||
ListenAddress: 127.0.0.1
|
||||
|
||||
# Listen port: The port on which to bind to listen.
|
||||
ListenPort: 7050
|
||||
|
||||
# TLS: TLS settings for the GRPC server.
|
||||
TLS:
|
||||
Enabled: false
|
||||
# PrivateKey governs the file location of the private key of the TLS certificate.
|
||||
PrivateKey: tls/server.key
|
||||
# Certificate governs the file location of the server TLS certificate.
|
||||
Certificate: tls/server.crt
|
||||
RootCAs:
|
||||
- tls/ca.crt
|
||||
ClientAuthRequired: false
|
||||
ClientRootCAs:
|
||||
# Keepalive settings for the GRPC server.
|
||||
Keepalive:
|
||||
# ServerMinInterval is the minimum permitted time between client pings.
|
||||
# If clients send pings more frequently, the server will
|
||||
# disconnect them.
|
||||
ServerMinInterval: 60s
|
||||
# ServerInterval is the time between pings to clients.
|
||||
ServerInterval: 7200s
|
||||
# ServerTimeout is the duration the server waits for a response from
|
||||
# a client before closing the connection.
|
||||
ServerTimeout: 20s
|
||||
# Cluster settings for ordering service nodes that communicate with other ordering service nodes
|
||||
# such as Raft based ordering service.
|
||||
Cluster:
|
||||
# SendBufferSize is the maximum number of messages in the egress buffer.
|
||||
# Consensus messages are dropped if the buffer is full, and transaction
|
||||
# messages are waiting for space to be freed.
|
||||
SendBufferSize: 10
|
||||
# ClientCertificate governs the file location of the client TLS certificate
|
||||
# used to establish mutual TLS connections with other ordering service nodes.
|
||||
ClientCertificate:
|
||||
# ClientPrivateKey governs the file location of the private key of the client TLS certificate.
|
||||
ClientPrivateKey:
|
||||
# The below 4 properties should be either set together, or be unset together.
|
||||
# If they are set, then the orderer node uses a separate listener for intra-cluster
|
||||
# communication. If they are unset, then the general orderer listener is used.
|
||||
# This is useful if you want to use a different TLS server certificates on the
|
||||
# client-facing and the intra-cluster listeners.
|
||||
|
||||
# ListenPort defines the port on which the cluster listens to connections.
|
||||
ListenPort:
|
||||
# ListenAddress defines the IP on which to listen to intra-cluster communication.
|
||||
ListenAddress:
|
||||
# ServerCertificate defines the file location of the server TLS certificate used for intra-cluster
|
||||
# communication.
|
||||
ServerCertificate:
|
||||
# ServerPrivateKey defines the file location of the private key of the TLS certificate.
|
||||
ServerPrivateKey:
|
||||
|
||||
# Bootstrap method: The method by which to obtain the bootstrap block
|
||||
# system channel is specified. The option can be one of:
|
||||
# "file" - path to a file containing the genesis block or config block of system channel
|
||||
# "none" - allows an orderer to start without a system channel configuration
|
||||
BootstrapMethod: file
|
||||
|
||||
# Bootstrap file: The file containing the bootstrap block to use when
|
||||
# initializing the orderer system channel and BootstrapMethod is set to
|
||||
# "file". The bootstrap file can be the genesis block, and it can also be
|
||||
# a config block for late bootstrap of some consensus methods like Raft.
|
||||
# Generate a genesis block by updating $FABRIC_CFG_PATH/configtx.yaml and
|
||||
# using configtxgen command with "-outputBlock" option.
|
||||
# Defaults to file "genesisblock" (in $FABRIC_CFG_PATH directory) if not specified.
|
||||
BootstrapFile:
|
||||
|
||||
# LocalMSPDir is where to find the private crypto material needed by the
|
||||
# orderer. It is set relative here as a default for dev environments but
|
||||
# should be changed to the real location in production.
|
||||
LocalMSPDir: msp
|
||||
|
||||
# LocalMSPID is the identity to register the local MSP material with the MSP
|
||||
# manager. IMPORTANT: The local MSP ID of an orderer needs to match the MSP
|
||||
# ID of one of the organizations defined in the orderer system channel's
|
||||
# /Channel/Orderer configuration. The sample organization defined in the
|
||||
# sample configuration provided has an MSP ID of "SampleOrg".
|
||||
LocalMSPID: SampleOrg
|
||||
|
||||
# Enable an HTTP service for Go "pprof" profiling as documented at:
|
||||
# https://golang.org/pkg/net/http/pprof
|
||||
Profile:
|
||||
Enabled: false
|
||||
Address: 0.0.0.0:6060
|
||||
|
||||
# BCCSP configures the blockchain crypto service providers.
|
||||
BCCSP:
|
||||
# Default specifies the preferred blockchain crypto service provider
|
||||
# to use. If the preferred provider is not available, the software
|
||||
# based provider ("SW") will be used.
|
||||
# Valid providers are:
|
||||
# - SW: a software based crypto provider
|
||||
# - PKCS11: a CA hardware security module crypto provider.
|
||||
Default: SW
|
||||
|
||||
# SW configures the software based blockchain crypto provider.
|
||||
SW:
|
||||
# TODO: The default Hash and Security level needs refactoring to be
|
||||
# fully configurable. Changing these defaults requires coordination
|
||||
# SHA2 is hardcoded in several places, not only BCCSP
|
||||
Hash: SHA2
|
||||
Security: 256
|
||||
# Location of key store. If this is unset, a location will be
|
||||
# chosen using: 'LocalMSPDir'/keystore
|
||||
FileKeyStore:
|
||||
KeyStore:
|
||||
|
||||
# Settings for the PKCS#11 crypto provider (i.e. when DEFAULT: PKCS11)
|
||||
PKCS11:
|
||||
# Location of the PKCS11 module library
|
||||
Library:
|
||||
# Token Label
|
||||
Label:
|
||||
# User PIN
|
||||
Pin:
|
||||
Hash:
|
||||
Security:
|
||||
FileKeyStore:
|
||||
KeyStore:
|
||||
|
||||
# Authentication contains configuration parameters related to authenticating
|
||||
# client messages
|
||||
Authentication:
|
||||
# the acceptable difference between the current server time and the
|
||||
# client's time as specified in a client request message
|
||||
TimeWindow: 15m
|
||||
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# SECTION: File Ledger
|
||||
#
|
||||
# - This section applies to the configuration of the file or json ledgers.
|
||||
#
|
||||
################################################################################
|
||||
FileLedger:
|
||||
|
||||
# Location: The directory to store the blocks in.
|
||||
# NOTE: If this is unset, a new temporary location will be chosen every time
|
||||
# the orderer is restarted, using the prefix specified by Prefix.
|
||||
Location: /var/hyperledger/production/orderer
|
||||
|
||||
# The prefix to use when generating a ledger directory in temporary space.
|
||||
# Otherwise, this value is ignored.
|
||||
Prefix: hyperledger-fabric-ordererledger
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# SECTION: Kafka
|
||||
#
|
||||
# - This section applies to the configuration of the Kafka-based orderer, and
|
||||
# its interaction with the Kafka cluster.
|
||||
#
|
||||
################################################################################
|
||||
Kafka:
|
||||
|
||||
# Retry: What do if a connection to the Kafka cluster cannot be established,
|
||||
# or if a metadata request to the Kafka cluster needs to be repeated.
|
||||
Retry:
|
||||
# When a new channel is created, or when an existing channel is reloaded
|
||||
# (in case of a just-restarted orderer), the orderer interacts with the
|
||||
# Kafka cluster in the following ways:
|
||||
# 1. It creates a Kafka producer (writer) for the Kafka partition that
|
||||
# corresponds to the channel.
|
||||
# 2. It uses that producer to post a no-op CONNECT message to that
|
||||
# partition
|
||||
# 3. It creates a Kafka consumer (reader) for that partition.
|
||||
# If any of these steps fail, they will be re-attempted every
|
||||
# <ShortInterval> for a total of <ShortTotal>, and then every
|
||||
# <LongInterval> for a total of <LongTotal> until they succeed.
|
||||
# Note that the orderer will be unable to write to or read from a
|
||||
# channel until all of the steps above have been completed successfully.
|
||||
ShortInterval: 5s
|
||||
ShortTotal: 10m
|
||||
LongInterval: 5m
|
||||
LongTotal: 12h
|
||||
# Affects the socket timeouts when waiting for an initial connection, a
|
||||
# response, or a transmission. See Config.Net for more info:
|
||||
# https://godoc.org/github.com/Shopify/sarama#Config
|
||||
NetworkTimeouts:
|
||||
DialTimeout: 10s
|
||||
ReadTimeout: 10s
|
||||
WriteTimeout: 10s
|
||||
# Affects the metadata requests when the Kafka cluster is in the middle
|
||||
# of a leader election.See Config.Metadata for more info:
|
||||
# https://godoc.org/github.com/Shopify/sarama#Config
|
||||
Metadata:
|
||||
RetryBackoff: 250ms
|
||||
RetryMax: 3
|
||||
# What to do if posting a message to the Kafka cluster fails. See
|
||||
# Config.Producer for more info:
|
||||
# https://godoc.org/github.com/Shopify/sarama#Config
|
||||
Producer:
|
||||
RetryBackoff: 100ms
|
||||
RetryMax: 3
|
||||
# What to do if reading from the Kafka cluster fails. See
|
||||
# Config.Consumer for more info:
|
||||
# https://godoc.org/github.com/Shopify/sarama#Config
|
||||
Consumer:
|
||||
RetryBackoff: 2s
|
||||
# Settings to use when creating Kafka topics. Only applies when
|
||||
# Kafka.Version is v0.10.1.0 or higher
|
||||
Topic:
|
||||
# The number of Kafka brokers across which to replicate the topic
|
||||
ReplicationFactor: 3
|
||||
# Verbose: Enable logging for interactions with the Kafka cluster.
|
||||
Verbose: false
|
||||
|
||||
# TLS: TLS settings for the orderer's connection to the Kafka cluster.
|
||||
TLS:
|
||||
|
||||
# Enabled: Use TLS when connecting to the Kafka cluster.
|
||||
Enabled: false
|
||||
|
||||
# PrivateKey: PEM-encoded private key the orderer will use for
|
||||
# authentication.
|
||||
PrivateKey:
|
||||
# As an alternative to specifying the PrivateKey here, uncomment the
|
||||
# following "File" key and specify the file name from which to load the
|
||||
# value of PrivateKey.
|
||||
#File: path/to/PrivateKey
|
||||
|
||||
# Certificate: PEM-encoded signed public key certificate the orderer will
|
||||
# use for authentication.
|
||||
Certificate:
|
||||
# As an alternative to specifying the Certificate here, uncomment the
|
||||
# following "File" key and specify the file name from which to load the
|
||||
# value of Certificate.
|
||||
#File: path/to/Certificate
|
||||
|
||||
# RootCAs: PEM-encoded trusted root certificates used to validate
|
||||
# certificates from the Kafka cluster.
|
||||
RootCAs:
|
||||
# As an alternative to specifying the RootCAs here, uncomment the
|
||||
# following "File" key and specify the file name from which to load the
|
||||
# value of RootCAs.
|
||||
#File: path/to/RootCAs
|
||||
|
||||
# SASLPlain: Settings for using SASL/PLAIN authentication with Kafka brokers
|
||||
SASLPlain:
|
||||
# Enabled: Use SASL/PLAIN to authenticate with Kafka brokers
|
||||
Enabled: false
|
||||
# User: Required when Enabled is set to true
|
||||
User:
|
||||
# Password: Required when Enabled is set to true
|
||||
Password:
|
||||
|
||||
# Kafka protocol version used to communicate with the Kafka cluster brokers
|
||||
# (defaults to 0.10.2.0 if not specified)
|
||||
Version:
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Debug Configuration
|
||||
#
|
||||
# - This controls the debugging options for the orderer
|
||||
#
|
||||
################################################################################
|
||||
Debug:
|
||||
|
||||
# BroadcastTraceDir when set will cause each request to the Broadcast service
|
||||
# for this orderer to be written to a file in this directory
|
||||
BroadcastTraceDir:
|
||||
|
||||
# DeliverTraceDir when set will cause each request to the Deliver service
|
||||
# for this orderer to be written to a file in this directory
|
||||
DeliverTraceDir:
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Operations Configuration
|
||||
#
|
||||
# - This configures the operations server endpoint for the orderer
|
||||
#
|
||||
################################################################################
|
||||
Operations:
|
||||
# host and port for the operations server
|
||||
ListenAddress: 127.0.0.1:8443
|
||||
|
||||
# TLS configuration for the operations endpoint
|
||||
TLS:
|
||||
# TLS enabled
|
||||
Enabled: false
|
||||
|
||||
# Certificate is the location of the PEM encoded TLS certificate
|
||||
Certificate:
|
||||
|
||||
# PrivateKey points to the location of the PEM-encoded key
|
||||
PrivateKey:
|
||||
|
||||
# Most operations service endpoints require client authentication when TLS
|
||||
# is enabled. ClientAuthRequired requires client certificate authentication
|
||||
# at the TLS layer to access all resources.
|
||||
ClientAuthRequired: false
|
||||
|
||||
# Paths to PEM encoded ca certificates to trust for client authentication
|
||||
ClientRootCAs: []
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Metrics Configuration
|
||||
#
|
||||
# - This configures metrics collection for the orderer
|
||||
#
|
||||
################################################################################
|
||||
Metrics:
|
||||
# The metrics provider is one of statsd, prometheus, or disabled
|
||||
Provider: disabled
|
||||
|
||||
# The statsd configuration
|
||||
Statsd:
|
||||
# network type: tcp or udp
|
||||
Network: udp
|
||||
|
||||
# the statsd server address
|
||||
Address: 127.0.0.1:8125
|
||||
|
||||
# The interval at which locally cached counters and gauges are pushed
|
||||
# to statsd; timings are pushed immediately
|
||||
WriteInterval: 30s
|
||||
|
||||
# The prefix is prepended to all emitted statsd metrics
|
||||
Prefix:
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Consensus Configuration
|
||||
#
|
||||
# - This section contains config options for a consensus plugin. It is opaque
|
||||
# to orderer, and completely up to consensus implementation to make use of.
|
||||
#
|
||||
################################################################################
|
||||
Consensus:
|
||||
# The allowed key-value pairs here depend on consensus plugin. For etcd/raft,
|
||||
# we use following options:
|
||||
|
||||
# WALDir specifies the location at which Write Ahead Logs for etcd/raft are
|
||||
# stored. Each channel will have its own subdir named after channel ID.
|
||||
WALDir: /var/hyperledger/production/orderer/etcdraft/wal
|
||||
|
||||
# SnapDir specifies the location at which snapshots for etcd/raft are
|
||||
# stored. Each channel will have its own subdir named after channel ID.
|
||||
SnapDir: /var/hyperledger/production/orderer/etcdraft/snapshot
|
||||
2
hyperledger-fabric/first-network/.env
Normal file
2
hyperledger-fabric/first-network/.env
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
COMPOSE_PROJECT_NAME=net
|
||||
IMAGE_TAG=latest
|
||||
3
hyperledger-fabric/first-network/.env.sh
Normal file
3
hyperledger-fabric/first-network/.env.sh
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#!/bin/sh
|
||||
|
||||
export PATH=./bin:$PATH
|
||||
8
hyperledger-fabric/first-network/.gitignore
vendored
Normal file
8
hyperledger-fabric/first-network/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
/channel-artifacts/*.tx
|
||||
/channel-artifacts/*.block
|
||||
/crypto-config/*
|
||||
/ledgers
|
||||
/ledgers-backup
|
||||
/channel-artifacts/*.json
|
||||
/org3-artifacts/crypto-config/*
|
||||
/connection-*.*
|
||||
7
hyperledger-fabric/first-network/README.md
Normal file
7
hyperledger-fabric/first-network/README.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
## Build Your First Network (BYFN)
|
||||
|
||||
The directions for using this are documented in the Hyperledger Fabric
|
||||
["Build Your First Network"](http://hyperledger-fabric.readthedocs.io/en/latest/build_network.html) tutorial.
|
||||
|
||||
*NOTE:* After navigating to the documentation, choose the documentation version that matches your version of Fabric
|
||||
|
||||
110
hyperledger-fabric/first-network/base/docker-compose-base.yaml
Normal file
110
hyperledger-fabric/first-network/base/docker-compose-base.yaml
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
services:
|
||||
|
||||
orderer.example.com:
|
||||
container_name: orderer.example.com
|
||||
extends:
|
||||
file: peer-base.yaml
|
||||
service: orderer-base
|
||||
volumes:
|
||||
- ../channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
|
||||
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
|
||||
- ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/:/var/hyperledger/orderer/tls
|
||||
- orderer.example.com:/var/hyperledger/production/orderer
|
||||
ports:
|
||||
- 7050:7050
|
||||
|
||||
peer0.org1.example.com:
|
||||
container_name: peer0.org1.example.com
|
||||
extends:
|
||||
file: peer-base.yaml
|
||||
service: peer-base
|
||||
environment:
|
||||
- CORE_PEER_ID=peer0.org1.example.com
|
||||
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
|
||||
- CORE_PEER_LISTENADDRESS=0.0.0.0:7051
|
||||
- CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052
|
||||
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
|
||||
- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:8051
|
||||
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
|
||||
- CORE_PEER_LOCALMSPID=Org1MSP
|
||||
volumes:
|
||||
- /var/run/:/host/var/run/
|
||||
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp
|
||||
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
|
||||
- peer0.org1.example.com:/var/hyperledger/production
|
||||
ports:
|
||||
- 7051:7051
|
||||
|
||||
peer1.org1.example.com:
|
||||
container_name: peer1.org1.example.com
|
||||
extends:
|
||||
file: peer-base.yaml
|
||||
service: peer-base
|
||||
environment:
|
||||
- CORE_PEER_ID=peer1.org1.example.com
|
||||
- CORE_PEER_ADDRESS=peer1.org1.example.com:8051
|
||||
- CORE_PEER_LISTENADDRESS=0.0.0.0:8051
|
||||
- CORE_PEER_CHAINCODEADDRESS=peer1.org1.example.com:8052
|
||||
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:8052
|
||||
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:8051
|
||||
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
|
||||
- CORE_PEER_LOCALMSPID=Org1MSP
|
||||
volumes:
|
||||
- /var/run/:/host/var/run/
|
||||
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/fabric/msp
|
||||
- ../crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/fabric/tls
|
||||
- peer1.org1.example.com:/var/hyperledger/production
|
||||
|
||||
ports:
|
||||
- 8051:8051
|
||||
|
||||
peer0.org2.example.com:
|
||||
container_name: peer0.org2.example.com
|
||||
extends:
|
||||
file: peer-base.yaml
|
||||
service: peer-base
|
||||
environment:
|
||||
- CORE_PEER_ID=peer0.org2.example.com
|
||||
- CORE_PEER_ADDRESS=peer0.org2.example.com:9051
|
||||
- CORE_PEER_LISTENADDRESS=0.0.0.0:9051
|
||||
- CORE_PEER_CHAINCODEADDRESS=peer0.org2.example.com:9052
|
||||
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:9052
|
||||
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:9051
|
||||
- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org2.example.com:10051
|
||||
- CORE_PEER_LOCALMSPID=Org2MSP
|
||||
volumes:
|
||||
- /var/run/:/host/var/run/
|
||||
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/fabric/msp
|
||||
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/fabric/tls
|
||||
- peer0.org2.example.com:/var/hyperledger/production
|
||||
ports:
|
||||
- 9051:9051
|
||||
|
||||
peer1.org2.example.com:
|
||||
container_name: peer1.org2.example.com
|
||||
extends:
|
||||
file: peer-base.yaml
|
||||
service: peer-base
|
||||
environment:
|
||||
- CORE_PEER_ID=peer1.org2.example.com
|
||||
- CORE_PEER_ADDRESS=peer1.org2.example.com:10051
|
||||
- CORE_PEER_LISTENADDRESS=0.0.0.0:10051
|
||||
- CORE_PEER_CHAINCODEADDRESS=peer1.org2.example.com:10052
|
||||
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:10052
|
||||
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:10051
|
||||
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:9051
|
||||
- CORE_PEER_LOCALMSPID=Org2MSP
|
||||
volumes:
|
||||
- /var/run/:/host/var/run/
|
||||
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp:/etc/hyperledger/fabric/msp
|
||||
- ../crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls:/etc/hyperledger/fabric/tls
|
||||
- peer1.org2.example.com:/var/hyperledger/production
|
||||
ports:
|
||||
- 10051:10051
|
||||
50
hyperledger-fabric/first-network/base/peer-base.yaml
Normal file
50
hyperledger-fabric/first-network/base/peer-base.yaml
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
services:
|
||||
peer-base:
|
||||
image: hyperledger/fabric-peer:$IMAGE_TAG
|
||||
environment:
|
||||
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
|
||||
# the following setting starts chaincode containers on the same
|
||||
# bridge network as the peers
|
||||
# https://docs.docker.com/compose/networking/
|
||||
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${COMPOSE_PROJECT_NAME}_byfn
|
||||
- FABRIC_LOGGING_SPEC=INFO
|
||||
#- FABRIC_LOGGING_SPEC=DEBUG
|
||||
- CORE_PEER_TLS_ENABLED=true
|
||||
- CORE_PEER_GOSSIP_USELEADERELECTION=true
|
||||
- CORE_PEER_GOSSIP_ORGLEADER=false
|
||||
- CORE_PEER_PROFILE_ENABLED=true
|
||||
- CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
|
||||
- CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
|
||||
- CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
|
||||
# Allow more time for chaincode container to build on install.
|
||||
- CORE_CHAINCODE_EXECUTETIMEOUT=300s
|
||||
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
|
||||
command: peer node start
|
||||
|
||||
orderer-base:
|
||||
image: hyperledger/fabric-orderer:$IMAGE_TAG
|
||||
environment:
|
||||
- FABRIC_LOGGING_SPEC=INFO
|
||||
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
|
||||
- ORDERER_GENERAL_BOOTSTRAPMETHOD=file
|
||||
- ORDERER_GENERAL_BOOTSTRAPFILE=/var/hyperledger/orderer/orderer.genesis.block
|
||||
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP
|
||||
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
|
||||
# enabled TLS
|
||||
- ORDERER_GENERAL_TLS_ENABLED=true
|
||||
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
|
||||
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
|
||||
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
|
||||
- ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
|
||||
- ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
|
||||
- ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
|
||||
working_dir: /opt/gopath/src/github.com/hyperledger/fabric
|
||||
command: orderer
|
||||
|
||||
BIN
hyperledger-fabric/first-network/bin copy/configtxgen
Executable file
BIN
hyperledger-fabric/first-network/bin copy/configtxgen
Executable file
Binary file not shown.
BIN
hyperledger-fabric/first-network/bin copy/configtxlator
Executable file
BIN
hyperledger-fabric/first-network/bin copy/configtxlator
Executable file
Binary file not shown.
BIN
hyperledger-fabric/first-network/bin copy/cryptogen
Executable file
BIN
hyperledger-fabric/first-network/bin copy/cryptogen
Executable file
Binary file not shown.
BIN
hyperledger-fabric/first-network/bin copy/discover
Executable file
BIN
hyperledger-fabric/first-network/bin copy/discover
Executable file
Binary file not shown.
BIN
hyperledger-fabric/first-network/bin copy/fabric-ca-client
Executable file
BIN
hyperledger-fabric/first-network/bin copy/fabric-ca-client
Executable file
Binary file not shown.
BIN
hyperledger-fabric/first-network/bin copy/fabric-ca-server
Executable file
BIN
hyperledger-fabric/first-network/bin copy/fabric-ca-server
Executable file
Binary file not shown.
BIN
hyperledger-fabric/first-network/bin copy/idemixgen
Executable file
BIN
hyperledger-fabric/first-network/bin copy/idemixgen
Executable file
Binary file not shown.
BIN
hyperledger-fabric/first-network/bin copy/orderer
Executable file
BIN
hyperledger-fabric/first-network/bin copy/orderer
Executable file
Binary file not shown.
BIN
hyperledger-fabric/first-network/bin copy/peer
Executable file
BIN
hyperledger-fabric/first-network/bin copy/peer
Executable file
Binary file not shown.
BIN
hyperledger-fabric/first-network/bin/configtxgen
Executable file
BIN
hyperledger-fabric/first-network/bin/configtxgen
Executable file
Binary file not shown.
BIN
hyperledger-fabric/first-network/bin/configtxlator
Executable file
BIN
hyperledger-fabric/first-network/bin/configtxlator
Executable file
Binary file not shown.
BIN
hyperledger-fabric/first-network/bin/cryptogen
Executable file
BIN
hyperledger-fabric/first-network/bin/cryptogen
Executable file
Binary file not shown.
561
hyperledger-fabric/first-network/byfn.sh
Executable file
561
hyperledger-fabric/first-network/byfn.sh
Executable file
|
|
@ -0,0 +1,561 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Copyright IBM Corp All Rights Reserved
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# This script will orchestrate a sample end-to-end execution of the Hyperledger
|
||||
# Fabric network.
|
||||
#
|
||||
# The end-to-end verification provisions a sample Fabric network consisting of
|
||||
# two organizations, each maintaining two peers, and a Raft ordering service.
|
||||
#
|
||||
# This verification makes use of two fundamental tools, which are necessary to
|
||||
# create a functioning transactional network with digital signature validation
|
||||
# and access control:
|
||||
#
|
||||
# * cryptogen - generates the x509 certificates used to identify and
|
||||
# authenticate the various components in the network.
|
||||
# * configtxgen - generates the requisite configuration artifacts for orderer
|
||||
# bootstrap and channel creation.
|
||||
#
|
||||
# Each tool consumes a configuration yaml file, within which we specify the topology
|
||||
# of our network (cryptogen) and the location of our certificates for various
|
||||
# configuration operations (configtxgen). Once the tools have been successfully run,
|
||||
# we are able to launch our network. More detail on the tools and the structure of
|
||||
# the network will be provided later in this document. For now, let's get going...
|
||||
|
||||
# prepending $PWD/../bin to PATH to ensure we are picking up the correct binaries
|
||||
# this may be commented out to resolve installed version of tools if desired
|
||||
export PATH=${PWD}/../bin:${PWD}:$PATH
|
||||
export FABRIC_CFG_PATH=${PWD}
|
||||
export VERBOSE=false
|
||||
export NO_CHAINCODE=false
|
||||
|
||||
# Print the usage message
|
||||
function printHelp() {
|
||||
echo "Usage: "
|
||||
echo " byfn.sh <mode> [-c <channel name>] [-t <timeout>] [-d <delay>] [-f <docker-compose-file>] [-s <dbtype>] [-l <language>] [-o <consensus-type>] [-i <imagetag>] [-a] [-n] [-v]"
|
||||
echo " <mode> - one of 'up', 'down', 'restart', 'generate' or 'upgrade'"
|
||||
echo " - 'up' - bring up the network with docker-compose up"
|
||||
echo " - 'down' - clear the network with docker-compose down"
|
||||
echo " - 'restart' - restart the network"
|
||||
echo " - 'generate' - generate required certificates and genesis block"
|
||||
echo " - 'upgrade' - upgrade the network from version 1.3.x to 1.4.0"
|
||||
echo " -c <channel name> - channel name to use (defaults to \"mychannel\")"
|
||||
echo " -t <timeout> - CLI timeout duration in seconds (defaults to 10)"
|
||||
echo " -d <delay> - delay duration in seconds (defaults to 3)"
|
||||
echo " -s <dbtype> - the database backend to use: goleveldb (default) or couchdb"
|
||||
echo " -l <language> - the programming language of the chaincode to deploy: go (default), javascript, or java"
|
||||
echo " -p <chaincode path> - the path of the chaincode to package and deploy"
|
||||
echo " -m <chaincode name> - the name of the chaincode to deploy"
|
||||
echo " -e <chaincode version> - the version of the chaincode to be deployed"
|
||||
echo " -i <imagetag> - the tag to be used to launch the network (defaults to \"latest\")"
|
||||
echo " -a - launch certificate authorities (no certificate authorities are launched by default)"
|
||||
echo " -n - do not deploy chaincode (abstore chaincode is deployed by default)"
|
||||
echo " -v - verbose mode"
|
||||
echo " byfn.sh -h (print this message)"
|
||||
echo
|
||||
echo "Typically, one would first generate the required certificates and "
|
||||
echo "genesis block, then bring up the network. e.g.:"
|
||||
echo
|
||||
echo " byfn.sh generate -c mychannel"
|
||||
echo " byfn.sh up -c mychannel -s couchdb"
|
||||
echo " byfn.sh up -c mychannel -s couchdb -i 1.4.0"
|
||||
echo " byfn.sh up -l javascript"
|
||||
echo " byfn.sh down -c mychannel"
|
||||
echo " byfn.sh upgrade -c mychannel"
|
||||
echo
|
||||
echo "Taking all defaults:"
|
||||
echo " byfn.sh generate"
|
||||
echo " byfn.sh up"
|
||||
echo " byfn.sh down"
|
||||
echo
|
||||
echo "Installing your own chaincode:"
|
||||
echo " byfn.sh up -c mychannel -l javascript -cpath ../../fabric-samples/chaincode/mychaincode -cname mychaincode -version 1"
|
||||
echo
|
||||
}
|
||||
|
||||
# Ask user for confirmation to proceed
|
||||
function askProceed() {
|
||||
read -p "Continue? [Y/n] " ans
|
||||
case "$ans" in
|
||||
y | Y | "")
|
||||
echo "proceeding ..."
|
||||
;;
|
||||
n | N)
|
||||
echo "exiting..."
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
echo "invalid response"
|
||||
askProceed
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Obtain CONTAINER_IDS and remove them
|
||||
# TODO Might want to make this optional - could clear other containers
|
||||
function clearContainers() {
|
||||
CONTAINER_IDS=$(docker ps -a | awk '($2 ~ /dev-peer.*/) {print $1}')
|
||||
if [ -z "$CONTAINER_IDS" -o "$CONTAINER_IDS" == " " ]; then
|
||||
echo "---- No containers available for deletion ----"
|
||||
else
|
||||
docker rm -f $CONTAINER_IDS
|
||||
fi
|
||||
}
|
||||
|
||||
# Delete any images that were generated as a part of this setup
|
||||
# specifically the following images are often left behind:
|
||||
# TODO list generated image naming patterns
|
||||
function removeUnwantedImages() {
|
||||
DOCKER_IMAGE_IDS=$(docker images | awk '($1 ~ /dev-peer.*/) {print $3}')
|
||||
if [ -z "$DOCKER_IMAGE_IDS" -o "$DOCKER_IMAGE_IDS" == " " ]; then
|
||||
echo "---- No images available for deletion ----"
|
||||
else
|
||||
docker rmi -f $DOCKER_IMAGE_IDS
|
||||
fi
|
||||
}
|
||||
|
||||
# Versions of fabric known not to work with this release of first-network
|
||||
BLACKLISTED_VERSIONS="^1\."
|
||||
|
||||
# Do some basic sanity checking to make sure that the appropriate versions of fabric
|
||||
# binaries/images are available. In the future, additional checking for the presence
|
||||
# of go or other items could be added.
|
||||
function checkPrereqs() {
|
||||
# Note, we check configtxlator externally because it does not require a config file, and peer in the
|
||||
# docker image because of FAB-8551 that makes configtxlator return 'development version' in docker
|
||||
LOCAL_VERSION=$(configtxlator version | sed -ne 's/ Version: //p')
|
||||
DOCKER_IMAGE_VERSION=$(docker run --rm hyperledger/fabric-tools:$IMAGETAG peer version | sed -ne 's/ Version: //p' | head -1)
|
||||
|
||||
echo "LOCAL_VERSION=$LOCAL_VERSION"
|
||||
echo "DOCKER_IMAGE_VERSION=$DOCKER_IMAGE_VERSION"
|
||||
|
||||
if [ "$LOCAL_VERSION" != "$DOCKER_IMAGE_VERSION" ]; then
|
||||
echo "=================== WARNING ==================="
|
||||
echo " Local fabric binaries and docker images are "
|
||||
echo " out of sync. This may cause problems. "
|
||||
echo "==============================================="
|
||||
fi
|
||||
|
||||
for UNSUPPORTED_VERSION in $BLACKLISTED_VERSIONS; do
|
||||
echo "$LOCAL_VERSION" | grep -q $UNSUPPORTED_VERSION
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "ERROR! Local Fabric binary version of $LOCAL_VERSION does not match this newer version of BYFN and is unsupported. Either move to a later version of Fabric or checkout an earlier version of fabric-samples."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "$DOCKER_IMAGE_VERSION" | grep -q $UNSUPPORTED_VERSION
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "ERROR! Fabric Docker image version of $DOCKER_IMAGE_VERSION does not match this newer version of BYFN and is unsupported. Either move to a later version of Fabric or checkout an earlier version of fabric-samples."
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Generate the needed certificates, the genesis block and start the network.
|
||||
function networkUp() {
|
||||
checkPrereqs
|
||||
# generate artifacts if they don't exist
|
||||
if [ ! -d "crypto-config" ]; then
|
||||
generateCerts
|
||||
generateChannelArtifacts
|
||||
fi
|
||||
COMPOSE_FILES="-f ${COMPOSE_FILE} -f ${COMPOSE_FILE_RAFT2}"
|
||||
if [ "${CERTIFICATE_AUTHORITIES}" == "true" ]; then
|
||||
COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_CA}"
|
||||
export BYFN_CA1_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org1.example.com/ca && ls *_sk)
|
||||
export BYFN_CA2_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org2.example.com/ca && ls *_sk)
|
||||
fi
|
||||
if [ "${IF_COUCHDB}" == "couchdb" ]; then
|
||||
COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_COUCH}"
|
||||
fi
|
||||
IMAGE_TAG=$IMAGETAG docker-compose ${COMPOSE_FILES} up -d 2>&1
|
||||
docker ps -a
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR !!!! Unable to start network"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Sleeping 15s to allow Raft cluster to complete booting"
|
||||
sleep 15
|
||||
|
||||
if [[ "${NO_CHAINCODE}" != "true" ]] && [[ -z "${CC_SRC_PATH}" ]]; then
|
||||
echo Vendoring Go dependencies ...
|
||||
pushd ../chaincode/abstore/go
|
||||
GO111MODULE=on go mod vendor
|
||||
popd
|
||||
echo Finished vendoring Go dependencies
|
||||
fi
|
||||
|
||||
# now run the end to end script
|
||||
docker exec cli scripts/script.sh $CHANNEL_NAME $CLI_DELAY $CC_SRC_LANGUAGE $CLI_TIMEOUT $VERBOSE $NO_CHAINCODE $CC_SRC_PATH $CC_NAME $VERSION
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR !!!! Test failed"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Upgrade the network components which are at version 1.3.x to 1.4.x
|
||||
# Stop the orderer and peers, backup the ledger for orderer and peers, cleanup chaincode containers and images
|
||||
# and relaunch the orderer and peers with latest tag
|
||||
function upgradeNetwork() {
|
||||
if [[ "$IMAGETAG" == *"1.4"* ]] || [[ $IMAGETAG == "latest" ]]; then
|
||||
docker inspect -f '{{.Config.Volumes}}' orderer.example.com | grep -q '/var/hyperledger/production/orderer'
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR !!!! This network does not appear to start with fabric-samples >= v1.3.x?"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
LEDGERS_BACKUP=./ledgers-backup
|
||||
|
||||
# create ledger-backup directory
|
||||
mkdir -p $LEDGERS_BACKUP
|
||||
|
||||
export IMAGE_TAG=$IMAGETAG
|
||||
COMPOSE_FILES="-f ${COMPOSE_FILE} -f ${COMPOSE_FILE_RAFT2}"
|
||||
if [ "${CERTIFICATE_AUTHORITIES}" == "true" ]; then
|
||||
COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_CA}"
|
||||
export BYFN_CA1_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org1.example.com/ca && ls *_sk)
|
||||
export BYFN_CA2_PRIVATE_KEY=$(cd crypto-config/peerOrganizations/org2.example.com/ca && ls *_sk)
|
||||
fi
|
||||
if [ "${IF_COUCHDB}" == "couchdb" ]; then
|
||||
COMPOSE_FILES="${COMPOSE_FILES} -f ${COMPOSE_FILE_COUCH}"
|
||||
fi
|
||||
|
||||
# removing the cli container
|
||||
docker-compose $COMPOSE_FILES stop cli
|
||||
docker-compose $COMPOSE_FILES up -d --no-deps cli
|
||||
|
||||
echo "Upgrading orderer"
|
||||
docker-compose $COMPOSE_FILES stop orderer.example.com
|
||||
docker cp -a orderer.example.com:/var/hyperledger/production/orderer $LEDGERS_BACKUP/orderer.example.com
|
||||
docker-compose $COMPOSE_FILES up -d --no-deps orderer.example.com
|
||||
|
||||
for PEER in peer0.org1.example.com peer1.org1.example.com peer0.org2.example.com peer1.org2.example.com; do
|
||||
echo "Upgrading peer $PEER"
|
||||
|
||||
# Stop the peer and backup its ledger
|
||||
docker-compose $COMPOSE_FILES stop $PEER
|
||||
docker cp -a $PEER:/var/hyperledger/production $LEDGERS_BACKUP/$PEER/
|
||||
|
||||
# Remove any old containers and images for this peer
|
||||
CC_CONTAINERS=$(docker ps | grep dev-$PEER | awk '{print $1}')
|
||||
if [ -n "$CC_CONTAINERS" ]; then
|
||||
docker rm -f $CC_CONTAINERS
|
||||
fi
|
||||
CC_IMAGES=$(docker images | grep dev-$PEER | awk '{print $1}')
|
||||
if [ -n "$CC_IMAGES" ]; then
|
||||
docker rmi -f $CC_IMAGES
|
||||
fi
|
||||
|
||||
# Start the peer again
|
||||
docker-compose $COMPOSE_FILES up -d --no-deps $PEER
|
||||
done
|
||||
|
||||
docker exec cli scripts/upgrade_to_v14.sh $CHANNEL_NAME $CLI_DELAY $CC_SRC_LANGUAGE $CLI_TIMEOUT $VERBOSE
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "ERROR !!!! Test failed"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "ERROR !!!! Pass the v1.4.x image tag"
|
||||
fi
|
||||
}
|
||||
|
||||
# Tear down running network
|
||||
function networkDown() {
|
||||
# stop org3 containers also in addition to org1 and org2, in case we were running sample to add org3
|
||||
docker-compose -f $COMPOSE_FILE -f $COMPOSE_FILE_COUCH -f $COMPOSE_FILE_RAFT2 -f $COMPOSE_FILE_CA -f $COMPOSE_FILE_ORG3 down --volumes --remove-orphans
|
||||
|
||||
# Don't remove the generated artifacts -- note, the ledgers are always removed
|
||||
if [ "$MODE" != "restart" ]; then
|
||||
# Bring down the network, deleting the volumes
|
||||
#Delete any ledger backups
|
||||
docker run -v $PWD:/tmp/first-network --rm hyperledger/fabric-tools:$IMAGETAG rm -Rf /tmp/first-network/ledgers-backup
|
||||
#Cleanup the chaincode containers
|
||||
clearContainers
|
||||
#Cleanup images
|
||||
removeUnwantedImages
|
||||
# remove orderer block and other channel configuration transactions and certs
|
||||
rm -rf channel-artifacts/*.block channel-artifacts/*.tx crypto-config ./org3-artifacts/crypto-config/ channel-artifacts/org3.json
|
||||
fi
|
||||
}
|
||||
|
||||
# We will use the cryptogen tool to generate the cryptographic material (x509 certs)
|
||||
# for our various network entities. The certificates are based on a standard PKI
|
||||
# implementation where validation is achieved by reaching a common trust anchor.
|
||||
#
|
||||
# Cryptogen consumes a file - ``crypto-config.yaml`` - that contains the network
|
||||
# topology and allows us to generate a library of certificates for both the
|
||||
# Organizations and the components that belong to those Organizations. Each
|
||||
# Organization is provisioned a unique root certificate (``ca-cert``), that binds
|
||||
# specific components (peers and orderers) to that Org. Transactions and communications
|
||||
# within Fabric are signed by an entity's private key (``keystore``), and then verified
|
||||
# by means of a public key (``signcerts``). You will notice a "count" variable within
|
||||
# this file. We use this to specify the number of peers per Organization; in our
|
||||
# case it's two peers per Org. The rest of this template is extremely
|
||||
# self-explanatory.
|
||||
#
|
||||
# After we run the tool, the certs will be parked in a folder titled ``crypto-config``.
|
||||
|
||||
# Generates Org certs using cryptogen tool
|
||||
function generateCerts() {
|
||||
which cryptogen
|
||||
if [ "$?" -ne 0 ]; then
|
||||
echo "cryptogen tool not found. exiting"
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
echo "##########################################################"
|
||||
echo "##### Generate certificates using cryptogen tool #########"
|
||||
echo "##########################################################"
|
||||
|
||||
if [ -d "crypto-config" ]; then
|
||||
rm -Rf crypto-config
|
||||
fi
|
||||
set -x
|
||||
cryptogen generate --config=./crypto-config.yaml
|
||||
res=$?
|
||||
set +x
|
||||
if [ $res -ne 0 ]; then
|
||||
echo "Failed to generate certificates..."
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
echo "Generate CCP files for Org1 and Org2"
|
||||
./ccp-generate.sh
|
||||
}
|
||||
|
||||
# The `configtxgen tool is used to create four artifacts: orderer **bootstrap
|
||||
# block**, fabric **channel configuration transaction**, and two **anchor
|
||||
# peer transactions** - one for each Peer Org.
|
||||
#
|
||||
# The orderer block is the genesis block for the ordering service, and the
|
||||
# channel transaction file is broadcast to the orderer at channel creation
|
||||
# time. The anchor peer transactions, as the name might suggest, specify each
|
||||
# Org's anchor peer on this channel.
|
||||
#
|
||||
# Configtxgen consumes a file - ``configtx.yaml`` - that contains the definitions
|
||||
# for the sample network. There are three members - one Orderer Org (``OrdererOrg``)
|
||||
# and two Peer Orgs (``Org1`` & ``Org2``) each managing and maintaining two peer nodes.
|
||||
# This file also specifies a consortium - ``SampleConsortium`` - consisting of our
|
||||
# two Peer Orgs. Pay specific attention to the "Profiles" section at the top of
|
||||
# this file. You will notice that we have two unique headers. One for the orderer genesis
|
||||
# block - ``TwoOrgsOrdererGenesis`` - and one for our channel - ``TwoOrgsChannel``.
|
||||
# These headers are important, as we will pass them in as arguments when we create
|
||||
# our artifacts. This file also contains two additional specifications that are worth
|
||||
# noting. Firstly, we specify the anchor peers for each Peer Org
|
||||
# (``peer0.org1.example.com`` & ``peer0.org2.example.com``). Secondly, we point to
|
||||
# the location of the MSP directory for each member, in turn allowing us to store the
|
||||
# root certificates for each Org in the orderer genesis block. This is a critical
|
||||
# concept. Now any network entity communicating with the ordering service can have
|
||||
# its digital signature verified.
|
||||
#
|
||||
# This function will generate the crypto material and our four configuration
|
||||
# artifacts, and subsequently output these files into the ``channel-artifacts``
|
||||
# folder.
|
||||
#
|
||||
# If you receive the following warning, it can be safely ignored:
|
||||
#
|
||||
# [bccsp] GetDefault -> WARN 001 Before using BCCSP, please call InitFactories(). Falling back to bootBCCSP.
|
||||
#
|
||||
# You can ignore the logs regarding intermediate certs, we are not using them in
|
||||
# this crypto implementation.
|
||||
|
||||
# Generate orderer genesis block, channel configuration transaction and
|
||||
# anchor peer update transactions
|
||||
function generateChannelArtifacts() {
|
||||
which configtxgen
|
||||
if [ "$?" -ne 0 ]; then
|
||||
echo "configtxgen tool not found. exiting"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "##########################################################"
|
||||
echo "######### Generating Orderer Genesis block ##############"
|
||||
echo "##########################################################"
|
||||
# Note: For some unknown reason (at least for now) the block file can't be
|
||||
# named orderer.genesis.block or the orderer will fail to launch!
|
||||
set -x
|
||||
configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
|
||||
res=$?
|
||||
set +x
|
||||
if [ $res -ne 0 ]; then
|
||||
echo "Failed to generate orderer genesis block..."
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
echo "#################################################################"
|
||||
echo "### Generating channel configuration transaction 'channel.tx' ###"
|
||||
echo "#################################################################"
|
||||
set -x
|
||||
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
|
||||
res=$?
|
||||
set +x
|
||||
if [ $res -ne 0 ]; then
|
||||
echo "Failed to generate channel configuration transaction..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "#################################################################"
|
||||
echo "####### Generating anchor peer update for Org1MSP ##########"
|
||||
echo "#################################################################"
|
||||
set -x
|
||||
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
|
||||
res=$?
|
||||
set +x
|
||||
if [ $res -ne 0 ]; then
|
||||
echo "Failed to generate anchor peer update for Org1MSP..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "#################################################################"
|
||||
echo "####### Generating anchor peer update for Org2MSP ##########"
|
||||
echo "#################################################################"
|
||||
set -x
|
||||
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate \
|
||||
./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
|
||||
res=$?
|
||||
set +x
|
||||
if [ $res -ne 0 ]; then
|
||||
echo "Failed to generate anchor peer update for Org2MSP..."
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
}
|
||||
|
||||
# timeout duration - the duration the CLI should wait for a response from
|
||||
# another container before giving up
|
||||
CLI_TIMEOUT=10
|
||||
# default for delay between commands
|
||||
CLI_DELAY=3
|
||||
# channel name defaults to "mychannel"
|
||||
CHANNEL_NAME="mychannel"
|
||||
# use this as the default docker-compose yaml definition
|
||||
COMPOSE_FILE=docker-compose-cli.yaml
|
||||
#
|
||||
COMPOSE_FILE_COUCH=docker-compose-couch.yaml
|
||||
# org3 docker compose file
|
||||
COMPOSE_FILE_ORG3=docker-compose-org3.yaml
|
||||
# two additional etcd/raft orderers
|
||||
COMPOSE_FILE_RAFT2=docker-compose-etcdraft2.yaml
|
||||
# certificate authorities compose file
|
||||
COMPOSE_FILE_CA=docker-compose-ca.yaml
|
||||
#
|
||||
# use go as the default language for chaincode
|
||||
CC_SRC_LANGUAGE=go
|
||||
# default image tag
|
||||
IMAGETAG="latest"
|
||||
# Parse commandline args
|
||||
if [ "$1" = "-m" ]; then # supports old usage, muscle memory is powerful!
|
||||
shift
|
||||
fi
|
||||
MODE=$1
|
||||
shift
|
||||
# Determine whether starting, stopping, restarting, generating or upgrading
|
||||
if [ "$MODE" == "up" ]; then
|
||||
EXPMODE="Starting"
|
||||
elif [ "$MODE" == "down" ]; then
|
||||
EXPMODE="Stopping"
|
||||
elif [ "$MODE" == "restart" ]; then
|
||||
EXPMODE="Restarting"
|
||||
elif [ "$MODE" == "generate" ]; then
|
||||
EXPMODE="Generating certs and genesis block"
|
||||
elif [ "$MODE" == "upgrade" ]; then
|
||||
EXPMODE="Upgrading the network"
|
||||
else
|
||||
printHelp
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while getopts "h?c:t:d:s:l:i:p:m:e:anv" opt; do
|
||||
case "$opt" in
|
||||
h | \?)
|
||||
printHelp
|
||||
exit 0
|
||||
;;
|
||||
c)
|
||||
CHANNEL_NAME=$OPTARG
|
||||
echo "CHANNEL_NAME: "$CHANNEL_NAME
|
||||
;;
|
||||
t)
|
||||
CLI_TIMEOUT=$OPTARG
|
||||
echo "CLI_TIMEOUT: "$CLI_TIMEOUT
|
||||
;;
|
||||
d)
|
||||
CLI_DELAY=$OPTARG
|
||||
echo "CLI_DELAY: "$CLI_DELAY
|
||||
;;
|
||||
s)
|
||||
IF_COUCHDB=$OPTARG
|
||||
echo "IF_COUCHDB: "$IF_COUCHDB
|
||||
;;
|
||||
l)
|
||||
CC_SRC_LANGUAGE=$OPTARG
|
||||
echo "CC_SRC_LANGUAGE: "$CC_SRC_LANGUAGE
|
||||
;;
|
||||
i)
|
||||
IMAGETAG=$(go env GOARCH)"-"$OPTARG
|
||||
echo "IMAGETAG: "$IMAGETAG
|
||||
;;
|
||||
p)
|
||||
CC_SRC_PATH=$OPTARG
|
||||
echo "CC_SRC_PATH: "$CC_SRC_PATH
|
||||
;;
|
||||
m)
|
||||
CC_NAME=$OPTARG
|
||||
echo "CC_NAME: "$CC_NAME
|
||||
;;
|
||||
e)
|
||||
VERSION=$OPTARG
|
||||
echo "VERSION: "$VERSION
|
||||
;;
|
||||
a)
|
||||
CERTIFICATE_AUTHORITIES=true
|
||||
echo "CERTIFICATE_AUTHORITIES: "$CERTIFICATE_AUTHORITIES
|
||||
;;
|
||||
n)
|
||||
NO_CHAINCODE=true
|
||||
echo "NO_CHAINCODE: "$NO_CHAINCODE
|
||||
;;
|
||||
v)
|
||||
VERBOSE=true
|
||||
echo "VERBOSE: "$VERBOSE
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
# Announce what was requested
|
||||
|
||||
if [ "${IF_COUCHDB}" == "couchdb" ]; then
|
||||
echo
|
||||
echo "${EXPMODE} for channel '${CHANNEL_NAME}' with CLI timeout of '${CLI_TIMEOUT}' seconds and CLI delay of '${CLI_DELAY}' seconds and using database '${IF_COUCHDB}'"
|
||||
else
|
||||
echo "${EXPMODE} for channel '${CHANNEL_NAME}' with CLI timeout of '${CLI_TIMEOUT}' seconds and CLI delay of '${CLI_DELAY}' seconds"
|
||||
fi
|
||||
# ask for confirmation to proceed
|
||||
askProceed
|
||||
|
||||
#Create the network using docker compose
|
||||
if [ "${MODE}" == "up" ]; then
|
||||
networkUp
|
||||
elif [ "${MODE}" == "down" ]; then ## Clear the network
|
||||
networkDown
|
||||
elif [ "${MODE}" == "generate" ]; then ## Generate Artifacts
|
||||
generateCerts
|
||||
generateChannelArtifacts
|
||||
elif [ "${MODE}" == "restart" ]; then ## Restart the network
|
||||
networkDown
|
||||
networkUp
|
||||
elif [ "${MODE}" == "upgrade" ]; then ## Upgrade the network from version 1.2.x to 1.3.x
|
||||
upgradeNetwork
|
||||
else
|
||||
printHelp
|
||||
exit 1
|
||||
fi
|
||||
49
hyperledger-fabric/first-network/ccp-generate.sh
Executable file
49
hyperledger-fabric/first-network/ccp-generate.sh
Executable file
|
|
@ -0,0 +1,49 @@
|
|||
#!/bin/bash
|
||||
|
||||
function one_line_pem {
|
||||
echo "`awk 'NF {sub(/\\n/, ""); printf "%s\\\\\\\n",$0;}' $1`"
|
||||
}
|
||||
|
||||
function json_ccp {
|
||||
local PP=$(one_line_pem $5)
|
||||
local CP=$(one_line_pem $6)
|
||||
sed -e "s/\${ORG}/$1/" \
|
||||
-e "s/\${P0PORT}/$2/" \
|
||||
-e "s/\${P1PORT}/$3/" \
|
||||
-e "s/\${CAPORT}/$4/" \
|
||||
-e "s#\${PEERPEM}#$PP#" \
|
||||
-e "s#\${CAPEM}#$CP#" \
|
||||
ccp-template.json
|
||||
}
|
||||
|
||||
function yaml_ccp {
|
||||
local PP=$(one_line_pem $5)
|
||||
local CP=$(one_line_pem $6)
|
||||
sed -e "s/\${ORG}/$1/" \
|
||||
-e "s/\${P0PORT}/$2/" \
|
||||
-e "s/\${P1PORT}/$3/" \
|
||||
-e "s/\${CAPORT}/$4/" \
|
||||
-e "s#\${PEERPEM}#$PP#" \
|
||||
-e "s#\${CAPEM}#$CP#" \
|
||||
ccp-template.yaml | sed -e $'s/\\\\n/\\\n /g'
|
||||
}
|
||||
|
||||
ORG=1
|
||||
P0PORT=7051
|
||||
P1PORT=8051
|
||||
CAPORT=7054
|
||||
PEERPEM=crypto-config/peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem
|
||||
CAPEM=crypto-config/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem
|
||||
|
||||
echo "$(json_ccp $ORG $P0PORT $P1PORT $CAPORT $PEERPEM $CAPEM)" > connection-org1.json
|
||||
echo "$(yaml_ccp $ORG $P0PORT $P1PORT $CAPORT $PEERPEM $CAPEM)" > connection-org1.yaml
|
||||
|
||||
ORG=2
|
||||
P0PORT=9051
|
||||
P1PORT=10051
|
||||
CAPORT=8054
|
||||
PEERPEM=crypto-config/peerOrganizations/org2.example.com/tlsca/tlsca.org2.example.com-cert.pem
|
||||
CAPEM=crypto-config/peerOrganizations/org2.example.com/ca/ca.org2.example.com-cert.pem
|
||||
|
||||
echo "$(json_ccp $ORG $P0PORT $P1PORT $CAPORT $PEERPEM $CAPEM)" > connection-org2.json
|
||||
echo "$(yaml_ccp $ORG $P0PORT $P1PORT $CAPORT $PEERPEM $CAPEM)" > connection-org2.yaml
|
||||
60
hyperledger-fabric/first-network/ccp-template.json
Normal file
60
hyperledger-fabric/first-network/ccp-template.json
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
{
|
||||
"name": "first-network-org${ORG}",
|
||||
"version": "1.0.0",
|
||||
"client": {
|
||||
"organization": "Org${ORG}",
|
||||
"connection": {
|
||||
"timeout": {
|
||||
"peer": {
|
||||
"endorser": "300"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"organizations": {
|
||||
"Org${ORG}": {
|
||||
"mspid": "Org${ORG}MSP",
|
||||
"peers": [
|
||||
"peer0.org${ORG}.example.com",
|
||||
"peer1.org${ORG}.example.com"
|
||||
],
|
||||
"certificateAuthorities": [
|
||||
"ca.org${ORG}.example.com"
|
||||
]
|
||||
}
|
||||
},
|
||||
"peers": {
|
||||
"peer0.org${ORG}.example.com": {
|
||||
"url": "grpcs://localhost:${P0PORT}",
|
||||
"tlsCACerts": {
|
||||
"pem": "${PEERPEM}"
|
||||
},
|
||||
"grpcOptions": {
|
||||
"ssl-target-name-override": "peer0.org${ORG}.example.com",
|
||||
"hostnameOverride": "peer0.org${ORG}.example.com"
|
||||
}
|
||||
},
|
||||
"peer1.org${ORG}.example.com": {
|
||||
"url": "grpcs://localhost:${P1PORT}",
|
||||
"tlsCACerts": {
|
||||
"pem": "${PEERPEM}"
|
||||
},
|
||||
"grpcOptions": {
|
||||
"ssl-target-name-override": "peer1.org${ORG}.example.com",
|
||||
"hostnameOverride": "peer1.org${ORG}.example.com"
|
||||
}
|
||||
}
|
||||
},
|
||||
"certificateAuthorities": {
|
||||
"ca.org${ORG}.example.com": {
|
||||
"url": "https://localhost:${CAPORT}",
|
||||
"caName": "ca-org${ORG}",
|
||||
"tlsCACerts": {
|
||||
"pem": "${CAPEM}"
|
||||
},
|
||||
"httpOptions": {
|
||||
"verify": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
43
hyperledger-fabric/first-network/ccp-template.yaml
Normal file
43
hyperledger-fabric/first-network/ccp-template.yaml
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
---
|
||||
name: first-network-org${ORG}
|
||||
version: 1.0.0
|
||||
client:
|
||||
organization: Org${ORG}
|
||||
connection:
|
||||
timeout:
|
||||
peer:
|
||||
endorser: '300'
|
||||
organizations:
|
||||
Org${ORG}:
|
||||
mspid: Org${ORG}MSP
|
||||
peers:
|
||||
- peer0.org${ORG}.example.com
|
||||
- peer1.org${ORG}.example.com
|
||||
certificateAuthorities:
|
||||
- ca.org${ORG}.example.com
|
||||
peers:
|
||||
peer0.org${ORG}.example.com:
|
||||
url: grpcs://localhost:${P0PORT}
|
||||
tlsCACerts:
|
||||
pem: |
|
||||
${PEERPEM}
|
||||
grpcOptions:
|
||||
ssl-target-name-override: peer0.org${ORG}.example.com
|
||||
hostnameOverride: peer0.org${ORG}.example.com
|
||||
peer1.org${ORG}.example.com:
|
||||
url: grpcs://localhost:${P1PORT}
|
||||
tlsCACerts:
|
||||
pem: |
|
||||
${PEERPEM}
|
||||
grpcOptions:
|
||||
ssl-target-name-override: peer1.org${ORG}.example.com
|
||||
hostnameOverride: peer1.org${ORG}.example.com
|
||||
certificateAuthorities:
|
||||
ca.org${ORG}.example.com:
|
||||
url: https://localhost:${CAPORT}
|
||||
caName: ca-org${ORG}
|
||||
tlsCACerts:
|
||||
pem: |
|
||||
${CAPEM}
|
||||
httpOptions:
|
||||
verify: false
|
||||
363
hyperledger-fabric/first-network/configtx.yaml
Normal file
363
hyperledger-fabric/first-network/configtx.yaml
Normal file
|
|
@ -0,0 +1,363 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
---
|
||||
################################################################################
|
||||
#
|
||||
# Section: Organizations
|
||||
#
|
||||
# - This section defines the different organizational identities which will
|
||||
# be referenced later in the configuration.
|
||||
#
|
||||
################################################################################
|
||||
Organizations:
|
||||
|
||||
# SampleOrg defines an MSP using the sampleconfig. It should never be used
|
||||
# in production but may be used as a template for other definitions
|
||||
- &OrdererOrg
|
||||
# DefaultOrg defines the organization which is used in the sampleconfig
|
||||
# of the fabric.git development environment
|
||||
Name: OrdererOrg
|
||||
|
||||
# ID to load the MSP definition as
|
||||
ID: OrdererMSP
|
||||
|
||||
# MSPDir is the filesystem path which contains the MSP configuration
|
||||
MSPDir: crypto-config/ordererOrganizations/example.com/msp
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For organization policies, their canonical path is usually
|
||||
# /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
|
||||
Policies:
|
||||
Readers:
|
||||
Type: Signature
|
||||
Rule: "OR('OrdererMSP.member')"
|
||||
Writers:
|
||||
Type: Signature
|
||||
Rule: "OR('OrdererMSP.member')"
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('OrdererMSP.admin')"
|
||||
|
||||
OrdererEndpoints:
|
||||
- orderer.example.com:7050
|
||||
|
||||
- &Org1
|
||||
# DefaultOrg defines the organization which is used in the sampleconfig
|
||||
# of the fabric.git development environment
|
||||
Name: Org1MSP
|
||||
|
||||
# ID to load the MSP definition as
|
||||
ID: Org1MSP
|
||||
|
||||
MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For organization policies, their canonical path is usually
|
||||
# /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
|
||||
Policies:
|
||||
Readers:
|
||||
Type: Signature
|
||||
Rule: "OR('Org1MSP.admin', 'Org1MSP.peer', 'Org1MSP.client')"
|
||||
Writers:
|
||||
Type: Signature
|
||||
Rule: "OR('Org1MSP.admin', 'Org1MSP.client')"
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('Org1MSP.admin')"
|
||||
Endorsement:
|
||||
Type: Signature
|
||||
Rule: "OR('Org1MSP.peer')"
|
||||
|
||||
# leave this flag set to true.
|
||||
AnchorPeers:
|
||||
# AnchorPeers defines the location of peers which can be used
|
||||
# for cross org gossip communication. Note, this value is only
|
||||
# encoded in the genesis block in the Application section context
|
||||
- Host: peer0.org1.example.com
|
||||
Port: 7051
|
||||
|
||||
- &Org2
|
||||
# DefaultOrg defines the organization which is used in the sampleconfig
|
||||
# of the fabric.git development environment
|
||||
Name: Org2MSP
|
||||
|
||||
# ID to load the MSP definition as
|
||||
ID: Org2MSP
|
||||
|
||||
MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For organization policies, their canonical path is usually
|
||||
# /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
|
||||
Policies:
|
||||
Readers:
|
||||
Type: Signature
|
||||
Rule: "OR('Org2MSP.admin', 'Org2MSP.peer', 'Org2MSP.client')"
|
||||
Writers:
|
||||
Type: Signature
|
||||
Rule: "OR('Org2MSP.admin', 'Org2MSP.client')"
|
||||
Admins:
|
||||
Type: Signature
|
||||
Rule: "OR('Org2MSP.admin')"
|
||||
Endorsement:
|
||||
Type: Signature
|
||||
Rule: "OR('Org2MSP.peer')"
|
||||
|
||||
AnchorPeers:
|
||||
# AnchorPeers defines the location of peers which can be used
|
||||
# for cross org gossip communication. Note, this value is only
|
||||
# encoded in the genesis block in the Application section context
|
||||
- Host: peer0.org2.example.com
|
||||
Port: 9051
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# SECTION: Capabilities
|
||||
#
|
||||
# - This section defines the capabilities of fabric network. This is a new
|
||||
# concept as of v1.1.0 and should not be utilized in mixed networks with
|
||||
# v1.0.x peers and orderers. Capabilities define features which must be
|
||||
# present in a fabric binary for that binary to safely participate in the
|
||||
# fabric network. For instance, if a new MSP type is added, newer binaries
|
||||
# might recognize and validate the signatures from this type, while older
|
||||
# binaries without this support would be unable to validate those
|
||||
# transactions. This could lead to different versions of the fabric binaries
|
||||
# having different world states. Instead, defining a capability for a channel
|
||||
# informs those binaries without this capability that they must cease
|
||||
# processing transactions until they have been upgraded. For v1.0.x if any
|
||||
# capabilities are defined (including a map with all capabilities turned off)
|
||||
# then the v1.0.x peer will deliberately crash.
|
||||
#
|
||||
################################################################################
|
||||
Capabilities:
|
||||
# Channel capabilities apply to both the orderers and the peers and must be
|
||||
# supported by both.
|
||||
# Set the value of the capability to true to require it.
|
||||
Channel: &ChannelCapabilities
|
||||
# V2_0 capability ensures that orderers and peers behave according
|
||||
# to v2.0 channel capabilities. Orderers and peers from
|
||||
# prior releases would behave in an incompatible way, and are therefore
|
||||
# not able to participate in channels at v2.0 capability.
|
||||
# Prior to enabling V2.0 channel capabilities, ensure that all
|
||||
# orderers and peers on a channel are at v2.0.0 or later.
|
||||
V2_0: true
|
||||
|
||||
# Orderer capabilities apply only to the orderers, and may be safely
|
||||
# used with prior release peers.
|
||||
# Set the value of the capability to true to require it.
|
||||
Orderer: &OrdererCapabilities
|
||||
# V2_0 orderer capability ensures that orderers behave according
|
||||
# to v2.0 orderer capabilities. Orderers from
|
||||
# prior releases would behave in an incompatible way, and are therefore
|
||||
# not able to participate in channels at v2.0 orderer capability.
|
||||
# Prior to enabling V2.0 orderer capabilities, ensure that all
|
||||
# orderers on channel are at v2.0.0 or later.
|
||||
V2_0: true
|
||||
|
||||
# Application capabilities apply only to the peer network, and may be safely
|
||||
# used with prior release orderers.
|
||||
# Set the value of the capability to true to require it.
|
||||
Application: &ApplicationCapabilities
|
||||
# V2_0 application capability ensures that peers behave according
|
||||
# to v2.0 application capabilities. Peers from
|
||||
# prior releases would behave in an incompatible way, and are therefore
|
||||
# not able to participate in channels at v2.0 application capability.
|
||||
# Prior to enabling V2.0 application capabilities, ensure that all
|
||||
# peers on channel are at v2.0.0 or later.
|
||||
V2_0: true
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# SECTION: Application
|
||||
#
|
||||
# - This section defines the values to encode into a config transaction or
|
||||
# genesis block for application related parameters
|
||||
#
|
||||
################################################################################
|
||||
Application: &ApplicationDefaults
|
||||
|
||||
# Organizations is the list of orgs which are defined as participants on
|
||||
# the application side of the network
|
||||
Organizations:
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For Application policies, their canonical path is
|
||||
# /Channel/Application/<PolicyName>
|
||||
Policies:
|
||||
Readers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Readers"
|
||||
Writers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Writers"
|
||||
Admins:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Admins"
|
||||
LifecycleEndorsement:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Endorsement"
|
||||
Endorsement:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Endorsement"
|
||||
|
||||
Capabilities:
|
||||
<<: *ApplicationCapabilities
|
||||
################################################################################
|
||||
#
|
||||
# SECTION: Orderer
|
||||
#
|
||||
# - This section defines the values to encode into a config transaction or
|
||||
# genesis block for orderer related parameters
|
||||
#
|
||||
################################################################################
|
||||
Orderer: &OrdererDefaults
|
||||
|
||||
# Orderer Type: The orderer implementation to start
|
||||
OrdererType: etcdraft
|
||||
|
||||
# Batch Timeout: The amount of time to wait before creating a batch
|
||||
BatchTimeout: 2s
|
||||
|
||||
# Batch Size: Controls the number of messages batched into a block
|
||||
BatchSize:
|
||||
|
||||
# Max Message Count: The maximum number of messages to permit in a batch
|
||||
MaxMessageCount: 10
|
||||
|
||||
# Absolute Max Bytes: The absolute maximum number of bytes allowed for
|
||||
# the serialized messages in a batch.
|
||||
AbsoluteMaxBytes: 99 MB
|
||||
|
||||
# Preferred Max Bytes: The preferred maximum number of bytes allowed for
|
||||
# the serialized messages in a batch. A message larger than the preferred
|
||||
# max bytes will result in a batch larger than preferred max bytes.
|
||||
PreferredMaxBytes: 512 KB
|
||||
|
||||
# Organizations is the list of orgs which are defined as participants on
|
||||
# the orderer side of the network
|
||||
Organizations:
|
||||
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For Orderer policies, their canonical path is
|
||||
# /Channel/Orderer/<PolicyName>
|
||||
Policies:
|
||||
Readers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Readers"
|
||||
Writers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Writers"
|
||||
Admins:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Admins"
|
||||
# BlockValidation specifies what signatures must be included in the block
|
||||
# from the orderer for the peer to validate it.
|
||||
BlockValidation:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Writers"
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# CHANNEL
|
||||
#
|
||||
# This section defines the values to encode into a config transaction or
|
||||
# genesis block for channel related parameters.
|
||||
#
|
||||
################################################################################
|
||||
Channel: &ChannelDefaults
|
||||
# Policies defines the set of policies at this level of the config tree
|
||||
# For Channel policies, their canonical path is
|
||||
# /Channel/<PolicyName>
|
||||
Policies:
|
||||
# Who may invoke the 'Deliver' API
|
||||
Readers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Readers"
|
||||
# Who may invoke the 'Broadcast' API
|
||||
Writers:
|
||||
Type: ImplicitMeta
|
||||
Rule: "ANY Writers"
|
||||
# By default, who may modify elements at this config level
|
||||
Admins:
|
||||
Type: ImplicitMeta
|
||||
Rule: "MAJORITY Admins"
|
||||
|
||||
# Capabilities describes the channel level capabilities, see the
|
||||
# dedicated Capabilities section elsewhere in this file for a full
|
||||
# description
|
||||
Capabilities:
|
||||
<<: *ChannelCapabilities
|
||||
|
||||
################################################################################
|
||||
#
|
||||
# Profile
|
||||
#
|
||||
# - Different configuration profiles may be encoded here to be specified
|
||||
# as parameters to the configtxgen tool
|
||||
#
|
||||
################################################################################
|
||||
Profiles:
|
||||
|
||||
TwoOrgsChannel:
|
||||
Consortium: SampleConsortium
|
||||
<<: *ChannelDefaults
|
||||
Application:
|
||||
<<: *ApplicationDefaults
|
||||
Organizations:
|
||||
- *Org1
|
||||
- *Org2
|
||||
Capabilities:
|
||||
<<: *ApplicationCapabilities
|
||||
|
||||
SampleMultiNodeEtcdRaft:
|
||||
<<: *ChannelDefaults
|
||||
Capabilities:
|
||||
<<: *ChannelCapabilities
|
||||
Orderer:
|
||||
<<: *OrdererDefaults
|
||||
OrdererType: etcdraft
|
||||
EtcdRaft:
|
||||
Consenters:
|
||||
- Host: orderer.example.com
|
||||
Port: 7050
|
||||
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
|
||||
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
|
||||
- Host: orderer2.example.com
|
||||
Port: 8050
|
||||
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/server.crt
|
||||
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/server.crt
|
||||
- Host: orderer3.example.com
|
||||
Port: 9050
|
||||
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/server.crt
|
||||
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/server.crt
|
||||
- Host: orderer4.example.com
|
||||
Port: 10050
|
||||
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/server.crt
|
||||
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/server.crt
|
||||
- Host: orderer5.example.com
|
||||
Port: 11050
|
||||
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer5.example.com/tls/server.crt
|
||||
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer5.example.com/tls/server.crt
|
||||
Addresses:
|
||||
- orderer.example.com:7050
|
||||
- orderer2.example.com:8050
|
||||
- orderer3.example.com:9050
|
||||
- orderer4.example.com:10050
|
||||
- orderer5.example.com:11050
|
||||
|
||||
Organizations:
|
||||
- *OrdererOrg
|
||||
Capabilities:
|
||||
<<: *OrdererCapabilities
|
||||
Application:
|
||||
<<: *ApplicationDefaults
|
||||
Organizations:
|
||||
- <<: *OrdererOrg
|
||||
Consortiums:
|
||||
SampleConsortium:
|
||||
Organizations:
|
||||
- *Org1
|
||||
- *Org2
|
||||
88
hyperledger-fabric/first-network/crypto-config.yaml
Normal file
88
hyperledger-fabric/first-network/crypto-config.yaml
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# "OrdererOrgs" - Definition of organizations managing orderer nodes
|
||||
# ---------------------------------------------------------------------------
|
||||
OrdererOrgs:
|
||||
# ---------------------------------------------------------------------------
|
||||
# Orderer
|
||||
# ---------------------------------------------------------------------------
|
||||
- Name: Orderer
|
||||
Domain: example.com
|
||||
# ---------------------------------------------------------------------------
|
||||
# "Specs" - See PeerOrgs below for complete description
|
||||
# ---------------------------------------------------------------------------
|
||||
Specs:
|
||||
- Hostname: orderer
|
||||
- Hostname: orderer2
|
||||
- Hostname: orderer3
|
||||
- Hostname: orderer4
|
||||
- Hostname: orderer5
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# "PeerOrgs" - Definition of organizations managing peer nodes
|
||||
# ---------------------------------------------------------------------------
|
||||
PeerOrgs:
|
||||
# ---------------------------------------------------------------------------
|
||||
# Org1
|
||||
# ---------------------------------------------------------------------------
|
||||
- Name: Org1
|
||||
Domain: org1.example.com
|
||||
EnableNodeOUs: true
|
||||
# ---------------------------------------------------------------------------
|
||||
# "Specs"
|
||||
# ---------------------------------------------------------------------------
|
||||
# Uncomment this section to enable the explicit definition of hosts in your
|
||||
# configuration. Most users will want to use Template, below
|
||||
#
|
||||
# Specs is an array of Spec entries. Each Spec entry consists of two fields:
|
||||
# - Hostname: (Required) The desired hostname, sans the domain.
|
||||
# - CommonName: (Optional) Specifies the template or explicit override for
|
||||
# the CN. By default, this is the template:
|
||||
#
|
||||
# "{{.Hostname}}.{{.Domain}}"
|
||||
#
|
||||
# which obtains its values from the Spec.Hostname and
|
||||
# Org.Domain, respectively.
|
||||
# ---------------------------------------------------------------------------
|
||||
# Specs:
|
||||
# - Hostname: foo # implicitly "foo.org1.example.com"
|
||||
# CommonName: foo27.org5.example.com # overrides Hostname-based FQDN set above
|
||||
# - Hostname: bar
|
||||
# - Hostname: baz
|
||||
# ---------------------------------------------------------------------------
|
||||
# "Template"
|
||||
# ---------------------------------------------------------------------------
|
||||
# Allows for the definition of 1 or more hosts that are created sequentially
|
||||
# from a template. By default, this looks like "peer%d" from 0 to Count-1.
|
||||
# You may override the number of nodes (Count), the starting index (Start)
|
||||
# or the template used to construct the name (Hostname).
|
||||
#
|
||||
# Note: Template and Specs are not mutually exclusive. You may define both
|
||||
# sections and the aggregate nodes will be created for you. Take care with
|
||||
# name collisions
|
||||
# ---------------------------------------------------------------------------
|
||||
Template:
|
||||
Count: 2
|
||||
# Start: 5
|
||||
# Hostname: {{.Prefix}}{{.Index}} # default
|
||||
# ---------------------------------------------------------------------------
|
||||
# "Users"
|
||||
# ---------------------------------------------------------------------------
|
||||
# Count: The number of user accounts _in addition_ to Admin
|
||||
# ---------------------------------------------------------------------------
|
||||
Users:
|
||||
Count: 1
|
||||
# ---------------------------------------------------------------------------
|
||||
# Org2: See "Org1" for full specification
|
||||
# ---------------------------------------------------------------------------
|
||||
- Name: Org2
|
||||
Domain: org2.example.com
|
||||
EnableNodeOUs: true
|
||||
Template:
|
||||
Count: 2
|
||||
Users:
|
||||
Count: 1
|
||||
46
hyperledger-fabric/first-network/docker-compose-ca.yaml
Normal file
46
hyperledger-fabric/first-network/docker-compose-ca.yaml
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
networks:
|
||||
byfn:
|
||||
|
||||
services:
|
||||
ca0:
|
||||
image: hyperledger/fabric-ca:$IMAGE_TAG
|
||||
environment:
|
||||
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
|
||||
- FABRIC_CA_SERVER_CA_NAME=ca-org1
|
||||
- FABRIC_CA_SERVER_TLS_ENABLED=true
|
||||
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
|
||||
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/${BYFN_CA1_PRIVATE_KEY}
|
||||
- FABRIC_CA_SERVER_PORT=7054
|
||||
ports:
|
||||
- "7054:7054"
|
||||
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/${BYFN_CA1_PRIVATE_KEY} -b admin:adminpw -d'
|
||||
volumes:
|
||||
- ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
|
||||
container_name: ca_peerOrg1
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
ca1:
|
||||
image: hyperledger/fabric-ca:$IMAGE_TAG
|
||||
environment:
|
||||
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
|
||||
- FABRIC_CA_SERVER_CA_NAME=ca-org2
|
||||
- FABRIC_CA_SERVER_TLS_ENABLED=true
|
||||
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem
|
||||
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/${BYFN_CA2_PRIVATE_KEY}
|
||||
- FABRIC_CA_SERVER_PORT=8054
|
||||
ports:
|
||||
- "8054:8054"
|
||||
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/${BYFN_CA2_PRIVATE_KEY} -b admin:adminpw -d'
|
||||
volumes:
|
||||
- ./crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
|
||||
container_name: ca_peerOrg2
|
||||
networks:
|
||||
- byfn
|
||||
93
hyperledger-fabric/first-network/docker-compose-cli.yaml
Normal file
93
hyperledger-fabric/first-network/docker-compose-cli.yaml
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
volumes:
|
||||
orderer.example.com:
|
||||
peer0.org1.example.com:
|
||||
peer1.org1.example.com:
|
||||
peer0.org2.example.com:
|
||||
peer1.org2.example.com:
|
||||
|
||||
networks:
|
||||
byfn:
|
||||
|
||||
services:
|
||||
|
||||
orderer.example.com:
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: orderer.example.com
|
||||
container_name: orderer.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer0.org1.example.com:
|
||||
container_name: peer0.org1.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer0.org1.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org1.example.com:
|
||||
container_name: peer1.org1.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer1.org1.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer0.org2.example.com:
|
||||
container_name: peer0.org2.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer0.org2.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org2.example.com:
|
||||
container_name: peer1.org2.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer1.org2.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
cli:
|
||||
container_name: cli
|
||||
image: hyperledger/fabric-tools:$IMAGE_TAG
|
||||
tty: true
|
||||
stdin_open: true
|
||||
environment:
|
||||
- GOPATH=/opt/gopath
|
||||
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
|
||||
#- FABRIC_LOGGING_SPEC=DEBUG
|
||||
- FABRIC_LOGGING_SPEC=INFO
|
||||
- CORE_PEER_ID=cli
|
||||
- CORE_PEER_ADDRESS=peer0.org1.example.com:7051
|
||||
- CORE_PEER_LOCALMSPID=Org1MSP
|
||||
- CORE_PEER_TLS_ENABLED=true
|
||||
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.crt
|
||||
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key
|
||||
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
|
||||
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
|
||||
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
|
||||
command: /bin/bash
|
||||
volumes:
|
||||
- /var/run/:/host/var/run/
|
||||
- ./../chaincode/:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode
|
||||
- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
|
||||
- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
|
||||
- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
|
||||
depends_on:
|
||||
- orderer.example.com
|
||||
- peer0.org1.example.com
|
||||
- peer1.org1.example.com
|
||||
- peer0.org2.example.com
|
||||
- peer1.org2.example.com
|
||||
networks:
|
||||
- byfn
|
||||
118
hyperledger-fabric/first-network/docker-compose-couch.yaml
Normal file
118
hyperledger-fabric/first-network/docker-compose-couch.yaml
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
networks:
|
||||
byfn:
|
||||
|
||||
services:
|
||||
couchdb0:
|
||||
container_name: couchdb0
|
||||
image: couchdb:2.3
|
||||
# Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
|
||||
# for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode.
|
||||
environment:
|
||||
- COUCHDB_USER=
|
||||
- COUCHDB_PASSWORD=
|
||||
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
|
||||
# for example map it to utilize Fauxton User Interface in dev environments.
|
||||
ports:
|
||||
- "5984:5984"
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer0.org1.example.com:
|
||||
environment:
|
||||
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984
|
||||
# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
|
||||
# provide the credentials for ledger to connect to CouchDB. The username and password must
|
||||
# match the username and password set for the associated CouchDB.
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
|
||||
depends_on:
|
||||
- couchdb0
|
||||
|
||||
couchdb1:
|
||||
container_name: couchdb1
|
||||
image: couchdb:2.3
|
||||
# Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
|
||||
# for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode.
|
||||
environment:
|
||||
- COUCHDB_USER=
|
||||
- COUCHDB_PASSWORD=
|
||||
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
|
||||
# for example map it to utilize Fauxton User Interface in dev environments.
|
||||
ports:
|
||||
- "6984:5984"
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org1.example.com:
|
||||
environment:
|
||||
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb1:5984
|
||||
# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
|
||||
# provide the credentials for ledger to connect to CouchDB. The username and password must
|
||||
# match the username and password set for the associated CouchDB.
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
|
||||
depends_on:
|
||||
- couchdb1
|
||||
|
||||
couchdb2:
|
||||
container_name: couchdb2
|
||||
image: couchdb:2.3
|
||||
# Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
|
||||
# for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode.
|
||||
environment:
|
||||
- COUCHDB_USER=
|
||||
- COUCHDB_PASSWORD=
|
||||
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
|
||||
# for example map it to utilize Fauxton User Interface in dev environments.
|
||||
ports:
|
||||
- "7984:5984"
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer0.org2.example.com:
|
||||
environment:
|
||||
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb2:5984
|
||||
# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
|
||||
# provide the credentials for ledger to connect to CouchDB. The username and password must
|
||||
# match the username and password set for the associated CouchDB.
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
|
||||
depends_on:
|
||||
- couchdb2
|
||||
|
||||
couchdb3:
|
||||
container_name: couchdb3
|
||||
image: couchdb:2.3
|
||||
# Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password
|
||||
# for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode.
|
||||
environment:
|
||||
- COUCHDB_USER=
|
||||
- COUCHDB_PASSWORD=
|
||||
# Comment/Uncomment the port mapping if you want to hide/expose the CouchDB service,
|
||||
# for example map it to utilize Fauxton User Interface in dev environments.
|
||||
ports:
|
||||
- "8984:5984"
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org2.example.com:
|
||||
environment:
|
||||
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb3:5984
|
||||
# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
|
||||
# provide the credentials for ledger to connect to CouchDB. The username and password must
|
||||
# match the username and password set for the associated CouchDB.
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME=
|
||||
- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD=
|
||||
depends_on:
|
||||
- couchdb3
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
volumes:
|
||||
orderer.example.com:
|
||||
peer0.org1.example.com:
|
||||
peer1.org1.example.com:
|
||||
peer0.org2.example.com:
|
||||
peer1.org2.example.com:
|
||||
|
||||
networks:
|
||||
byfn:
|
||||
services:
|
||||
ca0:
|
||||
image: hyperledger/fabric-ca:$IMAGE_TAG
|
||||
environment:
|
||||
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
|
||||
- FABRIC_CA_SERVER_CA_NAME=ca-org1
|
||||
- FABRIC_CA_SERVER_TLS_ENABLED=true
|
||||
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
|
||||
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/CA1_PRIVATE_KEY
|
||||
ports:
|
||||
- "7054:7054"
|
||||
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/CA1_PRIVATE_KEY -b admin:adminpw -d'
|
||||
volumes:
|
||||
- ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
|
||||
container_name: ca_peerOrg1
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
ca1:
|
||||
image: hyperledger/fabric-ca:$IMAGE_TAG
|
||||
environment:
|
||||
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
|
||||
- FABRIC_CA_SERVER_CA_NAME=ca-org2
|
||||
- FABRIC_CA_SERVER_TLS_ENABLED=true
|
||||
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem
|
||||
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/CA2_PRIVATE_KEY
|
||||
ports:
|
||||
- "8054:7054"
|
||||
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/CA2_PRIVATE_KEY -b admin:adminpw -d'
|
||||
volumes:
|
||||
- ./crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
|
||||
container_name: ca_peerOrg2
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
orderer.example.com:
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: orderer.example.com
|
||||
container_name: orderer.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer0.org1.example.com:
|
||||
container_name: peer0.org1.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer0.org1.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org1.example.com:
|
||||
container_name: peer1.org1.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer1.org1.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer0.org2.example.com:
|
||||
container_name: peer0.org2.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer0.org2.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org2.example.com:
|
||||
container_name: peer1.org2.example.com
|
||||
extends:
|
||||
file: base/docker-compose-base.yaml
|
||||
service: peer1.org2.example.com
|
||||
networks:
|
||||
- byfn
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
volumes:
|
||||
orderer2.example.com:
|
||||
orderer3.example.com:
|
||||
orderer4.example.com:
|
||||
orderer5.example.com:
|
||||
|
||||
networks:
|
||||
byfn:
|
||||
|
||||
services:
|
||||
|
||||
orderer2.example.com:
|
||||
extends:
|
||||
file: base/peer-base.yaml
|
||||
service: orderer-base
|
||||
environment:
|
||||
- ORDERER_GENERAL_LISTENPORT=8050
|
||||
container_name: orderer2.example.com
|
||||
networks:
|
||||
- byfn
|
||||
volumes:
|
||||
- ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/msp:/var/hyperledger/orderer/msp
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/:/var/hyperledger/orderer/tls
|
||||
- orderer2.example.com:/var/hyperledger/production/orderer
|
||||
ports:
|
||||
- 8050:8050
|
||||
|
||||
orderer3.example.com:
|
||||
extends:
|
||||
file: base/peer-base.yaml
|
||||
service: orderer-base
|
||||
environment:
|
||||
- ORDERER_GENERAL_LISTENPORT=9050
|
||||
container_name: orderer3.example.com
|
||||
networks:
|
||||
- byfn
|
||||
volumes:
|
||||
- ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/msp:/var/hyperledger/orderer/msp
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/:/var/hyperledger/orderer/tls
|
||||
- orderer3.example.com:/var/hyperledger/production/orderer
|
||||
ports:
|
||||
- 9050:9050
|
||||
|
||||
orderer4.example.com:
|
||||
extends:
|
||||
file: base/peer-base.yaml
|
||||
service: orderer-base
|
||||
environment:
|
||||
- ORDERER_GENERAL_LISTENPORT=10050
|
||||
container_name: orderer4.example.com
|
||||
networks:
|
||||
- byfn
|
||||
volumes:
|
||||
- ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/msp:/var/hyperledger/orderer/msp
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/:/var/hyperledger/orderer/tls
|
||||
- orderer4.example.com:/var/hyperledger/production/orderer
|
||||
ports:
|
||||
- 10050:10050
|
||||
|
||||
orderer5.example.com:
|
||||
extends:
|
||||
file: base/peer-base.yaml
|
||||
service: orderer-base
|
||||
environment:
|
||||
- ORDERER_GENERAL_LISTENPORT=11050
|
||||
container_name: orderer5.example.com
|
||||
networks:
|
||||
- byfn
|
||||
volumes:
|
||||
- ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer5.example.com/msp:/var/hyperledger/orderer/msp
|
||||
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer5.example.com/tls/:/var/hyperledger/orderer/tls
|
||||
- orderer5.example.com:/var/hyperledger/production/orderer
|
||||
ports:
|
||||
- 11050:11050
|
||||
97
hyperledger-fabric/first-network/docker-compose-org3.yaml
Normal file
97
hyperledger-fabric/first-network/docker-compose-org3.yaml
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
version: '2'
|
||||
|
||||
volumes:
|
||||
peer0.org3.example.com:
|
||||
peer1.org3.example.com:
|
||||
|
||||
networks:
|
||||
byfn:
|
||||
|
||||
services:
|
||||
|
||||
peer0.org3.example.com:
|
||||
container_name: peer0.org3.example.com
|
||||
extends:
|
||||
file: base/peer-base.yaml
|
||||
service: peer-base
|
||||
environment:
|
||||
- CORE_PEER_ID=peer0.org3.example.com
|
||||
- CORE_PEER_ADDRESS=peer0.org3.example.com:11051
|
||||
- CORE_PEER_LISTENADDRESS=0.0.0.0:11051
|
||||
- CORE_PEER_CHAINCODEADDRESS=peer0.org3.example.com:11052
|
||||
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:11052
|
||||
- CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org3.example.com:12051
|
||||
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org3.example.com:11051
|
||||
- CORE_PEER_LOCALMSPID=Org3MSP
|
||||
volumes:
|
||||
- /var/run/:/host/var/run/
|
||||
- ./org3-artifacts/crypto-config/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/msp:/etc/hyperledger/fabric/msp
|
||||
- ./org3-artifacts/crypto-config/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls:/etc/hyperledger/fabric/tls
|
||||
- peer0.org3.example.com:/var/hyperledger/production
|
||||
ports:
|
||||
- 11051:11051
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
peer1.org3.example.com:
|
||||
container_name: peer1.org3.example.com
|
||||
extends:
|
||||
file: base/peer-base.yaml
|
||||
service: peer-base
|
||||
environment:
|
||||
- CORE_PEER_ID=peer1.org3.example.com
|
||||
- CORE_PEER_ADDRESS=peer1.org3.example.com:12051
|
||||
- CORE_PEER_LISTENADDRESS=0.0.0.0:12051
|
||||
- CORE_PEER_CHAINCODEADDRESS=peer1.org3.example.com:12052
|
||||
- CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:12052
|
||||
- CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org3.example.com:11051
|
||||
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org3.example.com:12051
|
||||
- CORE_PEER_LOCALMSPID=Org3MSP
|
||||
volumes:
|
||||
- /var/run/:/host/var/run/
|
||||
- ./org3-artifacts/crypto-config/peerOrganizations/org3.example.com/peers/peer1.org3.example.com/msp:/etc/hyperledger/fabric/msp
|
||||
- ./org3-artifacts/crypto-config/peerOrganizations/org3.example.com/peers/peer1.org3.example.com/tls:/etc/hyperledger/fabric/tls
|
||||
- peer1.org3.example.com:/var/hyperledger/production
|
||||
ports:
|
||||
- 12051:12051
|
||||
networks:
|
||||
- byfn
|
||||
|
||||
|
||||
Org3cli:
|
||||
container_name: Org3cli
|
||||
image: hyperledger/fabric-tools:$IMAGE_TAG
|
||||
tty: true
|
||||
stdin_open: true
|
||||
environment:
|
||||
- GOPATH=/opt/gopath
|
||||
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
|
||||
- FABRIC_LOGGING_SPEC=INFO
|
||||
#- FABRIC_LOGGING_SPEC=DEBUG
|
||||
- CORE_PEER_ID=Org3cli
|
||||
- CORE_PEER_ADDRESS=peer0.org3.example.com:11051
|
||||
- CORE_PEER_LOCALMSPID=Org3MSP
|
||||
- CORE_PEER_TLS_ENABLED=true
|
||||
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/server.crt
|
||||
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/server.key
|
||||
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
|
||||
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp
|
||||
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
|
||||
command: /bin/bash
|
||||
volumes:
|
||||
- /var/run/:/host/var/run/
|
||||
- ./../chaincode/:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode
|
||||
- ./org3-artifacts/crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
|
||||
- ./crypto-config/peerOrganizations/org1.example.com:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com
|
||||
- ./crypto-config/peerOrganizations/org2.example.com:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com
|
||||
- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
|
||||
depends_on:
|
||||
- peer0.org3.example.com
|
||||
- peer1.org3.example.com
|
||||
networks:
|
||||
- byfn
|
||||
5
hyperledger-fabric/first-network/env.sh
Executable file
5
hyperledger-fabric/first-network/env.sh
Executable file
|
|
@ -0,0 +1,5 @@
|
|||
#!/bin/sh
|
||||
|
||||
export FABRIC_CFG_PATH=$PWD/../config/
|
||||
export PATH=${PWD}/../bin:${PWD}:$PATH
|
||||
|
||||
BIN
hyperledger-fabric/first-network/fhir-data.tar.gz
Normal file
BIN
hyperledger-fabric/first-network/fhir-data.tar.gz
Normal file
Binary file not shown.
31
hyperledger-fabric/first-network/monitordocker.sh
Executable file
31
hyperledger-fabric/first-network/monitordocker.sh
Executable file
|
|
@ -0,0 +1,31 @@
|
|||
#!/bin/bash
|
||||
|
||||
# This script uses the logspout and http stream tools to let you watch the docker containers
|
||||
# in action.
|
||||
#
|
||||
# More information at https://github.com/gliderlabs/logspout/tree/master/httpstream
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
DOCKER_NETWORK=basicnetwork_basic
|
||||
else
|
||||
DOCKER_NETWORK="$1"
|
||||
fi
|
||||
|
||||
if [ -z "$2" ]; then
|
||||
PORT=8000
|
||||
else
|
||||
PORT="$2"
|
||||
fi
|
||||
|
||||
echo Starting monitoring on all containers on the network ${DOCKER_NETWORK}
|
||||
|
||||
docker kill logspout 2> /dev/null 1>&2 || true
|
||||
docker rm logspout 2> /dev/null 1>&2 || true
|
||||
|
||||
docker run -d --name="logspout" \
|
||||
--volume=/var/run/docker.sock:/var/run/docker.sock \
|
||||
--publish=127.0.0.1:${PORT}:80 \
|
||||
--network ${DOCKER_NETWORK} \
|
||||
gliderlabs/logspout
|
||||
sleep 3
|
||||
curl http://127.0.0.1:${PORT}/logs
|
||||
8
hyperledger-fabric/first-network/scripts/org1.sh
Executable file
8
hyperledger-fabric/first-network/scripts/org1.sh
Executable file
|
|
@ -0,0 +1,8 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Environment variables for PEER0 in Org1
|
||||
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
|
||||
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
|
||||
CORE_PEER_LOCALMSPID="Org1MSP"
|
||||
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
|
||||
|
||||
8
hyperledger-fabric/first-network/scripts/org2.sh
Executable file
8
hyperledger-fabric/first-network/scripts/org2.sh
Executable file
|
|
@ -0,0 +1,8 @@
|
|||
#!/bin/sh
|
||||
|
||||
# Environment variables for PEER0 in Org2
|
||||
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
|
||||
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
|
||||
CORE_PEER_LOCALMSPID="Org2MSP"
|
||||
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
|
||||
|
||||
184
hyperledger-fabric/first-network/scripts/script.sh
Executable file
184
hyperledger-fabric/first-network/scripts/script.sh
Executable file
|
|
@ -0,0 +1,184 @@
|
|||
#!/bin/bash
|
||||
|
||||
echo
|
||||
echo " ____ _____ _ ____ _____ "
|
||||
echo "/ ___| |_ _| / \ | _ \ |_ _|"
|
||||
echo "\___ \ | | / _ \ | |_) | | | "
|
||||
echo " ___) | | | / ___ \ | _ < | | "
|
||||
echo "|____/ |_| /_/ \_\ |_| \_\ |_| "
|
||||
echo
|
||||
echo "Build your first network (BYFN) end-to-end test"
|
||||
echo
|
||||
CHANNEL_NAME="$1"
|
||||
DELAY="$2"
|
||||
CC_SRC_LANGUAGE="$3"
|
||||
TIMEOUT="$4"
|
||||
VERBOSE="$5"
|
||||
NO_CHAINCODE="$6"
|
||||
CC_SRC_PATH="$7"
|
||||
CC_NAME="$8"
|
||||
VERSION="$9"
|
||||
: ${CHANNEL_NAME:="mychannel"}
|
||||
: ${DELAY:="3"}
|
||||
: ${CC_SRC_LANGUAGE:="go"}
|
||||
: ${TIMEOUT:="10"}
|
||||
: ${VERBOSE:="false"}
|
||||
: ${NO_CHAINCODE:="false"}
|
||||
: ${CC_NAME:="mycc"}
|
||||
: ${VERSION:="1"}
|
||||
CC_SRC_LANGUAGE=`echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:]`
|
||||
COUNTER=1
|
||||
MAX_RETRY=20
|
||||
PACKAGE_ID=""
|
||||
|
||||
echo "script.sh inputs: "$1 $2 $3 $4 $5 $6 $7 $8 $9
|
||||
|
||||
# set chaincode runtime language
|
||||
if [ "$CC_SRC_LANGUAGE" = "go" -o "$CC_SRC_LANGUAGE" = "golang" ]; then
|
||||
CC_RUNTIME_LANGUAGE=golang
|
||||
elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node # chaincode runtime language is node.js
|
||||
elif [ "$CC_SRC_LANGUAGE" = "java" ]; then
|
||||
CC_RUNTIME_LANGUAGE=java
|
||||
else
|
||||
echo The chaincode language ${CC_SRC_LANGUAGE} is not supported by this script
|
||||
echo Supported chaincode languages are: go, javascript, java
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# set chaincode src path to use default contract, if not provided
|
||||
if [-z "$CC_SRC_PATH"]; then
|
||||
if [ "$CC_SRC_LANGUAGE" = "go" -o "$CC_SRC_LANGUAGE" = "golang" ]; then
|
||||
CC_SRC_PATH="github.com/hyperledger/fabric-samples/chaincode/abstore/go/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/javascript/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "java" ]; then
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/java/"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Channel name : "$CHANNEL_NAME
|
||||
|
||||
# import utils
|
||||
. scripts/utils.sh
|
||||
|
||||
createChannel() {
|
||||
setGlobals 0 1
|
||||
|
||||
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
||||
set -x
|
||||
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
else
|
||||
set -x
|
||||
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
fi
|
||||
cat log.txt
|
||||
verifyResult $res "Channel creation failed"
|
||||
echo "===================== Channel '$CHANNEL_NAME' created ===================== "
|
||||
echo
|
||||
}
|
||||
|
||||
joinChannel () {
|
||||
for org in 1 2; do
|
||||
for peer in 0 1; do
|
||||
joinChannelWithRetry $peer $org
|
||||
echo "===================== peer${peer}.org${org} joined channel '$CHANNEL_NAME' ===================== "
|
||||
sleep $DELAY
|
||||
echo
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
## Create channel
|
||||
echo "Creating channel..."
|
||||
createChannel
|
||||
|
||||
## Join all the peers to the channel
|
||||
echo "Having all peers join the channel..."
|
||||
joinChannel
|
||||
|
||||
## Set the anchor peers for each org in the channel
|
||||
echo "Updating anchor peers for org1..."
|
||||
updateAnchorPeers 0 1
|
||||
echo "Updating anchor peers for org2..."
|
||||
updateAnchorPeers 0 2
|
||||
|
||||
if [ "${NO_CHAINCODE}" != "true" ]; then
|
||||
|
||||
## at first we package the chaincode
|
||||
packageChaincode "${VERSION}" 0 1
|
||||
|
||||
## Install chaincode on peer0.org1 and peer0.org2
|
||||
echo "Installing chaincode on peer0.org1..."
|
||||
installChaincode 0 1
|
||||
echo "Install chaincode on peer0.org2..."
|
||||
installChaincode 0 2
|
||||
|
||||
## query whether the chaincode is installed
|
||||
queryInstalled 0 1
|
||||
|
||||
## approve the definition for org1
|
||||
approveForMyOrg "${VERSION}" 0 1
|
||||
|
||||
## check whether the chaincode definition is ready to be committed
|
||||
## expect org1 to have approved and org2 not to
|
||||
checkCommitReadiness 1 0 1 "\"Org1MSP\": true" "\"Org2MSP\": false"
|
||||
checkCommitReadiness 1 0 2 "\"Org1MSP\": true" "\"Org2MSP\": false"
|
||||
|
||||
## now approve also for org2
|
||||
approveForMyOrg "${VERSION}" 0 2
|
||||
|
||||
## check whether the chaincode definition is ready to be committed
|
||||
## expect them both to have approved
|
||||
checkCommitReadiness "${VERSION}" 0 1 "\"Org1MSP\": true" "\"Org2MSP\": true"
|
||||
checkCommitReadiness "${VERSION}" 0 2 "\"Org1MSP\": true" "\"Org2MSP\": true"
|
||||
|
||||
## now that we know for sure both orgs have approved, commit the definition
|
||||
commitChaincodeDefinition "${VERSION}" 0 1 0 2
|
||||
|
||||
## query on both orgs to see that the definition committed successfully
|
||||
queryCommitted "${VERSION}" 0 1
|
||||
queryCommitted "${VERSION}" 0 2
|
||||
|
||||
# invoke init
|
||||
#chaincodeInvoke 1 0 1 0 2
|
||||
|
||||
# Query chaincode on peer0.org1
|
||||
# echo "Querying chaincode on peer0.org1..."
|
||||
# chaincodeQuery 0 1 100
|
||||
|
||||
# Invoke chaincode on peer0.org1 and peer0.org2
|
||||
# echo "Sending invoke transaction on peer0.org1 peer0.org2..."
|
||||
# chaincodeInvoke 0 0 1 0 2
|
||||
|
||||
# Query chaincode on peer0.org1
|
||||
# echo "Querying chaincode on peer0.org1..."
|
||||
# chaincodeQuery 0 1 90
|
||||
|
||||
## Install chaincode on peer1.org2
|
||||
echo "Installing chaincode on peer1.org2..."
|
||||
installChaincode 1 2
|
||||
|
||||
# Query on chaincode on peer1.org2, check if the result is 90
|
||||
# echo "Querying chaincode on peer1.org2..."
|
||||
# chaincodeQuery 1 2 90
|
||||
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "========= All GOOD, BYFN execution completed =========== "
|
||||
echo
|
||||
|
||||
echo
|
||||
echo " _____ _ _ ____ "
|
||||
echo "| ____| | \ | | | _ \ "
|
||||
echo "| _| | \| | | | | | "
|
||||
echo "| |___ | |\ | | |_| | "
|
||||
echo "|_____| |_| \_| |____/ "
|
||||
echo
|
||||
|
||||
exit 0
|
||||
81
hyperledger-fabric/first-network/scripts/step1org3.sh
Executable file
81
hyperledger-fabric/first-network/scripts/step1org3.sh
Executable file
|
|
@ -0,0 +1,81 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# This script is designed to be run in the org3cli container as the
|
||||
# first step of the EYFN tutorial. It creates and submits a
|
||||
# configuration transaction to add org3 to the network previously
|
||||
# setup in the BYFN tutorial.
|
||||
#
|
||||
|
||||
CHANNEL_NAME="$1"
|
||||
DELAY="$2"
|
||||
CC_SRC_LANGUAGE="$3"
|
||||
TIMEOUT="$4"
|
||||
VERBOSE="$5"
|
||||
: ${CHANNEL_NAME:="mychannel"}
|
||||
: ${DELAY:="3"}
|
||||
: ${CC_SRC_LANGUAGE:="go"}
|
||||
: ${TIMEOUT:="10"}
|
||||
: ${VERBOSE:="false"}
|
||||
CC_SRC_LANGUAGE=`echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:]`
|
||||
COUNTER=1
|
||||
MAX_RETRY=5
|
||||
|
||||
if [ "$CC_SRC_LANGUAGE" = "go" -o "$CC_SRC_LANGUAGE" = "golang" ]; then
|
||||
CC_RUNTIME_LANGUAGE=golang
|
||||
CC_SRC_PATH="github.com/hyperledger/fabric-samples/chaincode/abstore/go/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node # chaincode runtime language is node.js
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/javascript/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "java" ]; then
|
||||
CC_RUNTIME_LANGUAGE=java
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/java/"
|
||||
else
|
||||
echo The chaincode language ${CC_SRC_LANGUAGE} is not supported by this script
|
||||
echo Supported chaincode languages are: go, javascript, java
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# import utils
|
||||
. scripts/utils.sh
|
||||
|
||||
echo
|
||||
echo "========= Creating config transaction to add org3 to network =========== "
|
||||
echo
|
||||
|
||||
# Fetch the config for the channel, writing it to config.json
|
||||
fetchChannelConfig ${CHANNEL_NAME} config.json
|
||||
|
||||
# Modify the configuration to append the new org
|
||||
set -x
|
||||
jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' config.json ./channel-artifacts/org3.json > modified_config.json
|
||||
set +x
|
||||
|
||||
# Compute a config update, based on the differences between config.json and modified_config.json, write it as a transaction to org3_update_in_envelope.pb
|
||||
createConfigUpdate ${CHANNEL_NAME} config.json modified_config.json org3_update_in_envelope.pb
|
||||
|
||||
echo
|
||||
echo "========= Config transaction to add org3 to network created ===== "
|
||||
echo
|
||||
|
||||
echo "Signing config transaction"
|
||||
echo
|
||||
signConfigtxAsPeerOrg 1 org3_update_in_envelope.pb
|
||||
|
||||
echo
|
||||
echo "========= Submitting transaction from a different peer (peer0.org2) which also signs it ========= "
|
||||
echo
|
||||
setGlobals 0 2
|
||||
set -x
|
||||
peer channel update -f org3_update_in_envelope.pb -c ${CHANNEL_NAME} -o orderer.example.com:7050 --tls --cafile ${ORDERER_CA}
|
||||
set +x
|
||||
|
||||
echo
|
||||
echo "========= Config transaction to add org3 to network submitted! =========== "
|
||||
echo
|
||||
|
||||
exit 0
|
||||
86
hyperledger-fabric/first-network/scripts/step2org3.sh
Executable file
86
hyperledger-fabric/first-network/scripts/step2org3.sh
Executable file
|
|
@ -0,0 +1,86 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# This script is designed to be run in the org3cli container as the
|
||||
# second step of the EYFN tutorial. It joins the org3 peers to the
|
||||
# channel previously setup in the BYFN tutorial and install the
|
||||
# chaincode as version 2.0 on peer0.org3.
|
||||
#
|
||||
|
||||
echo
|
||||
echo "========= Getting Org3 on to your first network ========= "
|
||||
echo
|
||||
CHANNEL_NAME="$1"
|
||||
DELAY="$2"
|
||||
CC_SRC_LANGUAGE="$3"
|
||||
TIMEOUT="$4"
|
||||
VERBOSE="$5"
|
||||
: ${CHANNEL_NAME:="mychannel"}
|
||||
: ${DELAY:="3"}
|
||||
: ${CC_SRC_LANGUAGE:="go"}
|
||||
: ${TIMEOUT:="10"}
|
||||
: ${VERBOSE:="false"}
|
||||
CC_SRC_LANGUAGE=`echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:]`
|
||||
COUNTER=1
|
||||
MAX_RETRY=5
|
||||
PACKAGE_ID=""
|
||||
|
||||
if [ "$CC_SRC_LANGUAGE" = "go" -o "$CC_SRC_LANGUAGE" = "golang" ]; then
|
||||
CC_RUNTIME_LANGUAGE=golang
|
||||
CC_SRC_PATH="github.com/hyperledger/fabric-samples/chaincode/abstore/go/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node # chaincode runtime language is node.js
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/javascript/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "java" ]; then
|
||||
CC_RUNTIME_LANGUAGE=java
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/java/"
|
||||
else
|
||||
echo The chaincode language ${CC_SRC_LANGUAGE} is not supported by this script
|
||||
echo Supported chaincode languages are: go, javascript, java
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# import utils
|
||||
. scripts/utils.sh
|
||||
|
||||
echo "Fetching channel config block from orderer..."
|
||||
set -x
|
||||
peer channel fetch 0 $CHANNEL_NAME.block -o orderer.example.com:7050 -c $CHANNEL_NAME --tls --cafile $ORDERER_CA >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
cat log.txt
|
||||
verifyResult $res "Fetching config block from orderer has Failed"
|
||||
|
||||
joinChannelWithRetry 0 3
|
||||
echo "===================== peer0.org3 joined channel '$CHANNEL_NAME' ===================== "
|
||||
joinChannelWithRetry 1 3
|
||||
echo "===================== peer1.org3 joined channel '$CHANNEL_NAME' ===================== "
|
||||
|
||||
## at first we package the chaincode
|
||||
packageChaincode 1 0 3
|
||||
|
||||
echo "Installing chaincode on peer0.org3..."
|
||||
installChaincode 0 3
|
||||
|
||||
## query whether the chaincode is installed
|
||||
queryInstalled 0 3
|
||||
|
||||
## sanity check: expect the chaincode to be already committed
|
||||
queryCommitted 1 0 3
|
||||
|
||||
## approve it for our org, so that our peers know what package to invoke
|
||||
approveForMyOrg 1 0 3
|
||||
|
||||
# Query on chaincode on peer0.org3, check if the result is 90
|
||||
echo "Querying chaincode on peer0.org3..."
|
||||
chaincodeQuery 0 3 90
|
||||
|
||||
echo
|
||||
echo "========= Finished adding Org3 to your first network! ========= "
|
||||
echo
|
||||
|
||||
exit 0
|
||||
89
hyperledger-fabric/first-network/scripts/testorg3.sh
Executable file
89
hyperledger-fabric/first-network/scripts/testorg3.sh
Executable file
|
|
@ -0,0 +1,89 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Copyright IBM Corp. All Rights Reserved.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# This script is designed to be run in the org3cli container as the
|
||||
# final step of the EYFN tutorial. It simply issues a couple of
|
||||
# chaincode requests through the org3 peers to check that org3 was
|
||||
# properly added to the network previously setup in the BYFN tutorial.
|
||||
#
|
||||
|
||||
echo
|
||||
echo " ____ _____ _ ____ _____ "
|
||||
echo "/ ___| |_ _| / \ | _ \ |_ _|"
|
||||
echo "\___ \ | | / _ \ | |_) | | | "
|
||||
echo " ___) | | | / ___ \ | _ < | | "
|
||||
echo "|____/ |_| /_/ \_\ |_| \_\ |_| "
|
||||
echo
|
||||
echo "Extend your first network (EYFN) test"
|
||||
echo
|
||||
CHANNEL_NAME="$1"
|
||||
DELAY="$2"
|
||||
CC_SRC_LANGUAGE="$3"
|
||||
TIMEOUT="$4"
|
||||
VERBOSE="$5"
|
||||
: ${CHANNEL_NAME:="mychannel"}
|
||||
: ${TIMEOUT:="10"}
|
||||
: ${CC_SRC_LANGUAGE:="go"}
|
||||
: ${VERBOSE:="false"}
|
||||
CC_SRC_LANGUAGE=`echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:]`
|
||||
COUNTER=1
|
||||
MAX_RETRY=5
|
||||
|
||||
if [ "$CC_SRC_LANGUAGE" = "go" -o "$CC_SRC_LANGUAGE" = "golang" ]; then
|
||||
CC_RUNTIME_LANGUAGE=golang
|
||||
CC_SRC_PATH="github.com/hyperledger/fabric-samples/chaincode/abstore/go/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node # chaincode runtime language is node.js
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/javascript/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "java" ]; then
|
||||
CC_RUNTIME_LANGUAGE=java
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/java/"
|
||||
else
|
||||
echo The chaincode language ${CC_SRC_LANGUAGE} is not supported by this script
|
||||
echo Supported chaincode languages are: go, javascript, java
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Channel name : "$CHANNEL_NAME
|
||||
|
||||
# import functions
|
||||
. scripts/utils.sh
|
||||
|
||||
# Query chaincode on peer0.org3, check if the result is 90
|
||||
echo "Querying chaincode on peer0.org3..."
|
||||
chaincodeQuery 0 3 90
|
||||
|
||||
# Invoke chaincode on peer0.org1 and peer0.org3
|
||||
echo "Sending invoke transaction on peer0.org1 peer0.org3..."
|
||||
chaincodeInvoke 0 0 1 0 3
|
||||
|
||||
# Query on chaincode on peer0.org3, peer0.org2, peer0.org1 check if the result is 80
|
||||
# We query a peer in each organization, to ensure peers from all organizations are in sync
|
||||
# and there is no state fork between organizations.
|
||||
echo "Querying chaincode on peer0.org3..."
|
||||
chaincodeQuery 0 3 80
|
||||
|
||||
echo "Querying chaincode on peer0.org2..."
|
||||
chaincodeQuery 0 2 80
|
||||
|
||||
echo "Querying chaincode on peer0.org1..."
|
||||
chaincodeQuery 0 1 80
|
||||
|
||||
|
||||
echo
|
||||
echo "========= All GOOD, EYFN test execution completed =========== "
|
||||
echo
|
||||
|
||||
echo
|
||||
echo " _____ _ _ ____ "
|
||||
echo "| ____| | \ | | | _ \ "
|
||||
echo "| _| | \| | | | | | "
|
||||
echo "| |___ | |\ | | |_| | "
|
||||
echo "|_____| |_| \_| |____/ "
|
||||
echo
|
||||
|
||||
exit 0
|
||||
76
hyperledger-fabric/first-network/scripts/upgrade_to_v14.sh
Executable file
76
hyperledger-fabric/first-network/scripts/upgrade_to_v14.sh
Executable file
|
|
@ -0,0 +1,76 @@
|
|||
#!/bin/bash
|
||||
|
||||
echo
|
||||
echo " ____ _____ _ ____ _____ "
|
||||
echo "/ ___| |_ _| / \ | _ \ |_ _|"
|
||||
echo "\___ \ | | / _ \ | |_) | | | "
|
||||
echo " ___) | | | / ___ \ | _ < | | "
|
||||
echo "|____/ |_| /_/ \_\ |_| \_\ |_| "
|
||||
echo
|
||||
echo "Upgrade your first network (BYFN) from v1.3.x to v1.4.x end-to-end test"
|
||||
echo
|
||||
CHANNEL_NAME="$1"
|
||||
DELAY="$2"
|
||||
CC_SRC_LANGUAGE="$3"
|
||||
TIMEOUT="$4"
|
||||
VERBOSE="$5"
|
||||
: ${CHANNEL_NAME:="mychannel"}
|
||||
: ${DELAY:="5"}
|
||||
: ${CC_SRC_LANGUAGE:="go"}
|
||||
: ${TIMEOUT:="10"}
|
||||
: ${VERBOSE:="false"}
|
||||
CC_SRC_LANGUAGE=$(echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:])
|
||||
COUNTER=1
|
||||
MAX_RETRY=5
|
||||
|
||||
if [ "$CC_SRC_LANGUAGE" = "go" -o "$CC_SRC_LANGUAGE" = "golang" ]; then
|
||||
CC_RUNTIME_LANGUAGE=golang
|
||||
CC_SRC_PATH="github.com/hyperledger/fabric-samples/chaincode/abstore/go/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then
|
||||
CC_RUNTIME_LANGUAGE=node # chaincode runtime language is node.js
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/javascript/"
|
||||
elif [ "$CC_SRC_LANGUAGE" = "java" ]; then
|
||||
CC_RUNTIME_LANGUAGE=java
|
||||
CC_SRC_PATH="/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abstore/java/"
|
||||
else
|
||||
echo The chaincode language ${CC_SRC_LANGUAGE} is not supported by this script
|
||||
echo Supported chaincode languages are: go, javascript, java
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Channel name : "$CHANNEL_NAME
|
||||
|
||||
# import utils
|
||||
. scripts/utils.sh
|
||||
|
||||
sleep $DELAY
|
||||
|
||||
#Query on chaincode on Peer0/Org1
|
||||
echo "Querying chaincode on org1/peer0..."
|
||||
chaincodeQuery 0 1 90
|
||||
|
||||
sleep $DELAY
|
||||
|
||||
#Invoke on chaincode on Peer0/Org1
|
||||
echo "Sending invoke transaction on org1/peer0..."
|
||||
chaincodeInvoke 0 1 0 2
|
||||
|
||||
sleep $DELAY
|
||||
|
||||
#Query on chaincode on Peer0/Org1
|
||||
echo "Querying chaincode on org1/peer0..."
|
||||
chaincodeQuery 0 1 80
|
||||
|
||||
echo
|
||||
echo "===================== All GOOD, End-2-End UPGRADE Scenario execution completed ===================== "
|
||||
echo
|
||||
|
||||
echo
|
||||
echo " _____ _ _ ____ _____ ____ _____ "
|
||||
echo "| ____| | \ | | | _ \ | ____| |___ \ | ____|"
|
||||
echo "| _| | \| | | | | | _____ | _| __) | | _| "
|
||||
echo "| |___ | |\ | | |_| | |_____| | |___ / __/ | |___ "
|
||||
echo "|_____| |_| \_| |____/ |_____| |_____| |_____|"
|
||||
echo
|
||||
|
||||
exit 0
|
||||
451
hyperledger-fabric/first-network/scripts/utils.sh
Executable file
451
hyperledger-fabric/first-network/scripts/utils.sh
Executable file
|
|
@ -0,0 +1,451 @@
|
|||
#
|
||||
# Copyright IBM Corp All Rights Reserved
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
# This is a collection of bash functions used by different scripts
|
||||
|
||||
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
|
||||
PEER0_ORG1_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
|
||||
PEER0_ORG2_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
|
||||
PEER0_ORG3_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
|
||||
|
||||
# verify the result of the end-to-end test
|
||||
verifyResult() {
|
||||
if [ $1 -ne 0 ]; then
|
||||
echo "!!!!!!!!!!!!!!! "$2" !!!!!!!!!!!!!!!!"
|
||||
echo "========= ERROR !!! FAILED to execute End-2-End Scenario ==========="
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Set OrdererOrg.Admin globals
|
||||
setOrdererGlobals() {
|
||||
CORE_PEER_LOCALMSPID="OrdererMSP"
|
||||
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
|
||||
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/users/Admin@example.com/msp
|
||||
}
|
||||
|
||||
setGlobals() {
|
||||
PEER=$1
|
||||
ORG=$2
|
||||
if [ $ORG -eq 1 ]; then
|
||||
CORE_PEER_LOCALMSPID="Org1MSP"
|
||||
CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG1_CA
|
||||
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
|
||||
if [ $PEER -eq 0 ]; then
|
||||
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
|
||||
else
|
||||
CORE_PEER_ADDRESS=peer1.org1.example.com:8051
|
||||
fi
|
||||
elif [ $ORG -eq 2 ]; then
|
||||
CORE_PEER_LOCALMSPID="Org2MSP"
|
||||
CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG2_CA
|
||||
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
|
||||
if [ $PEER -eq 0 ]; then
|
||||
CORE_PEER_ADDRESS=peer0.org2.example.com:9051
|
||||
else
|
||||
CORE_PEER_ADDRESS=peer1.org2.example.com:10051
|
||||
fi
|
||||
|
||||
elif [ $ORG -eq 3 ]; then
|
||||
CORE_PEER_LOCALMSPID="Org3MSP"
|
||||
CORE_PEER_TLS_ROOTCERT_FILE=$PEER0_ORG3_CA
|
||||
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp
|
||||
if [ $PEER -eq 0 ]; then
|
||||
CORE_PEER_ADDRESS=peer0.org3.example.com:11051
|
||||
else
|
||||
CORE_PEER_ADDRESS=peer1.org3.example.com:12051
|
||||
fi
|
||||
else
|
||||
echo "================== ERROR !!! ORG Unknown =================="
|
||||
fi
|
||||
|
||||
if [ "$VERBOSE" == "true" ]; then
|
||||
env | grep CORE
|
||||
fi
|
||||
}
|
||||
|
||||
updateAnchorPeers() {
|
||||
PEER=$1
|
||||
ORG=$2
|
||||
setGlobals $PEER $ORG
|
||||
|
||||
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
||||
set -x
|
||||
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
else
|
||||
set -x
|
||||
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
fi
|
||||
cat log.txt
|
||||
verifyResult $res "Anchor peer update failed"
|
||||
echo "===================== Anchor peers updated for org '$CORE_PEER_LOCALMSPID' on channel '$CHANNEL_NAME' ===================== "
|
||||
sleep $DELAY
|
||||
echo
|
||||
}
|
||||
|
||||
## Sometimes Join takes time hence RETRY at least 5 times
|
||||
joinChannelWithRetry() {
|
||||
PEER=$1
|
||||
ORG=$2
|
||||
setGlobals $PEER $ORG
|
||||
|
||||
set -x
|
||||
peer channel join -b $CHANNEL_NAME.block >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
cat log.txt
|
||||
if [ $res -ne 0 -a $COUNTER -lt $MAX_RETRY ]; then
|
||||
COUNTER=$(expr $COUNTER + 1)
|
||||
echo "peer${PEER}.org${ORG} failed to join the channel, Retry after $DELAY seconds"
|
||||
sleep $DELAY
|
||||
joinChannelWithRetry $PEER $ORG
|
||||
else
|
||||
COUNTER=1
|
||||
fi
|
||||
verifyResult $res "After $MAX_RETRY attempts, peer${PEER}.org${ORG} has failed to join channel '$CHANNEL_NAME' "
|
||||
}
|
||||
|
||||
# packageChaincode VERSION PEER ORG
|
||||
packageChaincode() {
|
||||
VERSION=$1
|
||||
PEER=$2
|
||||
ORG=$3
|
||||
setGlobals $PEER $ORG
|
||||
set -x
|
||||
peer lifecycle chaincode package ${CC_NAME}.tar.gz --path ${CC_SRC_PATH} --lang ${CC_RUNTIME_LANGUAGE} --label ${CC_NAME}_${VERSION} >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
cat log.txt
|
||||
verifyResult $res "Chaincode packaging on peer${PEER}.org${ORG} has failed"
|
||||
echo "===================== Chaincode is packaged on peer${PEER}.org${ORG} ===================== "
|
||||
echo
|
||||
}
|
||||
|
||||
# installChaincode PEER ORG
|
||||
installChaincode() {
|
||||
PEER=$1
|
||||
ORG=$2
|
||||
setGlobals $PEER $ORG
|
||||
set -x
|
||||
peer lifecycle chaincode install ${CC_NAME}.tar.gz >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
cat log.txt
|
||||
verifyResult $res "Chaincode installation on peer${PEER}.org${ORG} has failed"
|
||||
echo "===================== Chaincode is installed on peer${PEER}.org${ORG} ===================== "
|
||||
echo
|
||||
}
|
||||
|
||||
# queryInstalled PEER ORG
|
||||
queryInstalled() {
|
||||
PEER=$1
|
||||
ORG=$2
|
||||
setGlobals $PEER $ORG
|
||||
set -x
|
||||
peer lifecycle chaincode queryinstalled >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
cat log.txt
|
||||
PACKAGE_ID=`sed -n '/Package/{s/^Package ID: //; s/, Label:.*$//; p;}' log.txt`
|
||||
verifyResult $res "Query installed on peer${PEER}.org${ORG} has failed"
|
||||
echo PackageID is ${PACKAGE_ID}
|
||||
echo "===================== Query installed successful on peer${PEER}.org${ORG} on channel ===================== "
|
||||
echo
|
||||
}
|
||||
|
||||
# approveForMyOrg VERSION PEER ORG
|
||||
approveForMyOrg() {
|
||||
VERSION=$1
|
||||
PEER=$2
|
||||
ORG=$3
|
||||
setGlobals $PEER $ORG
|
||||
|
||||
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
||||
set -x
|
||||
peer lifecycle chaincode approveformyorg --channelID $CHANNEL_NAME --name ${CC_NAME} --version ${VERSION} --init-required --package-id ${PACKAGE_ID} --sequence ${VERSION} --waitForEvent >&log.txt
|
||||
set +x
|
||||
else
|
||||
set -x
|
||||
peer lifecycle chaincode approveformyorg --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name ${CC_NAME} --version ${VERSION} --init-required --package-id ${PACKAGE_ID} --sequence ${VERSION} --waitForEvent >&log.txt
|
||||
set +x
|
||||
fi
|
||||
cat log.txt
|
||||
verifyResult $res "Chaincode definition approved on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' failed"
|
||||
echo "===================== Chaincode definition approved on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' ===================== "
|
||||
echo
|
||||
}
|
||||
|
||||
# commitChaincodeDefinition VERSION PEER ORG (PEER ORG)...
|
||||
commitChaincodeDefinition() {
|
||||
VERSION=$1
|
||||
shift
|
||||
parsePeerConnectionParameters $@
|
||||
res=$?
|
||||
verifyResult $res "Invoke transaction failed on channel '$CHANNEL_NAME' due to uneven number of peer and org parameters "
|
||||
|
||||
# while 'peer chaincode' command can get the orderer endpoint from the
|
||||
# peer (if join was successful), let's supply it directly as we know
|
||||
# it using the "-o" option
|
||||
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
||||
set -x
|
||||
peer lifecycle chaincode commit -o orderer.example.com:7050 --channelID $CHANNEL_NAME --name ${CC_NAME} $PEER_CONN_PARMS --version ${VERSION} --sequence ${VERSION} --init-required >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
else
|
||||
set -x
|
||||
peer lifecycle chaincode commit -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name ${CC_NAME} $PEER_CONN_PARMS --version ${VERSION} --sequence ${VERSION} --init-required >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
fi
|
||||
cat log.txt
|
||||
verifyResult $res "Chaincode definition commit failed on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' failed"
|
||||
echo "===================== Chaincode definition committed on channel '$CHANNEL_NAME' ===================== "
|
||||
echo
|
||||
}
|
||||
|
||||
# checkCommitReadiness VERSION PEER ORG
|
||||
checkCommitReadiness() {
|
||||
VERSION=$1
|
||||
PEER=$2
|
||||
ORG=$3
|
||||
shift 3
|
||||
setGlobals $PEER $ORG
|
||||
echo "===================== Checking the commit readiness of the chaincode definition on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME'... ===================== "
|
||||
local rc=1
|
||||
local starttime=$(date +%s)
|
||||
|
||||
# continue to poll
|
||||
# we either get a successful response, or reach TIMEOUT
|
||||
while
|
||||
test "$(($(date +%s) - starttime))" -lt "$TIMEOUT" -a $rc -ne 0
|
||||
do
|
||||
sleep $DELAY
|
||||
echo "Attempting to check the commit readiness of the chaincode definition on peer${PEER}.org${ORG} ...$(($(date +%s) - starttime)) secs"
|
||||
set -x
|
||||
peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name ${CC_NAME} $PEER_CONN_PARMS --version ${VERSION} --sequence ${VERSION} --output json --init-required >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
test $res -eq 0 || continue
|
||||
let rc=0
|
||||
for var in "$@"
|
||||
do
|
||||
grep "$var" log.txt &>/dev/null || let rc=1
|
||||
done
|
||||
done
|
||||
echo
|
||||
cat log.txt
|
||||
if test $rc -eq 0; then
|
||||
echo "===================== Checking the commit readiness of the chaincode definition successful on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' ===================== "
|
||||
else
|
||||
echo "!!!!!!!!!!!!!!! Check commit readiness result on peer${PEER}.org${ORG} is INVALID !!!!!!!!!!!!!!!!"
|
||||
echo "================== ERROR !!! FAILED to execute End-2-End Scenario =================="
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# queryCommitted VERSION PEER ORG
|
||||
queryCommitted() {
|
||||
VERSION=$1
|
||||
PEER=$2
|
||||
ORG=$3
|
||||
setGlobals $PEER $ORG
|
||||
EXPECTED_RESULT="Version: ${VERSION}, Sequence: ${VERSION}, Endorsement Plugin: escc, Validation Plugin: vscc"
|
||||
echo "===================== Querying chaincode definition on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME'... ===================== "
|
||||
local rc=1
|
||||
local starttime=$(date +%s)
|
||||
|
||||
# continue to poll
|
||||
# we either get a successful response, or reach TIMEOUT
|
||||
while
|
||||
test "$(($(date +%s) - starttime))" -lt "$TIMEOUT" -a $rc -ne 0
|
||||
do
|
||||
sleep $DELAY
|
||||
echo "Attempting to Query committed status on peer${PEER}.org${ORG} ...$(($(date +%s) - starttime)) secs"
|
||||
set -x
|
||||
peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name ${CC_NAME} >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
test $res -eq 0 && VALUE=$(cat log.txt | grep -o '^Version: [0-9], Sequence: [0-9], Endorsement Plugin: escc, Validation Plugin: vscc')
|
||||
test "$VALUE" = "$EXPECTED_RESULT" && let rc=0
|
||||
done
|
||||
echo
|
||||
cat log.txt
|
||||
if test $rc -eq 0; then
|
||||
echo "===================== Query chaincode definition successful on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' ===================== "
|
||||
else
|
||||
echo "!!!!!!!!!!!!!!! Query chaincode definition result on peer${PEER}.org${ORG} is INVALID !!!!!!!!!!!!!!!!"
|
||||
echo "================== ERROR !!! FAILED to execute End-2-End Scenario =================="
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
chaincodeQuery() {
|
||||
PEER=$1
|
||||
ORG=$2
|
||||
setGlobals $PEER $ORG
|
||||
EXPECTED_RESULT=$3
|
||||
echo "===================== Querying on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME'... ===================== "
|
||||
local rc=1
|
||||
local starttime=$(date +%s)
|
||||
|
||||
# continue to poll
|
||||
# we either get a successful response, or reach TIMEOUT
|
||||
while
|
||||
test "$(($(date +%s) - starttime))" -lt "$TIMEOUT" -a $rc -ne 0
|
||||
do
|
||||
sleep $DELAY
|
||||
echo "Attempting to Query peer${PEER}.org${ORG} ...$(($(date +%s) - starttime)) secs"
|
||||
set -x
|
||||
peer chaincode query -C $CHANNEL_NAME -n ${CC_NAME} -c '{"Args":["query","a"]}' >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
test $res -eq 0 && VALUE=$(cat log.txt | awk '/Query Result/ {print $NF}')
|
||||
test "$VALUE" = "$EXPECTED_RESULT" && let rc=0
|
||||
# removed the string "Query Result" from peer chaincode query command
|
||||
# result. as a result, have to support both options until the change
|
||||
# is merged.
|
||||
test $rc -ne 0 && VALUE=$(cat log.txt | egrep '^[0-9]+$')
|
||||
test "$VALUE" = "$EXPECTED_RESULT" && let rc=0
|
||||
done
|
||||
echo
|
||||
cat log.txt
|
||||
if test $rc -eq 0; then
|
||||
echo "===================== Query successful on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' ===================== "
|
||||
else
|
||||
echo "!!!!!!!!!!!!!!! Query result on peer${PEER}.org${ORG} is INVALID !!!!!!!!!!!!!!!!"
|
||||
echo "================== ERROR !!! FAILED to execute End-2-End Scenario =================="
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# fetchChannelConfig <channel_id> <output_json>
|
||||
# Writes the current channel config for a given channel to a JSON file
|
||||
fetchChannelConfig() {
|
||||
CHANNEL=$1
|
||||
OUTPUT=$2
|
||||
|
||||
setOrdererGlobals
|
||||
|
||||
echo "Fetching the most recent configuration block for the channel"
|
||||
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
||||
set -x
|
||||
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL --cafile $ORDERER_CA
|
||||
set +x
|
||||
else
|
||||
set -x
|
||||
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL --tls --cafile $ORDERER_CA
|
||||
set +x
|
||||
fi
|
||||
|
||||
echo "Decoding config block to JSON and isolating config to ${OUTPUT}"
|
||||
set -x
|
||||
configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config >"${OUTPUT}"
|
||||
set +x
|
||||
}
|
||||
|
||||
# signConfigtxAsPeerOrg <org> <configtx.pb>
|
||||
# Set the peerOrg admin of an org and signing the config update
|
||||
signConfigtxAsPeerOrg() {
|
||||
PEERORG=$1
|
||||
TX=$2
|
||||
setGlobals 0 $PEERORG
|
||||
set -x
|
||||
peer channel signconfigtx -f "${TX}"
|
||||
set +x
|
||||
}
|
||||
|
||||
# createConfigUpdate <channel_id> <original_config.json> <modified_config.json> <output.pb>
|
||||
# Takes an original and modified config, and produces the config update tx
|
||||
# which transitions between the two
|
||||
createConfigUpdate() {
|
||||
CHANNEL=$1
|
||||
ORIGINAL=$2
|
||||
MODIFIED=$3
|
||||
OUTPUT=$4
|
||||
|
||||
set -x
|
||||
configtxlator proto_encode --input "${ORIGINAL}" --type common.Config >original_config.pb
|
||||
configtxlator proto_encode --input "${MODIFIED}" --type common.Config >modified_config.pb
|
||||
configtxlator compute_update --channel_id "${CHANNEL}" --original original_config.pb --updated modified_config.pb >config_update.pb
|
||||
configtxlator proto_decode --input config_update.pb --type common.ConfigUpdate >config_update.json
|
||||
echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL'", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . >config_update_in_envelope.json
|
||||
configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope >"${OUTPUT}"
|
||||
set +x
|
||||
}
|
||||
|
||||
# parsePeerConnectionParameters $@
|
||||
# Helper function that takes the parameters from a chaincode operation
|
||||
# (e.g. invoke, query, instantiate) and checks for an even number of
|
||||
# peers and associated org, then sets $PEER_CONN_PARMS and $PEERS
|
||||
parsePeerConnectionParameters() {
|
||||
# check for uneven number of peer and org parameters
|
||||
if [ $(($# % 2)) -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PEER_CONN_PARMS=""
|
||||
PEERS=""
|
||||
while [ "$#" -gt 0 ]; do
|
||||
setGlobals $1 $2
|
||||
PEER="peer$1.org$2"
|
||||
PEERS="$PEERS $PEER"
|
||||
PEER_CONN_PARMS="$PEER_CONN_PARMS --peerAddresses $CORE_PEER_ADDRESS"
|
||||
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "true" ]; then
|
||||
TLSINFO=$(eval echo "--tlsRootCertFiles \$PEER$1_ORG$2_CA")
|
||||
PEER_CONN_PARMS="$PEER_CONN_PARMS $TLSINFO"
|
||||
fi
|
||||
# shift by two to get the next pair of peer/org parameters
|
||||
shift
|
||||
shift
|
||||
done
|
||||
# remove leading space for output
|
||||
PEERS="$(echo -e "$PEERS" | sed -e 's/^[[:space:]]*//')"
|
||||
}
|
||||
|
||||
# chaincodeInvoke IS_INIT PEER ORG (PEER ORG) ...
|
||||
# Accepts as many peer/org pairs as desired and requests endorsement from each
|
||||
chaincodeInvoke() {
|
||||
IS_INIT=$1
|
||||
shift
|
||||
parsePeerConnectionParameters $@
|
||||
res=$?
|
||||
verifyResult $res "Invoke transaction failed on channel '$CHANNEL_NAME' due to uneven number of peer and org parameters "
|
||||
|
||||
if [ "${IS_INIT}" -eq "1" ]; then
|
||||
CCARGS='{"Args":["Init","a","100","b","100"]}'
|
||||
INIT_ARG="--isInit"
|
||||
else
|
||||
CCARGS='{"Args":["invoke","a","b","10"]}'
|
||||
INIT_ARG=""
|
||||
fi
|
||||
|
||||
# while 'peer chaincode' command can get the orderer endpoint from the
|
||||
# peer (if join was successful), let's supply it directly as we know
|
||||
# it using the "-o" option
|
||||
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
||||
set -x
|
||||
peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n ${CC_NAME} $PEER_CONN_PARMS ${INIT_ARG} -c ${CCARGS} >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
else
|
||||
set -x
|
||||
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n ${CC_NAME} $PEER_CONN_PARMS ${INIT_ARG} -c ${CCARGS} >&log.txt
|
||||
res=$?
|
||||
set +x
|
||||
fi
|
||||
cat log.txt
|
||||
verifyResult $res "Invoke execution on $PEERS failed "
|
||||
echo "===================== Invoke transaction successful on $PEERS on channel '$CHANNEL_NAME' ===================== "
|
||||
echo
|
||||
}
|
||||
Loading…
Reference in a new issue