Skip to content

Commit a50098b

Browse files
authored
Merge pull request #1665 from hyperledger/update_listener_docs
Update contract listener documentation to be clearer
2 parents 7b7dbb0 + 75edace commit a50098b

File tree

4 files changed

+146
-39
lines changed

4 files changed

+146
-39
lines changed

doc-site/docs/reference/types/_includes/contractlistener_description.md

Lines changed: 97 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Each filter is identified by a generated `signature` that matches a single event
4040

4141
Ethereum provides a string standard for event signatures, of the form `EventName(uint256,bytes)`. Prior to v1.3.1, the signature of each Ethereum contract listener would exactly follow this Ethereum format.
4242

43-
As of v1.3.1, Ethereum signature strings have been changed, because this format does not fully describe the event - particularly because each top-level parameter can in the ABI definition be marked as `indexed`. For example, while the following two Solidity events have the same signature, they are serialized differently due to the different placement of `indexed` parameters, and thus a listener must define both individually to be able to process them:
43+
As of v1.3.1, Ethereum format signature strings have been changed in FireFly, because this format does not fully describe the event - particularly because each top-level parameter can in the ABI definition be marked as `indexed`. For example, while the following two Solidity events have the same signature, they are serialized differently due to the different placement of `indexed` parameters, and thus a listener must define both individually to be able to process them:
4444

4545
- ERC-20 `Transfer`
4646

@@ -54,7 +54,7 @@ As of v1.3.1, Ethereum signature strings have been changed, because this format
5454
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
5555
```
5656

57-
The two above are now expressed in the following manner by the Ethereum blockchain connector:
57+
The two above are now expressed in the following manner by the FireFly Ethereum blockchain connector:
5858

5959
```solidity
6060
Transfer(address,address,uint256) [i=0,1]
@@ -65,7 +65,7 @@ The `[i=]` listing at the end of the signature indicates the position of all par
6565

6666
Building on the blockchain-specific signature format for each event, FireFly will then compute the final signature for each filter and each contract listener as follows:
6767

68-
- Each filter signature is a combination of the location and the specific connector event signature, such as `0xa5ea5d0a6b2eaf194716f0cc73981939dca26da1:Changed(address,uint256) [i=0]`
68+
- Each filter signature is a combination of the location and the specific connector event signature, such as `0xa5ea5d0a6b2eaf194716f0cc73981939dca26da1:Transfer(address,address,uint256) [i=0,1]`
6969
- Each contract listener signature is a concatenation of all the filter signatures, separated by `;`
7070

7171
#### Duplicate filters
@@ -84,7 +84,7 @@ As noted above, each listener has a generated signature. This signature - contai
8484

8585
### Backwards compatibility
8686

87-
As noted throughout this document, the behavior of listeners is changed in v1.3.1. However, the following behaviors are retained for backwards-compatibility, to ensure that code written prior to v1.3.1 should continue to function.
87+
As noted throughout this document, the behavior of listeners has changed in v1.3.1. However, the following behaviors are retained for backwards-compatibility, to ensure that code written prior to v1.3.1 should continue to function.
8888

8989
- The response from all query APIs of `listeners` will continue to populate top-level `event` and `location` fields
9090
- The first entry from the `filters` array is duplicated to these fields
@@ -93,12 +93,104 @@ As noted throughout this document, the behavior of listeners is changed in v1.3.
9393
- The `signature` field is preserved at the listener level
9494
- The format has been changed as described above
9595

96-
### Input formats
96+
## Input examples
9797

9898
The two input formats supported when creating a contract listener are shown below.
9999

100+
### With event definition
101+
102+
In these examples, the event schema in the FireFly Interface format is provided describing the event and its parameters. See [FireFly Interface Format](../firefly_interface_format.md)
103+
100104
**Muliple Filters**
105+
```json
106+
{
107+
"filters": [
108+
{
109+
"event": {
110+
"name": "Changed",
111+
"description": "",
112+
"params": [
113+
{
114+
"name": "x",
115+
"schema": {
116+
"type": "integer",
117+
"details": {
118+
"type": "uint256",
119+
"internalType": "uint256"
120+
}
121+
}
122+
}
123+
]
124+
},
125+
"location": {
126+
"address": "0xa5ea5d0a6b2eaf194716f0cc73981939dca26da1"
127+
}
128+
},
129+
{
130+
"event": {
131+
"name": "AnotherEvent",
132+
"description": "",
133+
"params": [
134+
{
135+
"name": "my-field",
136+
"schema": {
137+
"type": "string",
138+
"details": {
139+
"type": "address",
140+
"internalType": "address",
141+
"indexed": true
142+
}
143+
}
144+
}
145+
]
146+
},
147+
"location": {
148+
"address": "0xa4ea5d0b6b2eaf194716f0cc73981939dca27da1"
149+
}
150+
}
151+
],
152+
"options": {
153+
"firstEvent": "newest"
154+
},
155+
"topic": "simple-storage"
156+
}
157+
```
158+
159+
**One filter (old format)**
160+
161+
```json
162+
{
163+
"event": {
164+
"name": "Changed",
165+
"description": "",
166+
"params": [
167+
{
168+
"name": "x",
169+
"schema": {
170+
"type": "integer",
171+
"details": {
172+
"type": "uint256",
173+
"internalType": "uint256"
174+
}
175+
}
176+
}
177+
]
178+
},
179+
"location": {
180+
"address": "0xa5ea5d0a6b2eaf194716f0cc73981939dca26da1"
181+
},
182+
"options": {
183+
"firstEvent": "newest"
184+
},
185+
"topic": "simple-storage"
186+
}
187+
```
188+
189+
### With interface reference
101190

191+
These examples use an `interface` reference when creating the filters, the `eventPath` field is used to reference an event defined within the interface provided. In this case, we do not need to provide the event schema as the section above shows. See an example of creating a [FireFly Interface](../../tutorials/custom_contracts/ethereum.md/#the-firefly-interface-format) for an EVM smart contract.
192+
193+
**Muliple Filters**
102194
```json
103195
{
104196
"filters": [

doc-site/docs/reference/types/contractlistener.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@ title: ContractListener
121121

122122
| Field Name | Description | Type |
123123
|------------|-------------|------|
124-
| `event` | The definition of the event, either provided in-line when creating the listener, or extracted from the referenced FFI | [`FFISerializedEvent`](#ffiserializedevent) |
124+
| `event` | The definition of the event, either provided in-line when creating the listener, or extracted from the referenced FFI when supplied | [`FFISerializedEvent`](#ffiserializedevent) |
125125
| `location` | A blockchain specific contract identifier. For example an Ethereum contract address, or a Fabric chaincode name and channel | [`JSONAny`](simpletypes.md#jsonany) |
126-
| `interface` | A reference to an existing FFI, containing pre-registered type information for the event | [`FFIReference`](#ffireference) |
126+
| `interface` | A reference to an existing FFI, containing pre-registered type information for the event, used in combination with eventPath | [`FFIReference`](#ffireference) |
127127
| `signature` | The stringified signature of the event and location, as computed by the blockchain plugin | `string` |
128128

129129

0 commit comments

Comments
 (0)