mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-23 01:55:10 +00:00
Revert "Initial check-in for HF and contract"
This reverts commit 43b6de9793.
This commit is contained in:
parent
f1a06feadc
commit
b26fd5c4fc
63 changed files with 0 additions and 8093 deletions
|
|
@ -1,202 +0,0 @@
|
|||
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.
|
||||
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
.DS_Store
|
||||
node_modules
|
||||
.nyc_output
|
||||
coverage
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
export { PatientContract } from './patient-contract';
|
||||
export declare const contracts: any[];
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
"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 +0,0 @@
|
|||
{"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"}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
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>;
|
||||
}
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
"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 +0,0 @@
|
|||
{"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"}
|
||||
|
|
@ -1,160 +0,0 @@
|
|||
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 {};
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
// Patient is an asset
|
||||
class Patient {
|
||||
}
|
||||
exports.Patient = Patient;
|
||||
//# sourceMappingURL=patient.js.map
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"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
2682
hyperledger-fabric/chaincode/fhir-data/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -1,63 +0,0 @@
|
|||
{
|
||||
"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
|
||||
}
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
/*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import { PatientContract } from './patient-contract';
|
||||
export { PatientContract } from './patient-contract';
|
||||
|
||||
export const contracts: any[] = [ PatientContract ];
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
|
||||
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 ===========');
|
||||
}
|
||||
}
|
||||
|
|
@ -1,186 +0,0 @@
|
|||
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[];
|
||||
}
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"outDir": "dist",
|
||||
"target": "es2017",
|
||||
"moduleResolution": "node",
|
||||
"module": "commonjs",
|
||||
"declaration": true,
|
||||
"sourceMap": true
|
||||
},
|
||||
"include": [
|
||||
"./src/**/*"
|
||||
],
|
||||
"exclude": [
|
||||
"./src/**/*.spec.ts"
|
||||
]
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
{
|
||||
"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": []
|
||||
}
|
||||
|
|
@ -1,606 +0,0 @@
|
|||
# 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')"
|
||||
|
|
@ -1,727 +0,0 @@
|
|||
# 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:
|
||||
|
|
@ -1,361 +0,0 @@
|
|||
# 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
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
COMPOSE_PROJECT_NAME=net
|
||||
IMAGE_TAG=latest
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
export PATH=./bin:$PATH
|
||||
8
hyperledger-fabric/first-network/.gitignore
vendored
8
hyperledger-fabric/first-network/.gitignore
vendored
|
|
@ -1,8 +0,0 @@
|
|||
/channel-artifacts/*.tx
|
||||
/channel-artifacts/*.block
|
||||
/crypto-config/*
|
||||
/ledgers
|
||||
/ledgers-backup
|
||||
/channel-artifacts/*.json
|
||||
/org3-artifacts/crypto-config/*
|
||||
/connection-*.*
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
## 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
|
||||
|
||||
|
|
@ -1,110 +0,0 @@
|
|||
# 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
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
# 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
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,561 +0,0 @@
|
|||
#!/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
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
#!/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
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
{
|
||||
"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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
---
|
||||
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
|
||||
|
|
@ -1,363 +0,0 @@
|
|||
# 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
|
||||
|
|
@ -1,88 +0,0 @@
|
|||
# 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
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
# 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
|
||||
|
|
@ -1,93 +0,0 @@
|
|||
# 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
|
||||
|
|
@ -1,118 +0,0 @@
|
|||
# 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
|
||||
|
|
@ -1,90 +0,0 @@
|
|||
# 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
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
# 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
|
||||
|
|
@ -1,97 +0,0 @@
|
|||
# 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
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
export FABRIC_CFG_PATH=$PWD/../config/
|
||||
export PATH=${PWD}/../bin:${PWD}:$PATH
|
||||
|
||||
Binary file not shown.
|
|
@ -1,31 +0,0 @@
|
|||
#!/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
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
#!/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
|
||||
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
#!/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
|
||||
|
||||
|
|
@ -1,184 +0,0 @@
|
|||
#!/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
|
||||
|
|
@ -1,81 +0,0 @@
|
|||
#!/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
|
||||
|
|
@ -1,86 +0,0 @@
|
|||
#!/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
|
||||
|
|
@ -1,89 +0,0 @@
|
|||
#!/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
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
#!/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
|
||||
|
|
@ -1,451 +0,0 @@
|
|||
#
|
||||
# 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