Skip to content

Commit 71c2b4b

Browse files
committed
Merge branch 'master' of https://github.com/zigbee-alliance/distributed-compliance-ledger into delete-model-version
2 parents 1098c23 + 8051be0 commit 71c2b4b

16 files changed

+1805
-122
lines changed

.github/.wordlist.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,5 @@ io
8282
li
8383
md
8484
pdf
85-
ul
85+
ul
86+
WebSocket

Dockerfile

+24-7
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,29 @@
1919
############################
2020
# STEP 1 build cosmovisor
2121
############################
22-
FROM golang:alpine AS builder
22+
FROM ubuntu:latest AS builder
2323

24-
# git is required for fetching the dependencies.
25-
RUN apk update && apk add --no-cache git
24+
ARG GO_VERSION
25+
ENV GO_VERSION=1.19.4
26+
27+
RUN apt-get update
28+
RUN apt-get install -y wget git gcc
29+
30+
RUN wget -P /tmp "https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz"
31+
32+
RUN tar -C /usr/local -xzf "/tmp/go${GO_VERSION}.linux-amd64.tar.gz"
33+
RUN rm "/tmp/go${GO_VERSION}.linux-amd64.tar.gz"
34+
35+
ENV GOPATH /go
36+
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
37+
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
2638

2739
RUN go install github.com/cosmos/cosmos-sdk/cosmovisor/cmd/cosmovisor@v1.0.0
2840

2941
############################
3042
# STEP 2 build node image
3143
############################
32-
FROM alpine:latest
44+
FROM ubuntu:latest
3345

3446
COPY --from=builder /go/bin/cosmovisor /usr/bin/
3547

@@ -43,10 +55,15 @@ ENV TEST_USER=${TEST_USER:-dcl}
4355
ARG TEST_UID
4456
ENV TEST_UID=${TEST_UID:-1000}
4557
#ARG gid=1000
46-
RUN adduser -D -u ${TEST_UID} -h /var/lib/${TEST_USER} -g 'DCLedger user' ${TEST_USER}
47-
58+
RUN adduser --disabled-password --uid ${TEST_UID} --home /var/lib/${TEST_USER} --gecos 'DCLedger user' ${TEST_USER}
4859
ENV DAEMON_HOME=/var/lib/${TEST_USER}/.dcl
4960
ENV DAEMON_NAME=dcld
61+
ENV DAEMON_ALLOW_DOWNLOAD_BINARIES=true
62+
63+
RUN apt-get update
64+
RUN apt-get install -y ca-certificates
65+
66+
RUN update-ca-certificates
5067

5168
VOLUME /var/lib/${TEST_USER}
5269

@@ -58,4 +75,4 @@ USER ${TEST_USER}
5875

5976
ENV PATH=$PATH:${DAEMON_HOME}/cosmovisor/current/bin
6077

61-
WORKDIR /var/lib/${TEST_USER}
78+
WORKDIR /var/lib/${TEST_USER}

Dockerfile-build

+15-5
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,22 @@
1717
# The resulting image is used only for getting the build artifact from
1818
# a container based on it. Containers based on this image are never run.
1919
################################################################################
20-
FROM golang:alpine
20+
FROM ubuntu:20.04 AS builder
2121

22-
# git is required for fetching the dependencies,
23-
# make is required for building,
24-
# build-base is needed because gcc is required for building.
25-
RUN apk update && apk add --no-cache git make build-base
22+
ARG GO_VERSION
23+
ENV GO_VERSION=1.19.4
24+
25+
RUN apt-get update
26+
RUN apt-get install -y wget git gcc make
27+
28+
RUN wget -P /tmp "https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz"
29+
30+
RUN tar -C /usr/local -xzf "/tmp/go${GO_VERSION}.linux-amd64.tar.gz"
31+
RUN rm "/tmp/go${GO_VERSION}.linux-amd64.tar.gz"
32+
33+
ENV GOPATH /go
34+
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
35+
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
2636

2737
WORKDIR /go/src/dc-ledger
2838
COPY app ./app/

