Skip to content

Commit 43481d4

Browse files
authored
Merge pull request #1369 from hyperledger/backport-fabric-fix
v1.2: FabConnect does not / can not set transactionIndex and eventIndex
2 parents eda9463 + c27557e commit 43481d4

File tree

2 files changed

+21
-34
lines changed

2 files changed

+21
-34
lines changed

internal/blockchain/fabric/fabric.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -304,10 +304,15 @@ func (f *Fabric) parseBlockchainEvent(ctx context.Context, msgJSON fftypes.JSONO
304304
return nil // move on
305305
}
306306

307+
// Fabric events are dispatched by the underlying fabric client to FabConnect with just the block number
308+
// and the transaction hash. The index of the transaction in the block, or the index of the action within
309+
// the transaction are not available. So we cannot generate an alphanumerically sortable string
310+
// into the protocol ID. Instead we can only do this (which is according to Fabric rules assured to be
311+
// unique, as Fabric only allows one event per transaction):
307312
sTransactionHash := msgJSON.GetString("transactionId")
308313
blockNumber := msgJSON.GetInt64("blockNumber")
309-
transactionIndex := msgJSON.GetInt64("transactionIndex")
310-
eventIndex := msgJSON.GetInt64("eventIndex")
314+
protocolID := fmt.Sprintf("%.12d/%s", blockNumber, sTransactionHash)
315+
311316
name := msgJSON.GetString("eventName")
312317
timestamp := msgJSON.GetInt64("timestamp")
313318
chaincode := msgJSON.GetString("chaincodeId")
@@ -317,7 +322,7 @@ func (f *Fabric) parseBlockchainEvent(ctx context.Context, msgJSON fftypes.JSONO
317322
BlockchainTXID: sTransactionHash,
318323
Source: f.Name(),
319324
Name: name,
320-
ProtocolID: fmt.Sprintf("%.12d/%.6d/%.6d", blockNumber, transactionIndex, eventIndex),
325+
ProtocolID: protocolID,
321326
Output: *payload,
322327
Info: msgJSON,
323328
Timestamp: fftypes.UnixTime(timestamp),

internal/blockchain/fabric/fabric_test.go

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1620,8 +1620,6 @@ func TestHandleMessageContractEventOldSubscription(t *testing.T) {
16201620
"chaincodeId": "basic",
16211621
"blockNumber": 10,
16221622
"transactionId": "4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746d",
1623-
"transactionIndex": 20,
1624-
"eventIndex": 30,
16251623
"eventName": "AssetCreated",
16261624
"payload": "eyJBcHByYWlzZWRWYWx1ZSI6MTAsIkNvbG9yIjoicmVkIiwiSUQiOiIxMjM0IiwiT3duZXIiOiJtZSIsIlNpemUiOjN9",
16271625
"subId": "sb-cb37cc07-e873-4f58-44ab-55add6bba320"
@@ -1645,7 +1643,7 @@ func TestHandleMessageContractEventOldSubscription(t *testing.T) {
16451643

16461644
em.On("BlockchainEvent", mock.MatchedBy(func(e *blockchain.EventWithSubscription) bool {
16471645
assert.Equal(t, "4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746d", e.BlockchainTXID)
1648-
assert.Equal(t, "000000000010/000020/000030", e.Event.ProtocolID)
1646+
assert.Contains(t, []string{"000000000010/4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746d", "000000000010/4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746f"}, e.Event.ProtocolID)
16491647
return true
16501648
})).Return(nil)
16511649

@@ -1669,13 +1667,11 @@ func TestHandleMessageContractEventOldSubscription(t *testing.T) {
16691667
assert.Equal(t, outputs, ev.Event.Output)
16701668

16711669
info := fftypes.JSONObject{
1672-
"blockNumber": float64(10),
1673-
"chaincodeId": "basic",
1674-
"eventName": "AssetCreated",
1675-
"subId": "sb-cb37cc07-e873-4f58-44ab-55add6bba320",
1676-
"transactionId": "4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746d",
1677-
"transactionIndex": float64(20),
1678-
"eventIndex": float64(30),
1670+
"blockNumber": float64(10),
1671+
"chaincodeId": "basic",
1672+
"eventName": "AssetCreated",
1673+
"subId": "sb-cb37cc07-e873-4f58-44ab-55add6bba320",
1674+
"transactionId": "4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746d",
16791675
}
16801676
assert.Equal(t, info, ev.Event.Info)
16811677

@@ -1689,8 +1685,6 @@ func TestHandleMessageContractEventNamespacedHandlers(t *testing.T) {
16891685
"chaincodeId": "basic",
16901686
"blockNumber": 10,
16911687
"transactionId": "4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746d",
1692-
"transactionIndex": 20,
1693-
"eventIndex": 30,
16941688
"eventName": "AssetCreated",
16951689
"payload": "eyJBcHByYWlzZWRWYWx1ZSI6MTAsIkNvbG9yIjoicmVkIiwiSUQiOiIxMjM0IiwiT3duZXIiOiJtZSIsIlNpemUiOjN9",
16961690
"subId": "sb-cb37cc07-e873-4f58-44ab-55add6bba320"
@@ -1699,8 +1693,6 @@ func TestHandleMessageContractEventNamespacedHandlers(t *testing.T) {
16991693
"chaincodeId": "basic",
17001694
"blockNumber": 10,
17011695
"transactionId": "4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746f",
1702-
"transactionIndex": 20,
1703-
"eventIndex": 30,
17041696
"eventName": "AssetCreated",
17051697
"payload": "eyJBcHByYWlzZWRWYWx1ZSI6MTAsIkNvbG9yIjoicmVkIiwiSUQiOiIxMjM0IiwiT3duZXIiOiJtZSIsIlNpemUiOjN9",
17061698
"subId": "sb-cb37cc07-e873-4f58-44ab-55add6bba320"
@@ -1723,7 +1715,7 @@ func TestHandleMessageContractEventNamespacedHandlers(t *testing.T) {
17231715
e.SetHandler("ns1", em)
17241716

17251717
em.On("BlockchainEvent", mock.MatchedBy(func(e *blockchain.EventWithSubscription) bool {
1726-
assert.Equal(t, "000000000010/000020/000030", e.Event.ProtocolID)
1718+
assert.Contains(t, []string{"000000000010/4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746d", "000000000010/4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746f"}, e.Event.ProtocolID)
17271719
return true
17281720
})).Return(nil)
17291721

@@ -1747,13 +1739,11 @@ func TestHandleMessageContractEventNamespacedHandlers(t *testing.T) {
17471739
assert.Equal(t, outputs, ev.Event.Output)
17481740

17491741
info := fftypes.JSONObject{
1750-
"blockNumber": float64(10),
1751-
"chaincodeId": "basic",
1752-
"eventName": "AssetCreated",
1753-
"subId": "sb-cb37cc07-e873-4f58-44ab-55add6bba320",
1754-
"transactionId": "4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746d",
1755-
"transactionIndex": float64(20),
1756-
"eventIndex": float64(30),
1742+
"blockNumber": float64(10),
1743+
"chaincodeId": "basic",
1744+
"eventName": "AssetCreated",
1745+
"subId": "sb-cb37cc07-e873-4f58-44ab-55add6bba320",
1746+
"transactionId": "4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746d",
17571747
}
17581748
assert.Equal(t, info, ev.Event.Info)
17591749

@@ -1767,8 +1757,6 @@ func TestHandleMessageContractEventNoNamespacedHandlers(t *testing.T) {
17671757
"chaincodeId": "basic",
17681758
"blockNumber": 10,
17691759
"transactionId": "4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746d",
1770-
"transactionIndex": 20,
1771-
"eventIndex": 30,
17721760
"eventName": "AssetCreated",
17731761
"payload": "eyJBcHByYWlzZWRWYWx1ZSI6MTAsIkNvbG9yIjoicmVkIiwiSUQiOiIxMjM0IiwiT3duZXIiOiJtZSIsIlNpemUiOjN9",
17741762
"subId": "sb-cb37cc07-e873-4f58-44ab-55add6bba320"
@@ -1792,7 +1780,7 @@ func TestHandleMessageContractEventNoNamespacedHandlers(t *testing.T) {
17921780

17931781
em.On("BlockchainEvent", mock.MatchedBy(func(e *blockchain.EventWithSubscription) bool {
17941782
assert.Equal(t, "4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746d", e.BlockchainTXID)
1795-
assert.Equal(t, "000000000010/000020/000030", e.Event.ProtocolID)
1783+
assert.Equal(t, "000000000010/4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746d", e.Event.ProtocolID)
17961784
return true
17971785
})).Return(nil)
17981786

@@ -1811,8 +1799,6 @@ func TestHandleMessageContractEventNoPayload(t *testing.T) {
18111799
"chaincodeId": "basic",
18121800
"blockNumber": 10,
18131801
"transactionId": "4763a0c50e3bba7cef1a7ba35dd3f9f3426bb04d0156f326e84ec99387c4746d",
1814-
"transactionIndex": 20,
1815-
"eventIndex": 30,
18161802
"eventName": "AssetCreated",
18171803
"subId": "sb-cb37cc07-e873-4f58-44ab-55add6bba320"
18181804
}
@@ -2367,8 +2353,6 @@ func TestHandleNetworkAction(t *testing.T) {
23672353
"chaincodeId": "firefly",
23682354
"blockNumber": 91,
23692355
"transactionId": "ce79343000e851a0c742f63a733ce19a5f8b9ce1c719b6cecd14f01bcf81fff2",
2370-
"transactionIndex": 2,
2371-
"eventIndex": 50,
23722356
"eventName": "BatchPin",
23732357
"payload": "eyJzaWduZXIiOiJ1MHZnd3U5czAwLXg1MDk6OkNOPXVzZXIyLE9VPWNsaWVudDo6Q049ZmFicmljLWNhLXNlcnZlciIsInRpbWVzdGFtcCI6eyJzZWNvbmRzIjoxNjMwMDMxNjY3LCJuYW5vcyI6NzkxNDk5MDAwfSwibmFtZXNwYWNlIjoiZmlyZWZseTp0ZXJtaW5hdGUiLCJ1dWlkcyI6IjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsImJhdGNoSGFzaCI6IjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsInBheWxvYWRSZWYiOiIiLCJjb250ZXh0cyI6W119",
23742358
"subId": "sb-0910f6a8-7bd6-4ced-453e-2db68149ce8e"
@@ -2411,8 +2395,6 @@ func TestHandleNetworkActionFail(t *testing.T) {
24112395
"chaincodeId": "firefly",
24122396
"blockNumber": 91,
24132397
"transactionId": "ce79343000e851a0c742f63a733ce19a5f8b9ce1c719b6cecd14f01bcf81fff2",
2414-
"transactionIndex": 2,
2415-
"eventIndex": 50,
24162398
"eventName": "BatchPin",
24172399
"payload": "eyJzaWduZXIiOiJ1MHZnd3U5czAwLXg1MDk6OkNOPXVzZXIyLE9VPWNsaWVudDo6Q049ZmFicmljLWNhLXNlcnZlciIsInRpbWVzdGFtcCI6eyJzZWNvbmRzIjoxNjMwMDMxNjY3LCJuYW5vcyI6NzkxNDk5MDAwfSwibmFtZXNwYWNlIjoiZmlyZWZseTp0ZXJtaW5hdGUiLCJ1dWlkcyI6IjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsImJhdGNoSGFzaCI6IjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsInBheWxvYWRSZWYiOiIiLCJjb250ZXh0cyI6W119",
24182400
"subId": "sb-0910f6a8-7bd6-4ced-453e-2db68149ce8e"

0 commit comments

Comments
 (0)