---
# System prepended metadata

title: Full chain validation
tags: [game-of-chains]

---

---
tags: game-of-chains
---


# Full chain validation

This document outlines the method used to verity that a validator signed on the last block of a consumer chain without having been jailed for downtime.

## 1. Check for downtime infractions

We scrape the `block_results` query for all the blocks in the provider chain that encompass the lifetime of the consumer chain.
We check the events in the `txs_results` field until we find an event of type `recv_packet`.
If the `recv_packet` includes a key called `infraction` in the `packet_data` field, we save the contents to a JSON file, including the destination port and channel to identify which consumer chain sent the infraction packet.

Example infraction message at block height 65063:
```bash=
curl -s http://provider-sentry-01.goc.earthball.xyz:27001/block_results\?height\=65063 | jq -r '.result.txs_results[0].events[7].attributes[0].value' | base64 --decode | jq '.'
{
  "validator": {
    "address": "53/ioNd4T5zlddNfCfuzO7Bcyes=",
    "power": "18"
  },
  "valset_update_id": "65041",
  "infraction": "INFRACTION_TYPE_DOWNTIME"
}

echo "53/ioNd4T5zlddNfCfuzO7Bcyes=" | base64 --decode | xxd -p
e77fe2a0d7784f9ce575d35f09fbb33bb05cc9eb
```
The address is base64 encoded hex.

The resulting JSON file would like this:
```
{
    "last_height": 150000,
    "validators": {
        "cosmosvalcons1ual79gxh0p8eeet46d0sn7an8wc9ej0t2hav6n": {
            "65063": {
                "power": "18",
                "valset_update_id": "65041",
                "infraction": "INFRACTION_TYPE_DOWNTIME",
                "packet_timeout_timestamp": "1670651466778617319",
                "packet_src_port": "consumer",
                "packet_src_channel": "channel-0",
                "packet_dst_port": "provider",
                "packet_dst_channel": "channel-0",
                "packet_connection": "connection-0"
            },
            "67584": {
                "power": "17",
                "valset_update_id": "67578",
                "infraction": "INFRACTION_TYPE_DOWNTIME",
                "packet_timeout_timestamp": "1670664208951889777",
                "packet_src_port": "consumer",
                "packet_src_channel": "channel-0",
                "packet_dst_port": "provider",
                "packet_dst_channel": "channel-2",
                "packet_connection": "connection-1"
            }
        },
        "cosmosvalcons1yna32lcuhtjkq7f4nsnp9ln8wykwjepxhxsr5g": {
            "62054": {
...
```




## 2. Collect the last block signatures
 
There are two options to collect the signatures of the last block.

### 2.1 Query the commit on the last block using RPC

The commit will include all the signatures, and we can look up the addresses in the provider chain to identify the validator by moniker or operator address.

