From 0b44d82a461378a86797a097ab600d90f78657f6 Mon Sep 17 00:00:00 2001 From: Shashank Date: Mon, 27 Apr 2026 15:38:23 +0530 Subject: [PATCH 1/3] fix unknown fields --- docs/openrpc-specs/v0.json | 63 +++++++++++++++++- docs/openrpc-specs/v1.json | 63 +++++++++++++++++- scripts/tests/api_compare/docker-compose.yml | 3 + src/rpc/methods/common.rs | 3 + src/rpc/methods/eth.rs | 2 + src/rpc/methods/state.rs | 5 +- src/rpc/methods/state/types.rs | 65 ++++++++++++++++++- .../forest__rpc__tests__rpc__v0.snap | 43 ++++++++++++ .../forest__rpc__tests__rpc__v1.snap | 43 ++++++++++++ src/state_manager/utils.rs | 2 + 10 files changed, 285 insertions(+), 7 deletions(-) diff --git a/docs/openrpc-specs/v0.json b/docs/openrpc-specs/v0.json index f49979ad9700..47a1607a10a8 100644 --- a/docs/openrpc-specs/v0.json +++ b/docs/openrpc-specs/v0.json @@ -9556,6 +9556,18 @@ } ] }, + "IpldOps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TraceIpld" + } + }, + "Logs": { + "type": "array", + "items": { + "type": "string" + } + }, "Msg": { "$ref": "#/components/schemas/MessageTrace" }, @@ -10193,6 +10205,10 @@ "UpgradeWatermelonHeight": { "type": "integer", "format": "int64" + }, + "UpgradeXxHeight": { + "type": "integer", + "format": "int64" } }, "required": [ @@ -10227,7 +10243,8 @@ "UpgradeTuktukHeight", "UpgradeTeepHeight", "UpgradeTockHeight", - "UpgradeGoldenWeekHeight" + "UpgradeGoldenWeekHeight", + "UpgradeXxHeight" ] }, "GasTrace": { @@ -10868,6 +10885,11 @@ "ForkUpgradeParams": { "$ref": "#/components/schemas/ForkUpgradeParams" }, + "GenesisTimestamp": { + "type": "integer", + "format": "uint64", + "minimum": 0 + }, "NetworkName": { "type": "string" }, @@ -10882,7 +10904,8 @@ "ConsensusMinerMinPower", "PreCommitChallengeDelay", "ForkUpgradeParams", - "Eip155ChainID" + "Eip155ChainID", + "GenesisTimestamp" ] }, "NetworkVersion": { @@ -11418,6 +11441,12 @@ "APIVersion": { "$ref": "#/components/schemas/ShiftingVersion" }, + "Agent": { + "type": [ + "string", + "null" + ] + }, "BlockDelay": { "type": "integer", "format": "uint32", @@ -11917,6 +11946,36 @@ } ] }, + "TraceIpld": { + "description": "IPLD operation details attached to an [`ExecutionTrace`].", + "type": "object", + "properties": { + "Cid": { + "$ref": "#/components/schemas/Cid" + }, + "Op": { + "$ref": "#/components/schemas/TraceIpldOp" + }, + "Size": { + "type": "integer", + "format": "uint64", + "minimum": 0 + } + }, + "required": [ + "Op", + "Cid", + "Size" + ] + }, + "TraceIpldOp": { + "type": "string", + "enum": [ + "Get", + "Put", + "Unknown" + ] + }, "TraceResult": { "anyOf": [ { diff --git a/docs/openrpc-specs/v1.json b/docs/openrpc-specs/v1.json index ed232848eaea..dd6bb50f7e03 100644 --- a/docs/openrpc-specs/v1.json +++ b/docs/openrpc-specs/v1.json @@ -9770,6 +9770,18 @@ } ] }, + "IpldOps": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TraceIpld" + } + }, + "Logs": { + "type": "array", + "items": { + "type": "string" + } + }, "Msg": { "$ref": "#/components/schemas/MessageTrace" }, @@ -10407,6 +10419,10 @@ "UpgradeWatermelonHeight": { "type": "integer", "format": "int64" + }, + "UpgradeXxHeight": { + "type": "integer", + "format": "int64" } }, "required": [ @@ -10441,7 +10457,8 @@ "UpgradeTuktukHeight", "UpgradeTeepHeight", "UpgradeTockHeight", - "UpgradeGoldenWeekHeight" + "UpgradeGoldenWeekHeight", + "UpgradeXxHeight" ] }, "GasTrace": { @@ -11249,6 +11266,11 @@ "ForkUpgradeParams": { "$ref": "#/components/schemas/ForkUpgradeParams" }, + "GenesisTimestamp": { + "type": "integer", + "format": "uint64", + "minimum": 0 + }, "NetworkName": { "type": "string" }, @@ -11263,7 +11285,8 @@ "ConsensusMinerMinPower", "PreCommitChallengeDelay", "ForkUpgradeParams", - "Eip155ChainID" + "Eip155ChainID", + "GenesisTimestamp" ] }, "NetworkVersion": { @@ -11830,6 +11853,12 @@ "APIVersion": { "$ref": "#/components/schemas/ShiftingVersion" }, + "Agent": { + "type": [ + "string", + "null" + ] + }, "BlockDelay": { "type": "integer", "format": "uint32", @@ -12329,6 +12358,36 @@ } ] }, + "TraceIpld": { + "description": "IPLD operation details attached to an [`ExecutionTrace`].", + "type": "object", + "properties": { + "Cid": { + "$ref": "#/components/schemas/Cid" + }, + "Op": { + "$ref": "#/components/schemas/TraceIpldOp" + }, + "Size": { + "type": "integer", + "format": "uint64", + "minimum": 0 + } + }, + "required": [ + "Op", + "Cid", + "Size" + ] + }, + "TraceIpldOp": { + "type": "string", + "enum": [ + "Get", + "Put", + "Unknown" + ] + }, "TraceResult": { "anyOf": [ { diff --git a/scripts/tests/api_compare/docker-compose.yml b/scripts/tests/api_compare/docker-compose.yml index 0d4dc88029c1..38a8df93106c 100644 --- a/scripts/tests/api_compare/docker-compose.yml +++ b/scripts/tests/api_compare/docker-compose.yml @@ -266,6 +266,7 @@ services: - RUST_LOG=info,forest::tool::subcommands=debug - FOREST_RPC_DEFAULT_TIMEOUT=120 - FIL_PROOFS_PARAMETER_CACHE=${FIL_PROOFS_PARAMETER_CACHE} + - FOREST_STRICT_JSON=1 entrypoint: ["/bin/bash", "-c"] user: 0:0 command: @@ -310,6 +311,7 @@ services: - RUST_LOG=info,forest::tool::subcommands=debug - FOREST_RPC_DEFAULT_TIMEOUT=120 - FIL_PROOFS_PARAMETER_CACHE=${FIL_PROOFS_PARAMETER_CACHE} + - FOREST_STRICT_JSON=1 entrypoint: ["/bin/bash", "-c"] user: 0:0 command: @@ -379,6 +381,7 @@ services: - RUST_LOG=info,forest::tool::subcommands=debug - FOREST_RPC_DEFAULT_TIMEOUT=120 - FIL_PROOFS_PARAMETER_CACHE=${FIL_PROOFS_PARAMETER_CACHE} + - FOREST_STRICT_JSON=1 entrypoint: ["/bin/bash", "-c"] user: 0:0 command: diff --git a/src/rpc/methods/common.rs b/src/rpc/methods/common.rs index 75653a7fca99..0a78661d4bf4 100644 --- a/src/rpc/methods/common.rs +++ b/src/rpc/methods/common.rs @@ -55,6 +55,7 @@ impl RpcMethod<0> for Version { // For the API v0, we don't support it but it should be `1.5.0`. api_version: ShiftingVersion::new(2, 3, 0), block_delay: ctx.chain_config().block_delay_secs, + agent: None, }) } } @@ -106,6 +107,8 @@ pub struct PublicVersion { #[serde(rename = "APIVersion")] pub api_version: ShiftingVersion, pub block_delay: u32, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent: Option, } lotus_json_with_self!(PublicVersion); diff --git a/src/rpc/methods/eth.rs b/src/rpc/methods/eth.rs index b895184646da..f12d8ffa2ea2 100644 --- a/src/rpc/methods/eth.rs +++ b/src/rpc/methods/eth.rs @@ -4502,6 +4502,8 @@ mod test { invoked_actor: None, gas_charges: vec![], subcalls: vec![], + logs: vec![], + ipld_ops: vec![], } } diff --git a/src/rpc/methods/state.rs b/src/rpc/methods/state.rs index 55feef3a7862..09149fe0553d 100644 --- a/src/rpc/methods/state.rs +++ b/src/rpc/methods/state.rs @@ -3172,6 +3172,7 @@ impl RpcMethod<0> for StateGetNetworkParams { fork_upgrade_params: ForkUpgradeParams::try_from(config) .context("Failed to get fork upgrade params")?, eip155_chain_id: config.eth_chain_id, + genesis_timestamp: ctx.chain_store().genesis_block_header().timestamp, }; Ok(params) @@ -3190,6 +3191,7 @@ pub struct NetworkParams { fork_upgrade_params: ForkUpgradeParams, #[serde(rename = "Eip155ChainID")] eip155_chain_id: EthChainId, + genesis_timestamp: u64, } lotus_json_with_self!(NetworkParams); @@ -3229,7 +3231,7 @@ pub struct ForkUpgradeParams { upgrade_teep_height: ChainEpoch, upgrade_tock_height: ChainEpoch, upgrade_golden_week_height: ChainEpoch, - //upgrade_xxx_height: ChainEpoch, + upgrade_xx_height: ChainEpoch, } impl TryFrom<&ChainConfig> for ForkUpgradeParams { @@ -3279,6 +3281,7 @@ impl TryFrom<&ChainConfig> for ForkUpgradeParams { upgrade_tock_height: get_height(Tock)?, upgrade_golden_week_height: get_height(GoldenWeek)?, //upgrade_firehorse_height: get_height(FireHorse)?, + upgrade_xx_height: 999_999_999_999_999, }) } } diff --git a/src/rpc/methods/state/types.rs b/src/rpc/methods/state/types.rs index 4edd6a6e3575..e41bacf1f3e7 100644 --- a/src/rpc/methods/state/types.rs +++ b/src/rpc/methods/state/types.rs @@ -17,8 +17,9 @@ use crate::shim::{ use cid::Cid; use fvm_ipld_encoding::RawBytes; use num::Zero as _; -use schemars::JsonSchema; +use schemars::{JsonSchema, Schema, SchemaGenerator}; use serde::{Deserialize, Serialize}; +use serde_with::{DeserializeFromStr, SerializeDisplay}; #[derive(Debug, Serialize, Deserialize, Clone, JsonSchema, PartialEq)] #[serde(rename_all = "PascalCase")] @@ -139,7 +140,52 @@ impl MessageGasCost { } } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)] +/// IPLD operation kind for [`TraceIpld`]. +#[derive( + Debug, + Clone, + PartialEq, + Eq, + SerializeDisplay, + DeserializeFromStr, + strum::Display, + strum::EnumString, +)] +#[strum(serialize_all = "PascalCase")] +pub enum TraceIpldOp { + Get, + Put, + #[strum(to_string = "Unknown", default)] + Unknown(String), +} + +impl JsonSchema for TraceIpldOp { + fn schema_name() -> std::borrow::Cow<'static, str> { + "TraceIpldOp".into() + } + + fn json_schema(_: &mut SchemaGenerator) -> Schema { + schemars::json_schema!({ + "type": "string", + "enum": ["Get", "Put", "Unknown"], + }) + } +} + +/// IPLD operation details attached to an [`ExecutionTrace`]. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "PascalCase")] +pub struct TraceIpld { + pub op: TraceIpldOp, + #[serde(with = "crate::lotus_json")] + #[schemars(with = "LotusJson")] + pub cid: Cid, + pub size: u64, +} + +lotus_json_with_self!(TraceIpld); + +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] #[serde(rename_all = "PascalCase")] pub struct ExecutionTrace { pub msg: MessageTrace, @@ -149,6 +195,21 @@ pub struct ExecutionTrace { #[serde(with = "crate::lotus_json")] #[schemars(with = "LotusJson>")] pub subcalls: Vec, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub logs: Vec, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub ipld_ops: Vec, +} + +impl PartialEq for ExecutionTrace { + /// Ignore [`Self::logs`] and [`Self::ipld_ops`] as they are implementation-dependent + fn eq(&self, other: &Self) -> bool { + self.msg == other.msg + && self.msg_rct == other.msg_rct + && self.invoked_actor == other.invoked_actor + && self.gas_charges == other.gas_charges + && self.subcalls == other.subcalls + } } impl ExecutionTrace { diff --git a/src/rpc/snapshots/forest__rpc__tests__rpc__v0.snap b/src/rpc/snapshots/forest__rpc__tests__rpc__v0.snap index d3436b32a6ff..7ff2912c1eaf 100644 --- a/src/rpc/snapshots/forest__rpc__tests__rpc__v0.snap +++ b/src/rpc/snapshots/forest__rpc__tests__rpc__v0.snap @@ -5977,6 +5977,14 @@ components: anyOf: - $ref: "#/components/schemas/ActorTrace" - type: "null" + IpldOps: + type: array + items: + $ref: "#/components/schemas/TraceIpld" + Logs: + type: array + items: + type: string Msg: $ref: "#/components/schemas/MessageTrace" MsgRct: @@ -6449,6 +6457,9 @@ components: UpgradeWatermelonHeight: type: integer format: int64 + UpgradeXxHeight: + type: integer + format: int64 required: - UpgradeSmokeHeight - UpgradeBreezeHeight @@ -6482,6 +6493,7 @@ components: - UpgradeTeepHeight - UpgradeTockHeight - UpgradeGoldenWeekHeight + - UpgradeXxHeight GasTrace: type: object properties: @@ -6952,6 +6964,10 @@ components: minimum: 0 ForkUpgradeParams: $ref: "#/components/schemas/ForkUpgradeParams" + GenesisTimestamp: + type: integer + format: uint64 + minimum: 0 NetworkName: type: string PreCommitChallengeDelay: @@ -6964,6 +6980,7 @@ components: - PreCommitChallengeDelay - ForkUpgradeParams - Eip155ChainID + - GenesisTimestamp NetworkVersion: description: "Specifies the network version\n\n# Examples\n```\n# use forest::doctest_private::NetworkVersion;\nlet v0 = NetworkVersion::V0;\n\n// dereference to convert to FVM4\nassert_eq!(fvm_shared4::version::NetworkVersion::V0, *v0);\n\n// use `.into()` when FVM3 has to be specified.\nassert_eq!(fvm_shared3::version::NetworkVersion::V0, v0.into());\n\n// use `.into()` when FVM2 has to be specified.\nassert_eq!(fvm_shared2::version::NetworkVersion::V0, v0.into());\n```" type: integer @@ -7308,6 +7325,10 @@ components: properties: APIVersion: $ref: "#/components/schemas/ShiftingVersion" + Agent: + type: + - string + - "null" BlockDelay: type: integer format: uint32 @@ -7665,6 +7686,28 @@ components: anyOf: - $ref: "#/components/schemas/EthCallTraceAction" - $ref: "#/components/schemas/EthCreateTraceAction" + TraceIpld: + description: "IPLD operation details attached to an [`ExecutionTrace`]." + type: object + properties: + Cid: + $ref: "#/components/schemas/Cid" + Op: + $ref: "#/components/schemas/TraceIpldOp" + Size: + type: integer + format: uint64 + minimum: 0 + required: + - Op + - Cid + - Size + TraceIpldOp: + type: string + enum: + - Get + - Put + - Unknown TraceResult: anyOf: - $ref: "#/components/schemas/EthCallTraceResult" diff --git a/src/rpc/snapshots/forest__rpc__tests__rpc__v1.snap b/src/rpc/snapshots/forest__rpc__tests__rpc__v1.snap index 65ed1a0d30b6..14a40a8e331e 100644 --- a/src/rpc/snapshots/forest__rpc__tests__rpc__v1.snap +++ b/src/rpc/snapshots/forest__rpc__tests__rpc__v1.snap @@ -6096,6 +6096,14 @@ components: anyOf: - $ref: "#/components/schemas/ActorTrace" - type: "null" + IpldOps: + type: array + items: + $ref: "#/components/schemas/TraceIpld" + Logs: + type: array + items: + type: string Msg: $ref: "#/components/schemas/MessageTrace" MsgRct: @@ -6568,6 +6576,9 @@ components: UpgradeWatermelonHeight: type: integer format: int64 + UpgradeXxHeight: + type: integer + format: int64 required: - UpgradeSmokeHeight - UpgradeBreezeHeight @@ -6601,6 +6612,7 @@ components: - UpgradeTeepHeight - UpgradeTockHeight - UpgradeGoldenWeekHeight + - UpgradeXxHeight GasTrace: type: object properties: @@ -7168,6 +7180,10 @@ components: minimum: 0 ForkUpgradeParams: $ref: "#/components/schemas/ForkUpgradeParams" + GenesisTimestamp: + type: integer + format: uint64 + minimum: 0 NetworkName: type: string PreCommitChallengeDelay: @@ -7180,6 +7196,7 @@ components: - PreCommitChallengeDelay - ForkUpgradeParams - Eip155ChainID + - GenesisTimestamp NetworkVersion: description: "Specifies the network version\n\n# Examples\n```\n# use forest::doctest_private::NetworkVersion;\nlet v0 = NetworkVersion::V0;\n\n// dereference to convert to FVM4\nassert_eq!(fvm_shared4::version::NetworkVersion::V0, *v0);\n\n// use `.into()` when FVM3 has to be specified.\nassert_eq!(fvm_shared3::version::NetworkVersion::V0, v0.into());\n\n// use `.into()` when FVM2 has to be specified.\nassert_eq!(fvm_shared2::version::NetworkVersion::V0, v0.into());\n```" type: integer @@ -7544,6 +7561,10 @@ components: properties: APIVersion: $ref: "#/components/schemas/ShiftingVersion" + Agent: + type: + - string + - "null" BlockDelay: type: integer format: uint32 @@ -7901,6 +7922,28 @@ components: anyOf: - $ref: "#/components/schemas/EthCallTraceAction" - $ref: "#/components/schemas/EthCreateTraceAction" + TraceIpld: + description: "IPLD operation details attached to an [`ExecutionTrace`]." + type: object + properties: + Cid: + $ref: "#/components/schemas/Cid" + Op: + $ref: "#/components/schemas/TraceIpldOp" + Size: + type: integer + format: uint64 + minimum: 0 + required: + - Op + - Cid + - Size + TraceIpldOp: + type: string + enum: + - Get + - Put + - Unknown TraceResult: anyOf: - $ref: "#/components/schemas/EthCallTraceResult" diff --git a/src/state_manager/utils.rs b/src/state_manager/utils.rs index b8fbda9f7de0..53e3fcd865eb 100644 --- a/src/state_manager/utils.rs +++ b/src/state_manager/utils.rs @@ -669,6 +669,8 @@ pub mod structured { gas_charges, subcalls, invoked_actor: actor_trace, + logs: vec![], + ipld_ops: vec![], }); } } From 073a2c85dd9b1572f37bb7bf755640a37eb7d58e Mon Sep 17 00:00:00 2001 From: Shashank Date: Tue, 28 Apr 2026 02:13:27 +0530 Subject: [PATCH 2/3] fix MessageLotusJson --- src/lotus_json/message.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/lotus_json/message.rs b/src/lotus_json/message.rs index 306803b95821..86bd487eeb49 100644 --- a/src/lotus_json/message.rs +++ b/src/lotus_json/message.rs @@ -5,6 +5,7 @@ use super::*; use crate::shim::{address::Address, econ::TokenAmount, message::Message}; use fvm_ipld_encoding::RawBytes; +use ::cid::Cid; #[derive(Debug, PartialEq, Clone, Serialize, Deserialize, JsonSchema)] #[serde(rename_all = "PascalCase")] @@ -40,6 +41,14 @@ pub struct MessageLotusJson { default )] params: Option, + #[schemars(with = "LotusJson>")] + #[serde( + with = "crate::lotus_json", + rename = "CID", + default, + skip_serializing_if = "Option::is_none" + )] + cid: Option, } impl HasLotusJson for Message { @@ -47,6 +56,8 @@ impl HasLotusJson for Message { #[cfg(test)] fn snapshots() -> Vec<(serde_json::Value, Self)> { + let msg = Message::default(); + let cid = msg.cid(); vec![( json!({ "From": "f00", @@ -59,12 +70,14 @@ impl HasLotusJson for Message { "To": "f00", "Value": "0", "Version": 0, + "CID": { "/": cid.to_string() }, }), - Message::default(), + msg, )] } fn into_lotus_json(self) -> Self::LotusJson { + let cid = self.cid(); let Self { version, from, @@ -88,6 +101,7 @@ impl HasLotusJson for Message { gas_premium, method: method_num, params: Some(params), + cid: Some(cid), } } @@ -103,6 +117,7 @@ impl HasLotusJson for Message { gas_premium, method, params, + cid: _, } = lotus_json; Self { version, From bd9b661257dbe1eb097d68e3b2513170436be170 Mon Sep 17 00:00:00 2001 From: Shashank Date: Tue, 28 Apr 2026 06:49:52 +0530 Subject: [PATCH 3/3] fix test --- src/lotus_json/signed_message.rs | 3 +++ src/rpc/snapshots/forest__rpc__tests__rpc__v0.snap | 2 ++ src/rpc/snapshots/forest__rpc__tests__rpc__v1.snap | 2 ++ 3 files changed, 7 insertions(+) diff --git a/src/lotus_json/signed_message.rs b/src/lotus_json/signed_message.rs index 08d029c22693..2043f76c37f8 100644 --- a/src/lotus_json/signed_message.rs +++ b/src/lotus_json/signed_message.rs @@ -52,6 +52,9 @@ impl HasLotusJson for SignedMessage { "To": "f00", "Value": "0", "Version": 0, + "CID": { + "/": "bafy2bzaced3xdk2uf6azekyxgcttujvy3fzyeqmibtpjf2fxcpfdx2zcx4s3g" + }, }, "Signature": {"Type": 2, "Data": "aGVsbG8gd29ybGQh"}, "CID": { diff --git a/src/rpc/snapshots/forest__rpc__tests__rpc__v0.snap b/src/rpc/snapshots/forest__rpc__tests__rpc__v0.snap index 7ff2912c1eaf..7e4db4a3bfc3 100644 --- a/src/rpc/snapshots/forest__rpc__tests__rpc__v0.snap +++ b/src/rpc/snapshots/forest__rpc__tests__rpc__v0.snap @@ -6607,6 +6607,8 @@ components: Message: type: object properties: + CID: + $ref: "#/components/schemas/Nullable_Cid" From: $ref: "#/components/schemas/Address" GasFeeCap: diff --git a/src/rpc/snapshots/forest__rpc__tests__rpc__v1.snap b/src/rpc/snapshots/forest__rpc__tests__rpc__v1.snap index 14a40a8e331e..a1c17c160ede 100644 --- a/src/rpc/snapshots/forest__rpc__tests__rpc__v1.snap +++ b/src/rpc/snapshots/forest__rpc__tests__rpc__v1.snap @@ -6823,6 +6823,8 @@ components: Message: type: object properties: + CID: + $ref: "#/components/schemas/Nullable_Cid" From: $ref: "#/components/schemas/Address" GasFeeCap: