--- 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" ] } } } ```