```bash=
curl -s http://apollo-backup.goc.earthball.xyz:26657/commit\?height\=144970
{
  "jsonrpc": "2.0",
  "id": -1,
  "result": {
    "signed_header": {
      "header": {
        "version": {
          "block": "11"
        },
        "chain_id": "apollo",
        "height": "144970",
        "time": "2022-11-20T02:23:13.093385376Z",
        "last_block_id": {
          "hash": "4F577EE8BF06F86DFEC00892F7B170090CFB381F4D59965F5E27F0A55C09C8B5",
          "parts": {
            "total": 1,
            "hash": "21DCC3D683C62E9DD3E0EA950B1180446EFBD7D363DE2923F0D0673E3FD18079"
          }
        },
        "last_commit_hash": "78DBC617C297FE3E3BB61564F9545BBC1F0935238F93A1FCF2118420206B4B8B",
        "data_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
        "validators_hash": "E9312E1DEAA9C30E2F3D9BFA1F7C3C73D099E12F40CEED8A46B2A845D03A9B66",
        "next_validators_hash": "E9312E1DEAA9C30E2F3D9BFA1F7C3C73D099E12F40CEED8A46B2A845D03A9B66",
        "consensus_hash": "048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F",
        "app_hash": "86987749246EEC0351286F68312F2645B77E9BA75DF5C921D0CD0C45AB232DF6",
        "last_results_hash": "EF34FE354180BDD1F78041CEA41262A6A92DE2DFBFD55540A6576F3C1395A4C8",
        "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
        "proposer_address": "6A3CACEAEA586C9AF3051249D6FF34942835DF10"
      },
      "commit": {
        "height": "144970",
        "round": 0,
        "block_id": {
          "hash": "4F9DE74B250ACED8DBF6F83D6845BA05E7A73ECF9443853863044271D098A124",
          "parts": {
            "total": 1,
            "hash": "14F804805B3BA3D38524C3B7167829423BBA9004539F33C8546D5D2D0FD16E6B"
          }
        },
        "signatures": [
          {
            "block_id_flag": 2,
            "validator_address": "6A3CACEAEA586C9AF3051249D6FF34942835DF10",
            "timestamp": "2022-11-20T02:23:18.173035456Z",
            "signature": "odyFsI9MSTg19H8pgiPiT8e1zknj5+rQJlO75+9dE+59+ckuiapRzIWEyRSu5JolRFoYA4vvraOiR3e42PKaDw=="
          },
          {
            "block_id_flag": 2,
            "validator_address": "0DA35960AC73947F415949EDAF885E1A9A186370",
            "timestamp": "2022-11-20T02:23:18.349468641Z",
            "signature": "lt8hHXP1vFcfCWvet3jNghD3c1YBDGFSWsVhpwLafh4SuFMr3plXAeBSGE6gxGRcYXiyuJFsf0tucOroG6YKBg=="
          },

```


A potential risk with using this option only is that if the consumer chain stops and the binary restarts, we will not be able to query the commit again because the RPC endpoint will no longer be available.

### 2.2 Save the last commit every time a new block event is sent

We can use a websocket subscription to an endpoint and save the signatures to a file every time the NewBlock event is received. 