Makefile

+2-3
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,9 @@ COPYRIGHT_HOLDER = "DSR Corporation"
8989
LICENSED_FILES = $(shell find . -type f -not -path '*/.*' -not -name '*.md' -not -name 'requirements.txt')
9090

9191
MK_TEST = "Makefile.test"
92-
LOCALNET_TARGETS = image localnet_init localnet_start localnet_stop localnet_clean localnet_export localnet_reset localnet_rebuild
92+
LOCALNET_TARGETS = image localnet_init localnet_init_latest_stable_release localnet_start localnet_stop localnet_clean localnet_export localnet_reset localnet_rebuild
9393
TEST_DEPLOY_TARGETS = test_deploy_env_build test_deploy_env_clean
94-
TEST_UPGRADE_TARGETS = localnet_init_test_upgrade
95-
TEST_TARGETS= ${LOCALNET_TARGETS} ${TEST_DEPLOY_TARGETS} ${TEST_UPGRADE_TARGETS}
94+
TEST_TARGETS= ${LOCALNET_TARGETS} ${TEST_DEPLOY_TARGETS}
9695

9796
all: install
9897

Makefile.test

+6-4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ remove_containers = $(if $(1),docker rm -f $(1),true)
1818
localnet_containers = $(shell docker ps --format '{{.ID}}' --filter network=$(LOCALNET_DOCKER_NETWORK))
1919
clean_network = $(call remove_containers,$(call localnet_containers))
2020

21+
MAINNET_STABLE_VERSION="v0.12.0"
22+
2123
# test deploy vars
2224
TEST_DEPLOY_GVN = "test_deploy_gvn"
2325
TEST_DEPLOY_VN = "test_deploy_vn"
@@ -31,6 +33,10 @@ localnet_init:
3133
/bin/bash ./genlocalnetconfig.sh
3234
/bin/bash ./genlocalnetappbins.sh
3335

36+
localnet_init_latest_stable_release:
37+
/bin/bash ./genlocalnetconfig.sh
38+
/bin/bash ./genlocalnetappbins.sh "" "" "" ${MAINNET_STABLE_VERSION}
39+
3440
localnet_start:
3541
@if [ -d "${LOCALNET_DIR}/observer0" ]; then\
3642
docker compose --profile observers up -d;\
@@ -73,10 +79,6 @@ test_deploy_env_build:
7379
test_deploy_env_clean:
7480
docker compose -f integration_tests/deploy/docker-compose.yml down
7581

