Merge pull request #1012 from cosmos/dont-parse-evidence

Avoid parsing evidence from Tendermint
This commit is contained in:
Simon Warta 2022-01-26 13:43:54 +01:00 committed by GitHub
commit 5743d55229
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 29 deletions

View File

@ -17,8 +17,13 @@ and this project adheres to
- @cosmjs/stargate: The error messages for missing types in `AminoTypes` now - @cosmjs/stargate: The error messages for missing types in `AminoTypes` now
contain the type that was searched for ([#990]). contain the type that was searched for ([#990]).
- @cosmjs/tendermint-rpc: Change the `Evidence` type to `any` and avoid decoding
it. The structure we had before was outdated and trying to decode it led to
exceptions at runtime when a block with actual values was encountered.
([#980])
[#990]: https://github.com/cosmos/cosmjs/pull/990 [#990]: https://github.com/cosmos/cosmjs/pull/990
[#980]: https://github.com/cosmos/cosmjs/issues/980
## [0.27.0] - 2022-01-10 ## [0.27.0] - 2022-01-10

View File

@ -730,27 +730,9 @@ function decodeValidators(data: RpcValidatorsResponse): responses.ValidatorsResp
}; };
} }
interface RpcEvidence { // We lost track on how the evidence structure actually looks like.
readonly type: string; // This is any now and passed to the caller untouched.
readonly validator: RpcValidatorUpdate; type RpcEvidence = any;
readonly height: string;
readonly time: string;
readonly totalVotingPower: string;
}
function decodeEvidence(data: RpcEvidence): responses.Evidence {
return {
type: assertNotEmpty(data.type),
height: Integer.parse(assertNotEmpty(data.height)),
time: Integer.parse(assertNotEmpty(data.time)),
totalVotingPower: Integer.parse(assertNotEmpty(data.totalVotingPower)),
validator: decodeValidatorUpdate(data.validator),
};
}
function decodeEvidences(ev: readonly RpcEvidence[]): readonly responses.Evidence[] {
return assertArray(ev).map(decodeEvidence);
}
interface RpcBlock { interface RpcBlock {
readonly header: RpcHeader; readonly header: RpcHeader;
@ -759,6 +741,8 @@ interface RpcBlock {
/** Raw tx bytes, base64 encoded */ /** Raw tx bytes, base64 encoded */
readonly txs?: readonly string[]; readonly txs?: readonly string[];
}; };
// It's currently unclear why the deep nesting is requied.
// See https://github.com/tendermint/tendermint/issues/7697.
readonly evidence?: { readonly evidence?: {
readonly evidence?: readonly RpcEvidence[]; readonly evidence?: readonly RpcEvidence[];
}; };
@ -771,7 +755,9 @@ function decodeBlock(data: RpcBlock): responses.Block {
// { height: '0', round: 0, block_id: { hash: '', parts: [Object] }, signatures: [] } // { height: '0', round: 0, block_id: { hash: '', parts: [Object] }, signatures: [] }
lastCommit: data.last_commit.block_id.hash ? decodeCommit(assertObject(data.last_commit)) : null, lastCommit: data.last_commit.block_id.hash ? decodeCommit(assertObject(data.last_commit)) : null,
txs: data.data.txs ? assertArray(data.data.txs).map(fromBase64) : [], txs: data.data.txs ? assertArray(data.data.txs).map(fromBase64) : [],
evidence: data.evidence && may(decodeEvidences, data.evidence.evidence), // Lift up .evidence.evidence to just .evidence
// See https://github.com/tendermint/tendermint/issues/7697
evidence: data.evidence?.evidence,
}; };
} }

View File

@ -227,16 +227,17 @@ export interface Block {
*/ */
readonly lastCommit: Commit | null; readonly lastCommit: Commit | null;
readonly txs: readonly Uint8Array[]; readonly txs: readonly Uint8Array[];
// This field becomes non-optional in 0.28 (https://github.com/cosmos/cosmjs/issues/1011)
readonly evidence?: readonly Evidence[]; readonly evidence?: readonly Evidence[];
} }
export interface Evidence { /**
readonly type: string; * We lost track on how the evidence structure actually looks like.
readonly validator: Validator; * This is any now and passed to the caller untouched.
readonly height: number; *
readonly time: number; * See also https://github.com/cosmos/cosmjs/issues/980.
readonly totalVotingPower: number; */
} export type Evidence = any;
export interface Commit { export interface Commit {
readonly blockId: BlockId; readonly blockId: BlockId;