Websocket subscription:
```
< {
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "query": "tm.event='NewBlock'",
    "data": {
      "type": "tendermint/event/NewBlock",
      "value": {
        "block": {
          "header": {
            "version": {
              "block": "11"
            },
            "chain_id": "apollo",
            "height": "150",
            "time": "2022-11-17T20:50:09.213525618Z",
            "last_block_id": {
              "hash": "4B1CB438058C50373703765B2A7F935F2E357D0FF3EDF339F880BB8C03ED74C5",
              "parts": {
                "total": 1,
                "hash": "61B3AC44A1A9DA7D0C272C752C564DC7084C48002C0EC24CCE00AB48FF6351EB"
              }
            },
            "last_commit_hash": "1E3D5E2A79A1364E598EC9EB55E7DF79B9D4E08D1089E84AE9F45C608FF47CFF",
            "data_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
            "validators_hash": "37492F0C1D6BC4D52BD3EDFEA9C4B8DFAF94832063FA3869BDBDCD3CC12BD764",
            "next_validators_hash": "37492F0C1D6BC4D52BD3EDFEA9C4B8DFAF94832063FA3869BDBDCD3CC12BD764",
            "consensus_hash": "048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F",
            "app_hash": "8D83E96742AA5B251E7D52B1D9CD95715D6973D9EEDB844AC8C2D6EE1155E38D",
            "last_results_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
            "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
            "proposer_address": "6A3CACEAEA586C9AF3051249D6FF34942835DF10"
          },
          "data": {
            "txs": []
          },
          "evidence": {
            "evidence": []
          },
          "last_commit": {
            "height": "149",
            "round": 0,
            "block_id": {
              "hash": "4B1CB438058C50373703765B2A7F935F2E357D0FF3EDF339F880BB8C03ED74C5",
              "parts": {
                "total": 1,
                "hash": "61B3AC44A1A9DA7D0C272C752C564DC7084C48002C0EC24CCE00AB48FF6351EB"
              }
            },
            "signatures": [
              {
                "block_id_flag": 2,
                "validator_address": "6A3CACEAEA586C9AF3051249D6FF34942835DF10",
                "timestamp": "2022-11-17T20:50:09.213525618Z",
                "signature": "ojHrJCwF4ebFDTCZZF6xIm1tX3ciT4mHbidIXxItdaug7uif9g26m2AHcZIvHczLgeSsy/xllfiGKthpJ3dGAg=="
              }
            ]
          }
        },
        "result_begin_block": {
          "events": []
        },
        "result_end_block": {
          "validator_updates": [],
          "consensus_param_updates": {
            "block": {
              "max_bytes": "22020096",
              "max_gas": "-1"
            },
            "evidence": {
              "max_age_num_blocks": "100000",
              "max_age_duration": "172800000000000",
              "max_bytes": "1048576"
            },
            "validator": {
              "pub_key_types": [
                "ed25519"
              ]
            }
          },
          "events": [
            {
              "type": "coin_spent",
              "attributes": [
                {
                  "key": "c3BlbmRlcg==",
                  "value": "Y29zbW9zMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsc2VycXRh",
                  "index": true
                },
                {
                  "key": "YW1vdW50",
                  "value": "",
                  "index": true
                }
              ]
            },
            {
              "type": "coin_received",
              "attributes": [
                {
                  "key": "cmVjZWl2ZXI=",
                  "value": "Y29zbW9zMXg2OWR6MGMwZW13OG0yYzZrcDV2NmMwOGtnanhtdTMwZDI1OTVu",
                  "index": true
                },
                {
                  "key": "YW1vdW50",
                  "value": "",
                  "index": true
                }
              ]
            },
            {
              "type": "transfer",
              "attributes": [
                {
                  "key": "cmVjaXBpZW50",
                  "value": "Y29zbW9zMXg2OWR6MGMwZW13OG0yYzZrcDV2NmMwOGtnanhtdTMwZDI1OTVu",
                  "index": true
                },
                {
                  "key": "c2VuZGVy",
                  "value": "Y29zbW9zMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsc2VycXRh",
                  "index": true
                },
                {
                  "key": "YW1vdW50",
                  "value": "",
                  "index": true
                }
              ]
            },
            {
              "type": "message",
              "attributes": [
                {
                  "key": "c2VuZGVy",
                  "value": "Y29zbW9zMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsc2VycXRh",
                  "index": true
                }
              ]
            },
            {
              "type": "coin_spent",
              "attributes": [
                {
                  "key": "c3BlbmRlcg==",
                  "value": "Y29zbW9zMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsc2VycXRh",
                  "index": true
                },
                {
                  "key": "YW1vdW50",
                  "value": "",
                  "index": true
                }
              ]
            },
            {
              "type": "coin_received",
              "attributes": [
                {
                  "key": "cmVjZWl2ZXI=",
                  "value": "Y29zbW9zMXl3dGFuc3k2c3MwanRxOGNrcmN2Nmp6a3BzOHloOG1mYzh4dWNx",
                  "index": true
                },
                {
                  "key": "YW1vdW50",
                  "value": "",
                  "index": true
                }
              ]
            },
            {
              "type": "transfer",
              "attributes": [
                {
                  "key": "cmVjaXBpZW50",
                  "value": "Y29zbW9zMXl3dGFuc3k2c3MwanRxOGNrcmN2Nmp6a3BzOHloOG1mYzh4dWNx",
                  "index": true
                },
                {
                  "key": "c2VuZGVy",
                  "value": "Y29zbW9zMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsc2VycXRh",
                  "index": true
                },
                {
                  "key": "YW1vdW50",
                  "value": "",
                  "index": true
                }
              ]
            },
            {
              "type": "message",
              "attributes": [
                {
                  "key": "c2VuZGVy",
                  "value": "Y29zbW9zMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsc2VycXRh",
                  "index": true
                }
              ]
            }
          ]
        }
      }
    },
    "events": {
      "coin_received.amount": [
        "",
        ""
      ],
      "transfer.sender": [
        "cosmos17xpfvakm2amg962yls6f84z3kell8c5lserqta",
        "cosmos17xpfvakm2amg962yls6f84z3kell8c5lserqta"
      ],
      "transfer.amount": [
        "",
        ""
      ],
      "message.sender": [
        "cosmos17xpfvakm2amg962yls6f84z3kell8c5lserqta",
        "cosmos17xpfvakm2amg962yls6f84z3kell8c5lserqta"
      ],
      "tm.event": [
        "NewBlock"
      ],
      "coin_spent.spender": [
        "cosmos17xpfvakm2amg962yls6f84z3kell8c5lserqta",
        "cosmos17xpfvakm2amg962yls6f84z3kell8c5lserqta"
      ],
      "coin_spent.amount": [
        "",
        ""
      ],
      "coin_received.receiver": [
        "cosmos1x69dz0c0emw8m2c6kp5v6c08kgjxmu30d2595n",
        "cosmos1ywtansy6ss0jtq8ckrcv6jzkps8yh8mfc8xucq"
      ],
      "transfer.recipient": [
        "cosmos1x69dz0c0emw8m2c6kp5v6c08kgjxmu30d2595n",
        "cosmos1ywtansy6ss0jtq8ckrcv6jzkps8yh8mfc8xucq"
      ]
    }
  }
}
< {
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "query": "tm.event='NewBlock'",
    "data": {
      "type": "tendermint/event/NewBlock",
      "value": {
        "block": {
          "header": {
            "version": {
              "block": "11"
            },
            "chain_id": "apollo",
            "height": "151",
            "time": "2022-11-17T20:50:14.240502893Z",
            "last_block_id": {
              "hash": "6177CA90A76C6295C845E36A52A034C10FA21B632BB6C8BE06D415739EA2AACC",
              "parts": {
                "total": 1,
                "hash": "08547730AA0DDF01FBA408426DB512A7406189E23726AE53A4FEB3EB796DAE68"
              }
            },
            "last_commit_hash": "6197442EE14305AA05291ACAD15AAB8CDC47A673957A906E8EF7FE3C526FC5BD",
            "data_hash": "ED68C0914F07E4A3C6CFFA00F29B23414CE1591D9CCF349C0C3AB73DD9B91069",
            "validators_hash": "37492F0C1D6BC4D52BD3EDFEA9C4B8DFAF94832063FA3869BDBDCD3CC12BD764",
            "next_validators_hash": "37492F0C1D6BC4D52BD3EDFEA9C4B8DFAF94832063FA3869BDBDCD3CC12BD764",
            "consensus_hash": "048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F",
            "app_hash": "4C6708DD32D3B53E74D1BB91A68666815A28E30D499343592B4835F58DB84CEB",
            "last_results_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
            "evidence_hash": "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855",
            "proposer_address": "6A3CACEAEA586C9AF3051249D6FF34942835DF10"
          },
          "data": {
            "txs": [
              "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"
            ]
          },
          "evidence": {
            "evidence": []
          },
          "last_commit": {
            "height": "150",
            "round": 0,
            "block_id": {
              "hash": "6177CA90A76C6295C845E36A52A034C10FA21B632BB6C8BE06D415739EA2AACC",
              "parts": {
                "total": 1,
                "hash": "08547730AA0DDF01FBA408426DB512A7406189E23726AE53A4FEB3EB796DAE68"
              }
            },
            "signatures": [
              {
                "block_id_flag": 2,
                "validator_address": "6A3CACEAEA586C9AF3051249D6FF34942835DF10",
                "timestamp": "2022-11-17T20:50:14.240502893Z",
                "signature": "Ag/U+cjKdDyZmxoTYBfo/iPsmNJ99Q8onkSUkafO4wCiVQh0YldrsbMN7UssT/ea7mVQm8ax4K506kZLoTbMAQ=="
              }
            ]
          }
        },
        "result_begin_block": {
          "events": []
        },
        "result_end_block": {
          "validator_updates": [],
          "consensus_param_updates": {
            "block": {
              "max_bytes": "22020096",
              "max_gas": "-1"
            },
            "evidence": {
              "max_age_num_blocks": "100000",
              "max_age_duration": "172800000000000",
              "max_bytes": "1048576"
            },
            "validator": {
              "pub_key_types": [
                "ed25519"
              ]
            }
          },
          "events": [
            {
              "type": "coin_spent",
              "attributes": [
                {
                  "key": "c3BlbmRlcg==",
                  "value": "Y29zbW9zMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsc2VycXRh",
                  "index": true
                },
                {
                  "key": "YW1vdW50",
                  "value": "MTA3dXBvbA==",
                  "index": true
                }
              ]
            },
            {
              "type": "coin_received",
              "attributes": [
                {
                  "key": "cmVjZWl2ZXI=",
                  "value": "Y29zbW9zMXg2OWR6MGMwZW13OG0yYzZrcDV2NmMwOGtnanhtdTMwZDI1OTVu",
                  "index": true
                },
                {
                  "key": "YW1vdW50",
                  "value": "MTA3dXBvbA==",
                  "index": true
                }
              ]
            },
            {
              "type": "transfer",
              "attributes": [
                {
                  "key": "cmVjaXBpZW50",
                  "value": "Y29zbW9zMXg2OWR6MGMwZW13OG0yYzZrcDV2NmMwOGtnanhtdTMwZDI1OTVu",
                  "index": true
                },
                {
                  "key": "c2VuZGVy",
                  "value": "Y29zbW9zMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsc2VycXRh",
                  "index": true
                },
                {
                  "key": "YW1vdW50",
                  "value": "MTA3dXBvbA==",
                  "index": true
                }
              ]
            },
            {
              "type": "message",
              "attributes": [
                {
                  "key": "c2VuZGVy",
                  "value": "Y29zbW9zMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsc2VycXRh",
                  "index": true
                }
              ]
            },
            {
              "type": "coin_spent",
              "attributes": [
                {
                  "key": "c3BlbmRlcg==",
                  "value": "Y29zbW9zMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsc2VycXRh",
                  "index": true
                },
                {
                  "key": "YW1vdW50",
                  "value": "MzZ1cG9s",
                  "index": true
                }
              ]
            },
            {
              "type": "coin_received",
              "attributes": [
                {
                  "key": "cmVjZWl2ZXI=",
                  "value": "Y29zbW9zMXl3dGFuc3k2c3MwanRxOGNrcmN2Nmp6a3BzOHloOG1mYzh4dWNx",
                  "index": true
                },
                {
                  "key": "YW1vdW50",
                  "value": "MzZ1cG9s",
                  "index": true
                }
              ]
            },
            {
              "type": "transfer",
              "attributes": [
                {
                  "key": "cmVjaXBpZW50",
                  "value": "Y29zbW9zMXl3dGFuc3k2c3MwanRxOGNrcmN2Nmp6a3BzOHloOG1mYzh4dWNx",
                  "index": true
                },
                {
                  "key": "c2VuZGVy",
                  "value": "Y29zbW9zMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsc2VycXRh",
                  "index": true
                },
                {
                  "key": "YW1vdW50",
                  "value": "MzZ1cG9s",
                  "index": true
                }
              ]
            },
            {
              "type": "message",
              "attributes": [
                {
                  "key": "c2VuZGVy",
                  "value": "Y29zbW9zMTd4cGZ2YWttMmFtZzk2MnlsczZmODR6M2tlbGw4YzVsc2VycXRh",
                  "index": true
                }
              ]
            }
          ]
        }
      }
    },
    "events": {
      "coin_spent.spender": [
        "cosmos17xpfvakm2amg962yls6f84z3kell8c5lserqta",
        "cosmos17xpfvakm2amg962yls6f84z3kell8c5lserqta"
      ],
      "coin_spent.amount": [
        "107upol",
        "36upol"
      ],
      "coin_received.receiver": [
        "cosmos1x69dz0c0emw8m2c6kp5v6c08kgjxmu30d2595n",
        "cosmos1ywtansy6ss0jtq8ckrcv6jzkps8yh8mfc8xucq"
      ],
      "coin_received.amount": [
        "107upol",
        "36upol"
      ],
      "transfer.recipient": [
        "cosmos1x69dz0c0emw8m2c6kp5v6c08kgjxmu30d2595n",
        "cosmos1ywtansy6ss0jtq8ckrcv6jzkps8yh8mfc8xucq"
      ],
      "transfer.sender": [
        "cosmos17xpfvakm2amg962yls6f84z3kell8c5lserqta",
        "cosmos17xpfvakm2amg962yls6f84z3kell8c5lserqta"
      ],
      "message.sender": [
        "cosmos17xpfvakm2amg962yls6f84z3kell8c5lserqta",
        "cosmos17xpfvakm2amg962yls6f84z3kell8c5lserqta"
      ],
      "tm.event": [
        "NewBlock"
      ],
      "transfer.amount": [
        "107upol",
        "36upol"
      ]
    }
  }
}

```