76-
localnet_init_test_upgrade: localnet_init
77-
/bin/bash ./genlocalnetappbins.sh integration_tests/upgrade/Dockerfile-build dcld-upgrade-build upgrades/test-upgrade
78-
7982
.PHONY: localnet_init localnet_start localnet_stop localnet_clean localnet_export \
8083
localnet_reset localnet_rebuild \
8184
test_deploy_env_build test_deploy_env_clean \
82-
localnet_init_test_upgrade

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ but they may be provided in the future.
166166
- The following libraries can be used as light clients:
167167
- [Golang Light Client implementation](https://pkg.go.dev/github.com/tendermint/tendermint/lite2)
168168
- [Rust Light Client implementation](https://docs.rs/tendermint-light-client/0.23.3/tendermint_light_client/)
169+
- Refer to [this doc](./docs/tendermint-rpc.md) to see how to [subscribe](./docs/tendermint-rpc.md#subscribe) to a Tendermint WebSocket based events and/or [query](./docs/tendermint-rpc.md#querying-application-components) an application components.
169170

170171

171172
### Instructions

docs/tendermint-rpc.md

+228
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
# Tendermint RPC
2+
3+
[Tendermint RPC](https://docs.tendermint.com/v0.34/rpc/#) can be used to query application's state and/or [subscribe to Tendermint WebSocket events](https://docs.tendermint.com/v0.34/tendermint-core/subscription.html).
4+
The default RPC listen address is tcp://0.0.0.0:26657. See the [docs](https://docs.tendermint.com/v0.34/rpc/#) to learn how to configure and customize.
5+
6+
## WebSocket Events
7+
8+
Full list of Tendermint WebSocket events can be found [here](https://pkg.go.dev/github.com/tendermint/tendermint/types#pkg-constants).
9+
10+
### Subscribe
11+
12+
Subscribing to Tendermint WebSocket events can be done using any WS clients like [wscat](https://github.com/websockets/wscat), [Postman](https://www.postman.com/), etc. The following is an example of subscribing to a new `tx` (transaction) event using wscat:
13+
14+
1. Connect to the server:
15+
16+
```bash
17+
wscat -c ws://<node-ip>:<port>/websocket
18+
```
19+
20+
In cases of [Test Net](https://github.com/zigbee-alliance/distributed-compliance-ledger/blob/master/deployment/persistent_chains/testnet-2.0/testnet-2.0-csa-endpoints.md) and [Main Net](https://github.com/zigbee-alliance/distributed-compliance-ledger/blob/master/deployment/persistent_chains/main-net/main-net-csa-endpoints.md) observer nodes, `node-ip`s are `on.test-net.dcl.csa-iot.org` and `on.dcl.csa-iot.org`, respectively, having the same ports `26657`
21+
22+
2. Subscribe to the `tx` event in the wscat command line (refer to the [docs](https://docs.tendermint.com/v0.34/rpc/#) to learn the syntax):
23+
24+
```json
25+
{"jsonrpc":"2.0","method":"subscribe","id":0,"params":{"query":"tm.event='Tx'"}}
26+
```
27+
28+
You should get the following response if everything is OK:
29+
30+
```json
31+
{
32+
"jsonrpc": "2.0",
33+
"id": 0,
34+
"result": {}
35+
}
36+
```
37+
38+
3. Wait for the transaction
39+
40+
Consider performing any transaction in another terminal tab to broadcast a `tx` event for the test purposes. For example, the following transaction can be sent in case of a local pool (for Test Net or Main Net pools `dcld` needs to be configured properly and write access needs to be given, see https://github.com/zigbee-alliance/distributed-compliance-ledger/blob/master/docs/how-to.md#cli-configuration)
41+
42+
```bash
43+
dcld tx auth propose-add-account \
44+
--address=cosmos1sdg5vkpz9urcemmw67lnxvzhhuveqe6v70ex2l \
45+
--pubkey="{\"@type\":\"/cosmos.crypto.secp256k1.PubKey\",\"key\":\"A4m98FT/tgsMWZuVBlavWmawwXrvv/nUMhDlU8QsHlOM\"}" \
46+
--roles=NodeAdmin \
47+
--from=jack
48+
```
49+
50+
4. Confirm that the subscriber received the event. For the transaction example above:
51+
52+
```json
53+
{
54+
"jsonrpc": "2.0",
55+
"id": 0,
56+
"result": {
57+
"query": "tm.event='Tx'",
58+
"data": {
59+
"type": "tendermint/event/Tx",
60+
"value": {
61+
"TxResult": {
62+
"height": "1684",
63+
"tx": "CocCCoQCCkgvemlnYmVlYWxsaWFuY2UuZGlzdHJpYnV0ZWRjb21wbGlhbmNlbGVkZ2VyLmRjbGF1dGguTXNnUHJvcG9zZUFkZEFjY291bnQStwEKLWNvc21vczE0cG1nMnhnMzd0enI2a3VxNHV4dnp3a3p1ZnRldGQ3dDhhMnN1dRItY29zbW9zMXNkZzV2a3B6OXVyY2VtbXc2N2xueHZ6aGh1dmVxZTZ2NzBleDJsGkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohA4m98FT/tgsMWZuVBlavWmawwXrvv/nUMhDlU8QsHlOMIglOb2RlQWRtaW44lo/YoAYSWApQCkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohApEHaI8+Wj64IQdR/WZDMaWHNd53+9G19zNcWjrAiXMbEgQKAggBGAISBBDAmgwaQJCg0T8phCo70H7VpL2M1C0kQix4LeVOjkXWgK3EHmFobXkBGLH2jJiKTHakVWUO2yj2Tdpc4YoTDw2eKe6UZj8=",
64+
"result": {
65+
"data": "CkoKSC96aWdiZWVhbGxpYW5jZS5kaXN0cmlidXRlZGNvbXBsaWFuY2VsZWRnZXIuZGNsYXV0aC5Nc2dQcm9wb3NlQWRkQWNjb3VudA==",
66+
"log": "[{\"events\":[{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/zigbeealliance.distributedcomplianceledger.dclauth.MsgProposeAddAccount\"}]}]}]",
67+
"gas_used": "25760",
68+
"events": [
69+
{
70+
"type": "tx",
71+
"attributes": [
72+
{
73+
"key": "YWNjX3NlcQ==",
74+
"value": "Y29zbW9zMTRwbWcyeGczN3R6cjZrdXE0dXh2endrenVmdGV0ZDd0OGEyc3V1LzI=",
75+
"index": true
76+
}
77+
]
78+
},
79+
{
80+
"type": "tx",
81+
"attributes": [
82+
{
83+
"key": "c2lnbmF0dXJl",
84+
"value": "a0tEUlB5bUVLanZRZnRXa3ZZelVMU1JDTEhndDVVNk9SZGFBcmNRZVlXaHRlUUVZc2ZhTW1JcE1kcVJWWlE3YktQWk4ybHpoaWhNUERaNHA3cFJtUHc9PQ==",
85+
"index": true
86+
}
87+
]
88+
},
89+
{
90+
"type": "message",
91+
"attributes": [
92+
{
93+
"key": "YWN0aW9u",
94+
"value": "L3ppZ2JlZWFsbGlhbmNlLmRpc3RyaWJ1dGVkY29tcGxpYW5jZWxlZGdlci5kY2xhdXRoLk1zZ1Byb3Bvc2VBZGRBY2NvdW50",
95+
"index": true
96+
}
97+
]
98+
}
99+
]
100+
}
101+
}
102+
}
103+
},
104+
"events": {
105+
"tm.event": [
106+
"Tx"
107+
],
108+
"tx.hash": [
109+
"AF831BBE5BF23545447BB2D1B65E49F99B5A22035F7E1FEB3E4BDC8D243F4115"
110+
],
111+
"tx.height": [
112+
"1684"
113+
],
114+
"tx.acc_seq": [
115+
"cosmos14pmg2xg37tzr6kuq4uxvzwkzuftetd7t8a2suu/2"
116+
],
117+
"tx.signature": [
118+
"kKDRPymEKjvQftWkvYzULSRCLHgt5U6ORdaArcQeYWhteQEYsfaMmIpMdqRVZQ7bKPZN2lzhihMPDZ4p7pRmPw=="
119+
],
120+
"message.action": [
121+
"/zigbeealliance.distributedcomplianceledger.dclauth.MsgProposeAddAccount"
122+
]
123+
}
124+
}
125+
}
126+
```
127+
128+
### Decoding The Transaction String
129+
130+
The details of transaction payload encoding can be found [here](https://docs.cosmos.network/main/core/encoding#transaction-encoding). Thus, the transaction payload/string in the example above can be decoded as follows:
131+
132+
```bash
133+
dcld tx decode CocCCoQCCkgvemlnYmVlYWxsaWFuY2UuZGlzdHJpYnV0ZWRjb21wbGlhbmNlbGVkZ2VyLmRjbGF1dGguTXNnUHJvcG9zZUFkZEFjY291bnQStwEKLWNvc21vczE0cG1nMnhnMzd0enI2a3VxNHV4dnp3a3p1ZnRldGQ3dDhhMnN1dRItY29zbW9zMXNkZzV2a3B6OXVyY2VtbXc2N2xueHZ6aGh1dmVxZTZ2NzBleDJsGkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohA4m98FT/tgsMWZuVBlavWmawwXrvv/nUMhDlU8QsHlOMIglOb2RlQWRtaW44lo/YoAYSWApQCkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohApEHaI8+Wj64IQdR/WZDMaWHNd53+9G19zNcWjrAiXMbEgQKAggBGAISBBDAmgwaQJCg0T8phCo70H7VpL2M1C0kQix4LeVOjkXWgK3EHmFobXkBGLH2jJiKTHakVWUO2yj2Tdpc4YoTDw2eKe6UZj8=
134+
```
135+
136+
which gives the result:
137+
138+
```json
139+
{"body":{"messages":[{"@type":"/zigbeealliance.distributedcomplianceledger.dclauth.MsgProposeAddAccount","signer":"cosmos14pmg2xg37tzr6kuq4uxvzwkzuftetd7t8a2suu","address":"cosmos1sdg5vkpz9urcemmw67lnxvzhhuveqe6v70ex2l","pubKey":{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A4m98FT/tgsMWZuVBlavWmawwXrvv/nUMhDlU8QsHlOM"},"roles":["NodeAdmin"],"vendorID":0,"info":"","time":"1679165334"}],"memo":"","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[{"public_key":{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"ApEHaI8+Wj64IQdR/WZDMaWHNd53+9G19zNcWjrAiXMb"},"mode_info":{"single":{"mode":"SIGN_MODE_DIRECT"}},"sequence":"2"}],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":["kKDRPymEKjvQftWkvYzULSRCLHgt5U6ORdaArcQeYWhteQEYsfaMmIpMdqRVZQ7bKPZN2lzhihMPDZ4p7pRmPw=="]}
140+
```
141+
142+
Detailed info about subscribing can be found [here](https://docs.tendermint.com/v0.34/rpc/#/Websocket/subscribe).
143+
144+
### Unsubscribe
145+
146+
Unsubscribing is done using a similar command to [subscription](#subscribe):
147+
148+
```json
149+
{"jsonrpc":"2.0","method":"unsubscribe","id":0,"params":{"query":"tm.event='Tx'"}}
150+
```
151+
152+
## Querying Application Components
153+
154+
There are many endpoints available to query various types of information about the nodes. For example, a transaction can be fetched by its hash using any web client like curl as follows:
155+
156+
```bash
157+
curl -X GET "http://<node-ip>:<port>/tx?hash=0x74504B24ED59A424E436656E5E9A11034C7A7C7ED3BE7C3CDEA1ED387EF62967&prove=true" -H "accept: application/json"
158+
```
159+
160+
It returns a response as follows:
161+
162+
```json
163+
{
164+
"jsonrpc": "2.0",
165+
"id": -1,
166+
"result": {
167+
"hash": "74504B24ED59A424E436656E5E9A11034C7A7C7ED3BE7C3CDEA1ED387EF62967",
168+
"height": "1692",
169+
"index": 0,
170+
"tx_result": {
171+
"code": 0,
172+
"data": "CkoKSC96aWdiZWVhbGxpYW5jZS5kaXN0cmlidXRlZGNvbXBsaWFuY2VsZWRnZXIuZGNsYXV0aC5Nc2dBcHByb3ZlQWRkQWNjb3VudA==",
173+
"log": "[{\"events\":[{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/zigbeealliance.distributedcomplianceledger.dclauth.MsgApproveAddAccount\"}]}]}]",
174+
"info": "",
175+
"gas_wanted": "0",
176+
"gas_used": "32100",
177+
"events": [
178+
{
179+
"type": "tx",
180+
"attributes": [
181+
{
182+
"key": "YWNjX3NlcQ==",
183+
"value": "Y29zbW9zMXlnejM3am4wdmFkdmV2M3dyODduZ2RkdDl6cG1hcHd3ZzhwMDRrLzQ=",
184+
"index": true
185+
}
186+
]
187+
},
188+
{
189+
"type": "tx",
190+
"attributes": [
191+
{
192+
"key": "c2lnbmF0dXJl",
193+
"value": "VHltY0YwbE9VNzJTUW1VRDg4ZEdmdldMOUxXcWYzRXgwYldjNEtLdExKSkdoV2hqdTJkbUs1L3BrNHFlQjcwL2wvSm80Mit3MlNoUHc4WUpGemR4M2c9PQ==",
194+
"index": true
195+
}
196+
]
197+
},
198+
{
199+
"type": "message",
200+
"attributes": [
201+
{
202+
"key": "YWN0aW9u",
203+
"value": "L3ppZ2JlZWFsbGlhbmNlLmRpc3RyaWJ1dGVkY29tcGxpYW5jZWxlZGdlci5kY2xhdXRoLk1zZ0FwcHJvdmVBZGRBY2NvdW50",
204+
"index": true
205+
}
206+
]
207+
}
208+
],
209+
"codespace": ""
210+
},
211+
"tx": "CrMBCrABCkgvemlnYmVlYWxsaWFuY2UuZGlzdHJpYnV0ZWRjb21wbGlhbmNlbGVkZ2VyLmRjbGF1dGguTXNnQXBwcm92ZUFkZEFjY291bnQSZAotY29zbW9zMXlnejM3am4wdmFkdmV2M3dyODduZ2RkdDl6cG1hcHd3ZzhwMDRrEi1jb3Ntb3Mxc2RnNXZrcHo5dXJjZW1tdzY3bG54dnpoaHV2ZXFlNnY3MGV4MmwgwY/YoAYSWApQCkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohAv+avtRfIGPCkbToqtJJUO8yX8NsAeW4MPkg3ADUEM0zEgQKAggBGAQSBBDAmgwaQE8pnBdJTlO9kkJlA/PHRn71i/S1qn9xMdG1nOCirSySRoVoY7tnZiuf6ZOKnge9P5fyaONvsNkoT8PGCRc3cd4=",
212+
"proof": {
213+
"root_hash": "BB905252C0221042D19C66A8215A7ABF53873C773975E56BEAF946C3B1DC2512",
214+
"data": "CrMBCrABCkgvemlnYmVlYWxsaWFuY2UuZGlzdHJpYnV0ZWRjb21wbGlhbmNlbGVkZ2VyLmRjbGF1dGguTXNnQXBwcm92ZUFkZEFjY291bnQSZAotY29zbW9zMXlnejM3am4wdmFkdmV2M3dyODduZ2RkdDl6cG1hcHd3ZzhwMDRrEi1jb3Ntb3Mxc2RnNXZrcHo5dXJjZW1tdzY3bG54dnpoaHV2ZXFlNnY3MGV4MmwgwY/YoAYSWApQCkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohAv+avtRfIGPCkbToqtJJUO8yX8NsAeW4MPkg3ADUEM0zEgQKAggBGAQSBBDAmgwaQE8pnBdJTlO9kkJlA/PHRn71i/S1qn9xMdG1nOCirSySRoVoY7tnZiuf6ZOKnge9P5fyaONvsNkoT8PGCRc3cd4=",
215+
"proof": {
216+
"total": "1",
217+
"index": "0",
218+
"leaf_hash": "u5BSUsAiEELRnGaoIVp6v1OHPHc5deVr6vlGw7HcJRI=",
219+
"aunts": [
220+
221+
]
222+
}
223+
}
224+
}
225+
}
226+
```
227+
228+
The `proof` property can be excluded from the response by setting the `prove` property in the query string to `false` (or just by omitting it).

docs/transactions.md

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ Please make sure that TLS is enabled in gRPC, REST or Light Client Proxy for sec
8484
- Tendermint RPC supports state proofs. Tendermint's Light Client library can be used to verify the state proofs.
8585
So, if Light Client API is used, then it's possible to communicate with non-trusted nodes.
8686
- Please note, that multi-value queries don't have state proofs support and should be sent to trusted nodes only.
87+
- Refer to [this doc](./tendermint-rpc.md) to see how to [subscribe](./tendermint-rpc.md#subscribe) to a Tendermint WebSocket based events and/or [query](./tendermint-rpc.md#querying-application-components) an application components.
8788

8889
`NotFound` (404 code) is returned if an entry is not found on the ledger.
8990

0 commit comments

Comments
 (0)