Skip to content

Commit 6b05c12

Browse files
authored
Merge pull request #501 from dzikowski/upgrade_to_version3
Add support for BFT and improve Fabric v3 support
2 parents 9713fec + 12bac57 commit 6b05c12

37 files changed

+10294
-318
lines changed

.github/workflows/test-on-push.yml

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,55 @@ jobs:
169169
path: |
170170
e2e-network/docker/test-04-snapshot.sh.logs/*
171171
e2e-network/docker/test-04-snapshot.sh.tmpdir/fablo-target/**/*
172+
173+
test-05-v3:
174+
needs: test-main
175+
runs-on: ubuntu-latest
176+
steps:
177+
- name: Check out repository code
178+
uses: actions/checkout@v2
179+
180+
- name: Build Fablo
181+
run: |
182+
shellcheck --version && \
183+
yamllint -v && \
184+
npm install && \
185+
./fablo-build.sh
186+
187+
- name: Test version 3
188+
run: e2e-network/docker/test-05-version3.sh
189+
190+
- uses: actions/upload-artifact@v4
191+
if: always()
192+
with:
193+
name: test-05-version3
194+
path: |
195+
e2e-network/docker/test-05-version3-snapshot.sh.logs/*
196+
e2e-network/docker/test-05-version3-snapshot.sh.tmpdir/fablo-target/**/*
197+
198+
test-05-v3-BFT:
199+
needs: test-main
200+
runs-on: ubuntu-latest
201+
steps:
202+
- name: Check out repository code
203+
uses: actions/checkout@v2
204+
205+
- name: Build Fablo
206+
run: |
207+
shellcheck --version && \
208+
yamllint -v && \
209+
npm install && \
210+
./fablo-build.sh
211+
212+
- name: Test version 3 with BFT
213+
run: e2e-network/docker/test-05-version3-BFT.sh
214+
215+
- uses: actions/upload-artifact@v4
216+
if: always()
217+
with:
218+
name: test-05-version3-BFT-snapshot
219+
path: |
220+
e2e-network/docker/test-05-version3-BFT-snapshot.sh.logs/*
221+
e2e-network/docker/test-05-version3-BFT-snapshot.sh.tmpdir/fablo-target/**/*
222+
223+

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ fablo-target
55
generators
66
node_modules
77
.idea
8+
samples/invalid-fablo-config.json

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 2.1.0
2+
3+
### Features
4+
* Support Fabric 3.0.0-beta, along with BFT consensus
5+
[#501](https://github.com/hyperledger-labs/fablo/pull/501)
6+
17
## 2.0.0
28

39
### Breaking changes

docs/schema.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,8 @@
224224
"description": "The 'solo' consensus type may be used in development environment only. Use 'raft' in production.",
225225
"enum": [
226226
"solo",
227-
"raft"
227+
"raft",
228+
"BFT"
228229
]
229230
},
230231
"instances": {

e2e-network/TEST_CASES.md

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
# Test cases
22

3-
| Test case | 01-simple | 02-raft | 03-private | 04-snapshot |
4-
| ------------------------- |:---------------:|:-----------:|:----------:|:------------------------:|
5-
| Fabric versions | 2.4.7 | 2.3.2 | 2.4.7 | 2.3.3/2.4.2 |
6-
| TLS | no | yes | no | yes |
7-
| Channel capabilities | v2 | v2 | v2_5 | v2 |
8-
| Consensus | solo | RAFT | solo | RAFT |
9-
| Orderer nodes | 1 | 3 | 1 | 1 |
10-
| Organizations | 1 | 2 | 2 | 1 |
11-
| CA database | SQLite | SQLite | SQLite | Postgres |
12-
| Peer database | LevelDB | LevelDB | LevelDB | CouchDB |
13-
| Peer count | 2 | 2, 2 | 2, 1 | 2 |
14-
| Channels | 1 | 2 | 1 | 1 |
15-
| Node chaincode | yes | yes | yes | yes |
16-
| Node chaincode upgrade | no | yes | no | no |
17-
| Node chaincode endorsement| OR | OR | OR, AND | default |
18-
| Private data | no | no | yes | yes |
19-
| Java chaincode | no | yes | no | no |
20-
| Go chaincode | no | no | no | no |
21-
| Tools | channel scripts | Fablo REST | - | Fablo REST, Explorer |
22-
| Other Fablo commands | init, reset | stop, start | - | snapshot, prune, restore |
3+
| Test case | 01-simple | 02-raft | 03-private | 04-snapshot | test-05-version3 | test-05-version3-BFT |
4+
| ------------------------- |:---------------:|:-----------:|:----------:|:------------------------:|:------------------:|:---------------------:|
5+
| Fabric versions | 2.4.7 | 2.3.2 | 2.4.7 | 2.3.3/2.4.2 | 3.0.0-beta | 3.0.0-beta |
6+
| TLS | no | yes | no | yes | yes | yes |
7+
| Channel capabilities | v2 | v2 | v2_5 | v2 | v3_0 | v3_0 |
8+
| Consensus | solo | RAFT | solo | RAFT | RAFT | BFT |
9+
| Orderer nodes | 1 | 3 | 1 | 1 | 3 | 4 |
10+
| Organizations | 1 | 2 | 2 | 1 | 1 | 1 |
11+
| CA database | SQLite | SQLite | SQLite | Postgres | SQLite | SQLite |
12+
| Peer database | LevelDB | LevelDB | LevelDB | CouchDB | LevelDB | LevelDB |
13+
| Peer count | 2 | 2, 2 | 2, 1 | 2 | 2 | 2 |
14+
| Channels | 1 | 2 | 1 | 1 | 1 | 1 |
15+
| Node chaincode | yes | yes | yes | yes | yes | yes |
16+
| Node chaincode upgrade | no | yes | no | no | no | no |
17+
| Node chaincode endorsement| OR | OR | OR, AND | default | OR | OR |
18+
| Private data | no | no | yes | yes | no | no |
19+
| Java chaincode | no | yes | no | no | no | no |
20+
| Go chaincode | no | no | no | no | no | no |
21+
| Tools | channel scripts | Fablo REST | - | Fablo REST, Explorer | - | - |
22+
| Other Fablo commands | init, reset | stop, start | - | snapshot, prune, restore | - | - |
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#!/usr/bin/env bash
2+
3+
set -eu
4+
5+
TEST_TMP="$(rm -rf "$0.tmpdir" && mkdir -p "$0.tmpdir" && (cd "$0.tmpdir" && pwd))"
6+
TEST_LOGS="$(mkdir -p "$0.logs" && (cd "$0.logs" && pwd))"
7+
FABLO_HOME="$TEST_TMP/../../.."
8+
9+
export FABLO_HOME
10+
11+
CONFIG="$FABLO_HOME/samples/fablo-config-hlf3-bft-1orgs-1chaincode.json"
12+
13+
networkUp() {
14+
"$FABLO_HOME/fablo-build.sh"
15+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" generate "$CONFIG")
16+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" up)
17+
}
18+
19+
dumpLogs() {
20+
echo "Saving logs of $1 to $TEST_LOGS/$1.log"
21+
mkdir -p "$TEST_LOGS"
22+
docker logs "$1" >"$TEST_LOGS/$1.log" 2>&1
23+
}
24+
25+
networkDown() {
26+
rm -rf "$TEST_LOGS"
27+
(for name in $(docker ps --format '{{.Names}}'); do dumpLogs "$name"; done)
28+
dumpLogs orderer0.group1.orderer.example.com
29+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" down)
30+
}
31+
32+
waitForContainer() {
33+
sh "$TEST_TMP/../wait-for-container.sh" "$1" "$2"
34+
}
35+
36+
waitForChaincode() {
37+
(cd "$TEST_TMP" && sh ../wait-for-chaincode.sh "$1" "$2" "$3" "$4")
38+
}
39+
40+
expectInvoke() {
41+
(cd "$TEST_TMP" && sh ../expect-invoke-cli.sh "$1" "$2" "$3" "$4" "$5" "")
42+
}
43+
44+
expectCommand() {
45+
sh "$TEST_TMP/../expect-command.sh" "$1" "$2"
46+
}
47+
48+
trap networkDown EXIT
49+
trap 'networkDown ; echo "Test failed" ; exit 1' ERR SIGINT
50+
51+
# start the network
52+
networkUp
53+
54+
waitForContainer "orderer0.group1.orderer.example.com" "Channel created"
55+
waitForContainer "orderer1.group1.orderer.example.com" "Channel created"
56+
waitForContainer "orderer2.group1.orderer.example.com" "Channel created"
57+
waitForContainer "orderer3.group1.orderer.example.com" "Channel created"
58+
waitForContainer "ca.org1.example.com" "Listening on https://0.0.0.0:7054"
59+
waitForContainer "peer0.org1.example.com" "Joining gossip network of channel my-channel1 with 1 organizations"
60+
waitForContainer "peer1.org1.example.com" "Joining gossip network of channel my-channel1 with 1 organizations"
61+
waitForContainer "peer0.org1.example.com" "Learning about the configured anchor peers of Org1MSP for channel my-channel1"
62+
waitForContainer "peer0.org1.example.com" "Anchor peer.*with same endpoint, skipping connecting to myself"
63+
waitForContainer "peer0.org1.example.com" "Membership view has changed. peers went online:.*peer1.org1.example.com:7042"
64+
waitForContainer "peer1.org1.example.com" "Learning about the configured anchor peers of Org1MSP for channel my-channel1"
65+
waitForContainer "peer1.org1.example.com" "Membership view has changed. peers went online:.*peer0.org1.example.com:7041"
66+
67+
# Test simple chaincode
68+
expectInvoke "peer0.org1.example.com" "my-channel1" "chaincode1" \
69+
'{"Args":["KVContract:put", "name", "Willy Wonka"]}' \
70+
'{\"success\":\"OK\"}'
71+
expectInvoke "peer1.org1.example.com" "my-channel1" "chaincode1" \
72+
'{"Args":["KVContract:get", "name"]}' \
73+
'{\"success\":\"Willy Wonka\"}'
74+
75+
# Verify channel query scripts
76+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" channel fetch newest my-channel1 org1 peer1)
77+
expectCommand "cat \"$TEST_TMP/newest.block\"" "KVContract:get"
78+
79+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" channel fetch 3 my-channel1 org1 peer1 "another.block")
80+
expectCommand "cat \"$TEST_TMP/another.block\"" "KVContract:put"
81+
82+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" channel fetch config my-channel1 org1 peer1 "channel-config.json")
83+
expectCommand "cat \"$TEST_TMP/channel-config.json\"" "\"mod_policy\": \"Admins\","
84+
85+
expectCommand "(cd \"$TEST_TMP\" && \"$FABLO_HOME/fablo.sh\" channel getinfo my-channel1 org1 peer1)" "\"height\":5"
86+
87+
echo "🎉 Test passed! 🎉"
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#!/usr/bin/env bash
2+
3+
set -eu
4+
5+
TEST_TMP="$(rm -rf "$0.tmpdir" && mkdir -p "$0.tmpdir" && (cd "$0.tmpdir" && pwd))"
6+
TEST_LOGS="$(mkdir -p "$0.logs" && (cd "$0.logs" && pwd))"
7+
FABLO_HOME="$TEST_TMP/../../.."
8+
9+
export FABLO_HOME
10+
11+
CONFIG="$FABLO_HOME/samples/fablo-config-hlf3-1orgs-1chaincode.json"
12+
13+
networkUp() {
14+
"$FABLO_HOME/fablo-build.sh"
15+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" generate "$CONFIG")
16+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" up)
17+
}
18+
19+
dumpLogs() {
20+
echo "Saving logs of $1 to $TEST_LOGS/$1.log"
21+
mkdir -p "$TEST_LOGS"
22+
docker logs "$1" >"$TEST_LOGS/$1.log" 2>&1
23+
}
24+
25+
networkDown() {
26+
rm -rf "$TEST_LOGS"
27+
(for name in $(docker ps --format '{{.Names}}'); do dumpLogs "$name"; done)
28+
dumpLogs orderer0.group1.orderer.example.com
29+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" down)
30+
}
31+
32+
waitForContainer() {
33+
sh "$TEST_TMP/../wait-for-container.sh" "$1" "$2"
34+
}
35+
36+
waitForChaincode() {
37+
(cd "$TEST_TMP" && sh ../wait-for-chaincode.sh "$1" "$2" "$3" "$4")
38+
}
39+
40+
expectInvoke() {
41+
(cd "$TEST_TMP" && sh ../expect-invoke-cli.sh "$1" "$2" "$3" "$4" "$5" "")
42+
}
43+
44+
expectCommand() {
45+
sh "$TEST_TMP/../expect-command.sh" "$1" "$2"
46+
}
47+
48+
trap networkDown EXIT
49+
trap 'networkDown ; echo "Test failed" ; exit 1' ERR SIGINT
50+
51+
# start the network
52+
networkUp
53+
54+
waitForContainer "orderer0.group1.orderer.example.com" "Starting raft node as part of a new channel channel=my-channel1"
55+
waitForContainer "ca.org1.example.com" "Listening on https://0.0.0.0:7054"
56+
waitForContainer "peer0.org1.example.com" "Joining gossip network of channel my-channel1 with 1 organizations"
57+
waitForContainer "peer1.org1.example.com" "Joining gossip network of channel my-channel1 with 1 organizations"
58+
waitForContainer "peer0.org1.example.com" "Learning about the configured anchor peers of Org1MSP for channel my-channel1"
59+
waitForContainer "peer0.org1.example.com" "Anchor peer.*with same endpoint, skipping connecting to myself"
60+
waitForContainer "peer0.org1.example.com" "Membership view has changed. peers went online:.*peer1.org1.example.com:7042"
61+
waitForContainer "peer1.org1.example.com" "Learning about the configured anchor peers of Org1MSP for channel my-channel1"
62+
waitForContainer "peer1.org1.example.com" "Membership view has changed. peers went online:.*peer0.org1.example.com:7041"
63+
64+
# Test simple chaincode
65+
expectInvoke "peer0.org1.example.com" "my-channel1" "chaincode1" \
66+
'{"Args":["KVContract:put", "name", "Willy Wonka"]}' \
67+
'{\"success\":\"OK\"}'
68+
expectInvoke "peer1.org1.example.com" "my-channel1" "chaincode1" \
69+
'{"Args":["KVContract:get", "name"]}' \
70+
'{\"success\":\"Willy Wonka\"}'
71+
72+
# Verify channel query scripts
73+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" channel fetch newest my-channel1 org1 peer1)
74+
expectCommand "cat \"$TEST_TMP/newest.block\"" "KVContract:get"
75+
76+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" channel fetch 3 my-channel1 org1 peer1 "another.block")
77+
expectCommand "cat \"$TEST_TMP/another.block\"" "KVContract:put"
78+
79+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" channel fetch config my-channel1 org1 peer1 "channel-config.json")
80+
expectCommand "cat \"$TEST_TMP/channel-config.json\"" "\"mod_policy\": \"Admins\","
81+
82+
expectCommand "(cd \"$TEST_TMP\" && \"$FABLO_HOME/fablo.sh\" channel getinfo my-channel1 org1 peer1)" "\"height\":5"
83+
84+
echo "🎉 Test passed! 🎉"

0 commit comments

Comments
 (0)