From a922cb1c04f8a61d4fc95140c194ed3970b8ef98 Mon Sep 17 00:00:00 2001 From: Konstantin Matsiushonak Date: Fri, 25 Mar 2022 09:23:53 +0300 Subject: [PATCH] feat(serde): show missed de fields in debug mode #6436 --- Cargo.lock | 13 ++++ chain/jsonrpc/client/src/lib.rs | 7 +- core/chain-configs/src/genesis_config.rs | 9 ++- core/crypto/Cargo.toml | 1 + core/crypto/src/key_file.rs | 5 +- core/crypto/src/signature.rs | 32 +++++++--- core/primitives-core/Cargo.toml | 2 + core/primitives-core/src/hash.rs | 12 ++-- core/primitives-core/src/serialize.rs | 28 ++++++++ core/primitives/src/runtime/config_store.rs | 22 +++++-- core/primitives/src/serialize.rs | 9 ++- core/store/src/db.rs | 4 +- .../genesis-csv-to-json/src/serde_with.rs | 3 +- nearcore/src/config.rs | 13 ++-- nearcore/src/migrations.rs | 14 ++-- nearcore/src/runtime/mod.rs | 5 +- .../test-contract-rs/Cargo.lock | 64 +++++++++++++++++-- .../test-contract-rs/Cargo.toml | 1 + runtime/near-vm-runner-standalone/src/main.rs | 15 +++-- .../near-vm-runner-standalone/src/script.rs | 7 +- test-utils/runtime-tester/src/run_test.rs | 9 ++- tools/rpctypegen/core/Cargo.toml | 1 + tools/rpctypegen/core/src/lib.rs | 32 ++++++---- tools/rpctypegen/macro/src/lib.rs | 5 +- 24 files changed, 245 insertions(+), 68 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index de69bb2af28..2565a917a96 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2669,6 +2669,7 @@ dependencies = [ "hex-literal", "libc", "near-account-id", + "near-primitives-core", "once_cell", "parity-secp256k1", "primitive-types", @@ -2998,8 +2999,10 @@ dependencies = [ "near-account-id", "num-rational", "serde", + "serde_ignored", "serde_json", "sha2", + "tracing", ] [[package]] @@ -3049,6 +3052,7 @@ dependencies = [ name = "near-rpc-error-core" version = "0.0.0" dependencies = [ + "near-primitives", "quote", "serde", "serde_json", @@ -4639,6 +4643,15 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_ignored" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c2c7d39d14f2f2ea82239de71594782f186fd03501ac81f0ce08e674819ff2f" +dependencies = [ + "serde", +] + [[package]] name = "serde_json" version = "1.0.68" diff --git a/chain/jsonrpc/client/src/lib.rs b/chain/jsonrpc/client/src/lib.rs index e5cfc648a07..0340edfa3dd 100644 --- a/chain/jsonrpc/client/src/lib.rs +++ b/chain/jsonrpc/client/src/lib.rs @@ -12,6 +12,7 @@ use near_jsonrpc_primitives::types::changes::{ }; use near_jsonrpc_primitives::types::validator::RpcValidatorsOrderedRequest; use near_primitives::hash::CryptoHash; +use near_primitives::serialize::DeserializedWithDebug; use near_primitives::types::{AccountId, BlockId, BlockReference, MaybeBlockId, ShardId}; use near_primitives::views::validator_stake_view::ValidatorStakeView; use near_primitives::views::{ @@ -92,7 +93,11 @@ where response.body().map(|body| match body { Ok(bytes) => String::from_utf8(bytes.to_vec()) .map_err(|err| format!("Error {:?} in {:?}", err, bytes)) - .and_then(|s| serde_json::from_str(&s).map_err(|err| err.to_string())), + .and_then(|s| { + serde_json::from_str::>(&s) + .map(|v| v.0) + .map_err(|err| err.to_string()) + }), Err(_) => Err("Payload error: {:?}".to_string()), }) }) diff --git a/core/chain-configs/src/genesis_config.rs b/core/chain-configs/src/genesis_config.rs index 760d486a23b..ee2c9235f35 100644 --- a/core/chain-configs/src/genesis_config.rs +++ b/core/chain-configs/src/genesis_config.rs @@ -10,6 +10,7 @@ use std::{fmt, io}; use anyhow::Context; use chrono::{DateTime, Utc}; +use near_primitives::serialize::DeserializedWithDebug; use num_rational::Rational; use serde::de::{self, DeserializeSeed, IgnoredAny, MapAccess, SeqAccess, Visitor}; use serde::{Deserialize, Deserializer, Serialize}; @@ -291,7 +292,9 @@ impl GenesisConfig { /// /// It panics if the contents cannot be parsed from JSON to the GenesisConfig structure. pub fn from_json(value: &str) -> Self { - serde_json::from_str(value).expect("Failed to deserialize the genesis config.") + serde_json::from_str::>(value) + .expect("Failed to deserialize the genesis config.") + .0 } /// Reads GenesisConfig from a JSON file. @@ -341,7 +344,9 @@ impl GenesisRecords { /// /// It panics if the contents cannot be parsed from JSON to the GenesisConfig structure. pub fn from_json(value: &str) -> Self { - serde_json::from_str(value).expect("Failed to deserialize the genesis records.") + serde_json::from_str::>(value) + .expect("Failed to deserialize the genesis records.") + .0 } /// Reads GenesisRecords from a JSON file. diff --git a/core/crypto/Cargo.toml b/core/crypto/Cargo.toml index 81afc5dc9ff..efac2bcea5f 100644 --- a/core/crypto/Cargo.toml +++ b/core/crypto/Cargo.toml @@ -31,6 +31,7 @@ subtle = "2.2" thiserror = "1" near-account-id = { path = "../account-id" } deepsize = { version = "0.2.0", optional = true } +near-primitives-core = { path = "../primitives-core" } [dev-dependencies] hex-literal = "0.2" diff --git a/core/crypto/src/key_file.rs b/core/crypto/src/key_file.rs index cc0d4047041..bebd5a43cf1 100644 --- a/core/crypto/src/key_file.rs +++ b/core/crypto/src/key_file.rs @@ -2,6 +2,7 @@ use std::fs::File; use std::io::{Read, Write}; use std::path::Path; +use near_primitives_core::serialize::DeserializedWithDebug; use serde::{Deserialize, Serialize}; use crate::{PublicKey, SecretKey}; @@ -32,6 +33,8 @@ impl KeyFile { let mut file = File::open(path).expect("Could not open key file."); let mut content = String::new(); file.read_to_string(&mut content).expect("Could not read from key file."); - serde_json::from_str(&content).expect("Failed to deserialize KeyFile") + serde_json::from_str::>(&content) + .expect("Failed to deserialize KeyFile") + .0 } } diff --git a/core/crypto/src/signature.rs b/core/crypto/src/signature.rs index 9d6aa6df184..2a228fcc8e8 100644 --- a/core/crypto/src/signature.rs +++ b/core/crypto/src/signature.rs @@ -892,6 +892,8 @@ impl<'de> serde::Deserialize<'de> for Signature { #[cfg(test)] mod tests { + use near_primitives_core::serialize::DeserializedWithDebug; + use super::*; #[test] @@ -912,22 +914,29 @@ mod tests { let pk = sk.public_key(); let expected = "\"ed25519:DcA2MzgpJbrUATQLLceocVckhhAqrkingax4oJ9kZ847\""; assert_eq!(serde_json::to_string(&pk).unwrap(), expected); - assert_eq!(pk, serde_json::from_str(expected).unwrap()); + assert_eq!(pk, serde_json::from_str::>(expected).unwrap().0); assert_eq!( pk, - serde_json::from_str("\"DcA2MzgpJbrUATQLLceocVckhhAqrkingax4oJ9kZ847\"").unwrap() + serde_json::from_str::>( + "\"DcA2MzgpJbrUATQLLceocVckhhAqrkingax4oJ9kZ847\"" + ) + .unwrap() + .0 ); let pk2: PublicKey = pk.to_string().parse().unwrap(); assert_eq!(pk, pk2); let expected = "\"ed25519:3KyUuch8pYP47krBq4DosFEVBMR5wDTMQ8AThzM8kAEcBQEpsPdYTZ2FPX5ZnSoLrerjwg66hwwJaW1wHzprd5k3\""; assert_eq!(serde_json::to_string(&sk).unwrap(), expected); - assert_eq!(sk, serde_json::from_str(expected).unwrap()); + assert_eq!(sk, serde_json::from_str::>(expected).unwrap().0); let signature = sk.sign(b"123"); let expected = "\"ed25519:3s1dvZdQtcAjBksMHFrysqvF63wnyMHPA4owNQmCJZ2EBakZEKdtMsLqrHdKWQjJbSRN6kRknN2WdwSBLWGCokXj\""; assert_eq!(serde_json::to_string(&signature).unwrap(), expected); - assert_eq!(signature, serde_json::from_str(expected).unwrap()); + assert_eq!( + signature, + serde_json::from_str::>(expected).unwrap().0 + ); let signature_str: String = signature.to_string(); let signature2: Signature = signature_str.parse().unwrap(); assert_eq!(signature, signature2); @@ -942,18 +951,21 @@ mod tests { let pk = sk.public_key(); let expected = "\"secp256k1:BtJtBjukUQbcipnS78adSwUKE38sdHnk7pTNZH7miGXfodzUunaAcvY43y37nm7AKbcTQycvdgUzFNWsd7dgPZZ\""; assert_eq!(serde_json::to_string(&pk).unwrap(), expected); - assert_eq!(pk, serde_json::from_str(expected).unwrap()); + assert_eq!(pk, serde_json::from_str::>(expected).unwrap().0); let pk2: PublicKey = pk.to_string().parse().unwrap(); assert_eq!(pk, pk2); let expected = "\"secp256k1:9ZNzLxNff6ohoFFGkbfMBAFpZgD7EPoWeiuTpPAeeMRV\""; assert_eq!(serde_json::to_string(&sk).unwrap(), expected); - assert_eq!(sk, serde_json::from_str(expected).unwrap()); + assert_eq!(sk, serde_json::from_str::>(expected).unwrap().0); let signature = sk.sign(&data); let expected = "\"secp256k1:7iA75xRmHw17MbUkSpHxBHFVTuJW6jngzbuJPJutwb3EAwVw21wrjpMHU7fFTAqH7D3YEma8utCdvdtsqcAWqnC7r\""; assert_eq!(serde_json::to_string(&signature).unwrap(), expected); - assert_eq!(signature, serde_json::from_str(expected).unwrap()); + assert_eq!( + signature, + serde_json::from_str::>(expected).unwrap().0 + ); let signature_str: String = signature.to_string(); let signature2: Signature = signature_str.parse().unwrap(); assert_eq!(signature, signature2); @@ -981,8 +993,8 @@ mod tests { #[test] fn test_invalid_data() { let invalid = "\"secp256k1:2xVqteU8PWhadHTv99TGh3bSf\""; - assert!(serde_json::from_str::(invalid).is_err()); - assert!(serde_json::from_str::(invalid).is_err()); - assert!(serde_json::from_str::(invalid).is_err()); + assert!(serde_json::from_str::>(invalid).is_err()); + assert!(serde_json::from_str::>(invalid).is_err()); + assert!(serde_json::from_str::>(invalid).is_err()); } } diff --git a/core/primitives-core/Cargo.toml b/core/primitives-core/Cargo.toml index 20f6ea5b63d..e40a1fa8e48 100644 --- a/core/primitives-core/Cargo.toml +++ b/core/primitives-core/Cargo.toml @@ -21,6 +21,8 @@ num-rational = { version = "0.3.1", features = ["serde"]} serde = { version = "1", features = ["derive"] } sha2 = "0.9" deepsize = { version = "0.2.0", optional = true } +tracing = "0.1.13" +serde_ignored = "0.1" near-account-id = { path = "../account-id" } diff --git a/core/primitives-core/src/hash.rs b/core/primitives-core/src/hash.rs index 28f46cffb5d..32a67a70555 100644 --- a/core/primitives-core/src/hash.rs +++ b/core/primitives-core/src/hash.rs @@ -142,6 +142,8 @@ pub fn hash(data: &[u8]) -> CryptoHash { #[cfg(test)] mod tests { + use crate::serialize::DeserializedWithDebug; + use super::*; #[derive(Deserialize, Serialize)] @@ -167,22 +169,22 @@ mod tests { #[test] fn test_deserialize_default() { let encoded = "{\"hash\":\"11111111111111111111111111111111\"}"; - let decoded: Struct = serde_json::from_str(encoded).unwrap(); + let decoded: Struct = serde_json::from_str::>(encoded).unwrap().0; assert_eq!(decoded.hash, CryptoHash::default()); } #[test] fn test_deserialize_success() { let encoded = "{\"hash\":\"CjNSmWXTWhC3EhRVtqLhRmWMTkRbU96wUACqxMtV1uGf\"}"; - let decoded: Struct = serde_json::from_str(encoded).unwrap(); + let decoded: Struct = serde_json::from_str::>(encoded).unwrap().0; assert_eq!(decoded.hash, hash(&[0, 1, 2])); } #[test] fn test_deserialize_not_base58() { let encoded = "\"---\""; - match serde_json::from_str(encoded) { - Ok(CryptoHash(_)) => assert!(false, "should have failed"), + match serde_json::from_str::>(encoded) { + Ok(DeserializedWithDebug(_)) => assert!(false, "should have failed"), Err(_) => (), } } @@ -196,7 +198,7 @@ mod tests { format!("\"{}\"", "1".repeat(33)), format!("\"{}\"", "1".repeat(1000)), ] { - match serde_json::from_str::(encoded) { + match serde_json::from_str::>(encoded) { Err(e) => if e.to_string() == "could not convert slice to array" {}, res => assert!(false, "should have failed with incorrect length error: {:?}", res), }; diff --git a/core/primitives-core/src/serialize.rs b/core/primitives-core/src/serialize.rs index 6b7f6501bba..5c6edf77c60 100644 --- a/core/primitives-core/src/serialize.rs +++ b/core/primitives-core/src/serialize.rs @@ -1,3 +1,7 @@ +use tracing::debug; + +use serde::{Deserialize, Deserializer}; + pub fn to_base>(input: T) -> String { bs58::encode(input).into_string() } @@ -212,3 +216,27 @@ pub mod option_u128_dec_format { } } } + +#[derive(Debug, Deserialize)] +pub struct DeserializedWithDebug(pub T); + +impl DeserializedWithDebug { + fn _deserialize<'de, D>(deserializer: D) -> Result + where + T: Deserialize<'de>, + D: Deserializer<'de>, + { + if cfg!(debug_assertions) { + let mut unused_fields = Vec::new(); + let de_result: Result = serde_ignored::deserialize(deserializer, |path| { + unused_fields.push(path.to_string()); + }); + + debug!("missed fields while deserializing: {:?}", unused_fields); + + return de_result; + } + + ::deserialize(deserializer).map(|v| v.0) + } +} diff --git a/core/primitives/src/runtime/config_store.rs b/core/primitives/src/runtime/config_store.rs index 9a187f6472d..bcac7555f00 100644 --- a/core/primitives/src/runtime/config_store.rs +++ b/core/primitives/src/runtime/config_store.rs @@ -1,3 +1,5 @@ +use near_primitives_core::serialize::DeserializedWithDebug; + use crate::runtime::config::RuntimeConfig; use crate::types::ProtocolVersion; use std::collections::BTreeMap; @@ -44,7 +46,12 @@ impl RuntimeConfigStore { pub fn new(genesis_runtime_config: Option<&RuntimeConfig>) -> Self { let mut store = BTreeMap::from_iter(CONFIGS.iter().cloned().map(|(protocol_version, config_bytes)| { - (protocol_version, Arc::new(serde_json::from_slice(config_bytes).unwrap())) + ( + protocol_version, + Arc::new( + serde_json::from_slice::>(config_bytes).unwrap().0, + ), + ) })); if let Some(runtime_config) = genesis_runtime_config { @@ -92,6 +99,7 @@ mod tests { use crate::version::ProtocolFeature::LowerDataReceiptAndEcrecoverBaseCost; use crate::version::ProtocolFeature::LowerStorageCost; use near_primitives_core::hash::hash; + use near_primitives_core::serialize::DeserializedWithDebug; const GENESIS_PROTOCOL_VERSION: ProtocolVersion = 29; const RECEIPTS_DEPTH: u64 = 63; @@ -99,7 +107,9 @@ mod tests { fn check_config(protocol_version: ProtocolVersion, config_bytes: &[u8]) { assert_eq!( RuntimeConfigStore::new(None).get_config(protocol_version).as_ref(), - &serde_json::from_slice::(config_bytes).unwrap() + &serde_json::from_slice::>(config_bytes) + .unwrap() + .0 ); } @@ -203,14 +213,18 @@ If you add new config version, add a missing hash to the end of `expected_hashes assert_eq!(config.account_creation_config.min_allowed_top_level_account_length, 0); assert_ne!( config.as_ref(), - &serde_json::from_slice::(CONFIGS[1].1).unwrap() + &serde_json::from_slice::>(CONFIGS[1].1) + .unwrap() + .0 ); let config = store.get_config(LowerDataReceiptAndEcrecoverBaseCost.protocol_version()); assert_eq!(config.account_creation_config.min_allowed_top_level_account_length, 32); assert_eq!( config.as_ref(), - &serde_json::from_slice::(CONFIGS[2].1).unwrap() + &serde_json::from_slice::>(CONFIGS[2].1) + .unwrap() + .0 ); } diff --git a/core/primitives/src/serialize.rs b/core/primitives/src/serialize.rs index f7494b90789..066d4ee66f5 100644 --- a/core/primitives/src/serialize.rs +++ b/core/primitives/src/serialize.rs @@ -30,7 +30,8 @@ mod tests { #[test] fn test_deserialize_some() { let encoded = "{\"data\":\"ChQe\"}"; - let decoded: OptionBytesStruct = serde_json::from_str(encoded).unwrap(); + let decoded: OptionBytesStruct = + serde_json::from_str::>(encoded).unwrap().0; assert_eq!(decoded.data, Some(vec![10, 20, 30])); } @@ -44,7 +45,8 @@ mod tests { #[test] fn test_deserialize_none() { let encoded = "{\"data\":null}"; - let decoded: OptionBytesStruct = serde_json::from_str(encoded).unwrap(); + let decoded: OptionBytesStruct = + serde_json::from_str::>(encoded).unwrap().0; assert_eq!(decoded.data, None); } @@ -58,7 +60,8 @@ mod tests { #[test] fn test_deserialize_store_key() { let encoded = "{\"store_key\":\"ChQe\"}"; - let decoded: StoreKeyStruct = serde_json::from_str(encoded).unwrap(); + let decoded: StoreKeyStruct = + serde_json::from_str::>(encoded).unwrap().0; assert_eq!(decoded.store_key, StoreKey::from(vec![10, 20, 30])); } } diff --git a/core/store/src/db.rs b/core/store/src/db.rs index 72965dde348..bf809fedf4d 100644 --- a/core/store/src/db.rs +++ b/core/store/src/db.rs @@ -1,5 +1,6 @@ use crate::db::refcount::merge_refcounted_records; use borsh::{BorshDeserialize, BorshSerialize}; +use near_primitives::serialize::DeserializedWithDebug; use near_primitives::version::DbVersion; use once_cell::sync::Lazy; use rocksdb::checkpoint::Checkpoint; @@ -869,11 +870,12 @@ impl RocksDB { pub fn get_version>(path: P) -> Result { let db = RocksDB::new_read_only(path)?; db.get(DBCol::ColDbVersion, VERSION_KEY).map(|result| { - serde_json::from_slice( + serde_json::from_slice::>( &result .expect("Failed to find version in first column. Database must be corrupted."), ) .expect("Failed to parse version. Database must be corrupted.") + .0 }) } diff --git a/genesis-tools/genesis-csv-to-json/src/serde_with.rs b/genesis-tools/genesis-csv-to-json/src/serde_with.rs index 4633e91cc53..7ab6d8480ed 100644 --- a/genesis-tools/genesis-csv-to-json/src/serde_with.rs +++ b/genesis-tools/genesis-csv-to-json/src/serde_with.rs @@ -57,6 +57,7 @@ pub mod pks_as_str { #[cfg(test)] mod tests { use near_crypto::PublicKey; + use near_primitives::serialize::DeserializedWithDebug; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] @@ -68,6 +69,6 @@ mod tests { #[test] fn test_deserialize_pubkeys_with_whitespace() { let test_str = r#"{"keys": "ed25519:EsjyvmBb2ESGiyjPHMBUnTGCe1P6hPjmxxY2b2hrTBAv, ed25519:2djz3u3CjV4dpDZryudwA4JNDcGnVwNtphjZQbUzrhLE, ed25519:2f9Zv5kuyuPM5DCyEP5pSqg58NQ8Ct9uSRerZXnCS9fK,ed25519:3xCFas58RKvD5UpF9GqvEb6q9rvgfbEJPhLf85zc4HpC, ed25519:4588iQsoG9mWjDPLbipQvaGNqo9UCphGsgon8u2yXArE,ed25519:5Me9NjXh3br1Rp2zvqaTUo8qvXcDPZ3YxafewzUKW7zc,\ned25519:93A8upKEMoZG9bBFyXJjQhzcMJBvSHHtPjZP3173FARk"}"#; - serde_json::from_str::(test_str).unwrap(); + serde_json::from_str::>(test_str).unwrap().0; } } diff --git a/nearcore/src/config.rs b/nearcore/src/config.rs index 4fdaf569e51..de9c20b890b 100644 --- a/nearcore/src/config.rs +++ b/nearcore/src/config.rs @@ -9,6 +9,7 @@ use std::time::Duration; use anyhow::{anyhow, bail, Context}; use hyper::body::HttpBody; use indicatif::{ProgressBar, ProgressStyle}; +use near_primitives::serialize::DeserializedWithDebug; use near_primitives::time::Clock; use num_rational::Rational; use serde::{Deserialize, Serialize}; @@ -489,9 +490,9 @@ impl Config { pub fn from_file(path: &Path) -> anyhow::Result { let s = std::fs::read_to_string(path) .with_context(|| format!("Failed to read config from {}", path.display()))?; - let config = serde_json::from_str(&s) + let config = serde_json::from_str::>(&s) .with_context(|| format!("Failed to deserialize config from {}", path.display()))?; - Ok(config) + Ok(config.0) } pub fn write_to_file(&self, path: &Path) -> std::io::Result<()> { @@ -928,7 +929,9 @@ pub fn mainnet_genesis() -> Genesis { lazy_static_include::lazy_static_include_bytes! { MAINNET_GENESIS_JSON => "res/mainnet_genesis.json", }; - serde_json::from_slice(*MAINNET_GENESIS_JSON).expect("Failed to deserialize mainnet genesis") + serde_json::from_slice::>(*MAINNET_GENESIS_JSON) + .expect("Failed to deserialize mainnet genesis") + .0 } /// Initializes genesis and client configs and stores in the given folder @@ -1602,7 +1605,9 @@ impl NodeKeyFile { let mut file = File::open(path).expect("Could not open key file."); let mut content = String::new(); file.read_to_string(&mut content).expect("Could not read from key file."); - serde_json::from_str(&content).expect("Failed to deserialize KeyFile") + serde_json::from_str::>(&content) + .expect("Failed to deserialize KeyFile") + .0 } } diff --git a/nearcore/src/migrations.rs b/nearcore/src/migrations.rs index 545b6f8a4c7..b044077865d 100644 --- a/nearcore/src/migrations.rs +++ b/nearcore/src/migrations.rs @@ -10,6 +10,7 @@ use near_primitives::hash::CryptoHash; use near_primitives::merkle::MerklePath; use near_primitives::receipt::ReceiptResult; use near_primitives::runtime::migration_data::MigrationData; +use near_primitives::serialize::DeserializedWithDebug; use near_primitives::shard_layout::ShardUId; use near_primitives::sharding::{ChunkHash, ShardChunkHeader, ShardChunkV1}; use near_primitives::transaction::{ @@ -348,8 +349,10 @@ pub fn migrate_23_to_24(path: &Path, near_config: &NearConfig) { let store = create_store(path); if &near_config.genesis.config.chain_id == "mainnet" { let mut store_update = store.store_update(); - let restored_receipts: ReceiptResult = serde_json::from_slice(&MAINNET_RESTORED_RECEIPTS) - .expect("File with receipts restored after apply_chunks fix have to be correct"); + let restored_receipts: ReceiptResult = + serde_json::from_slice::>(&MAINNET_RESTORED_RECEIPTS) + .expect("File with receipts restored after apply_chunks fix have to be correct") + .0; for receipt in restored_receipts.get(&0u64).unwrap().iter() { let bytes = receipt.try_to_vec().expect("Borsh cannot fail"); store_update.update_refcount(ColReceipts, receipt.get_hash().as_ref(), &bytes, 1); @@ -530,7 +533,9 @@ pub fn load_migration_data(chain_id: &str) -> MigrationData { let is_mainnet = chain_id == "mainnet"; MigrationData { storage_usage_delta: if is_mainnet { - serde_json::from_slice(&MAINNET_STORAGE_USAGE_DELTA).unwrap() + serde_json::from_slice::>(&MAINNET_STORAGE_USAGE_DELTA) + .unwrap() + .0 } else { Vec::new() }, @@ -540,8 +545,9 @@ pub fn load_migration_data(chain_id: &str) -> MigrationData { 0 }, restored_receipts: if is_mainnet { - serde_json::from_slice(&MAINNET_RESTORED_RECEIPTS) + serde_json::from_slice::>(&MAINNET_RESTORED_RECEIPTS) .expect("File with receipts restored after apply_chunks fix have to be correct") + .0 } else { ReceiptResult::default() }, diff --git a/nearcore/src/runtime/mod.rs b/nearcore/src/runtime/mod.rs index 878348bbc51..d0e8741c9d8 100644 --- a/nearcore/src/runtime/mod.rs +++ b/nearcore/src/runtime/mod.rs @@ -28,6 +28,7 @@ use near_primitives::epoch_manager::{EpochConfig, ShardConfig}; use near_primitives::errors::{EpochError, InvalidTxError, RuntimeError}; use near_primitives::hash::{hash, CryptoHash}; use near_primitives::receipt::Receipt; +use near_primitives::serialize::DeserializedWithDebug; use near_primitives::sharding::ChunkHash; use near_primitives::state_record::{state_record_to_account_id, StateRecord}; use near_primitives::transaction::SignedTransaction; @@ -247,7 +248,9 @@ impl NightshadeRuntime { match chain_id { "testnet" => { let genesis_runtime_config = - serde_json::from_slice(INITIAL_TESTNET_CONFIG).unwrap(); + serde_json::from_slice::>(INITIAL_TESTNET_CONFIG) + .unwrap() + .0; RuntimeConfigStore::new(Some(&genesis_runtime_config)) } _ => RuntimeConfigStore::new(None), diff --git a/runtime/near-test-contracts/test-contract-rs/Cargo.lock b/runtime/near-test-contracts/test-contract-rs/Cargo.lock index 26eebcc6697..e71f7755a32 100644 --- a/runtime/near-test-contracts/test-contract-rs/Cargo.lock +++ b/runtime/near-test-contracts/test-contract-rs/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "base64" version = "0.13.0" @@ -8,9 +10,9 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "cfg-if" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] name = "itoa" @@ -20,9 +22,9 @@ checksum = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" [[package]] name = "libc" -version = "0.2.62" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba" +checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" [[package]] name = "memory_units" @@ -30,6 +32,24 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4af2ec4714533fcdf07e886f17025ace8b997b9ce51204ee69b6da831c3da57" +dependencies = [ + "proc-macro2", +] + [[package]] name = "ryu" version = "1.0.0" @@ -38,9 +58,23 @@ checksum = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997" [[package]] name = "serde" -version = "1.0.101" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9796c9b7ba2ffe7a9ce53c2287dfc48080f4b2b362fcc245a259b3a7201119dd" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "serde_json" @@ -53,15 +87,33 @@ dependencies = [ "serde", ] +[[package]] +name = "syn" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "test-contract-rs" version = "0.1.0" dependencies = [ "base64", + "serde", "serde_json", "wee_alloc", ] +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + [[package]] name = "wee_alloc" version = "0.4.5" diff --git a/runtime/near-test-contracts/test-contract-rs/Cargo.toml b/runtime/near-test-contracts/test-contract-rs/Cargo.toml index e2ceac0dc69..99c007a4868 100644 --- a/runtime/near-test-contracts/test-contract-rs/Cargo.toml +++ b/runtime/near-test-contracts/test-contract-rs/Cargo.toml @@ -12,6 +12,7 @@ crate-type = ["cdylib"] [dependencies] base64 = "0.13" +serde = { version = "1", features = ["derive"] } serde_json = "1" wee_alloc = { version = "0.4.5", default-features = false } diff --git a/runtime/near-vm-runner-standalone/src/main.rs b/runtime/near-vm-runner-standalone/src/main.rs index cf89f4df066..66647a4f5e8 100644 --- a/runtime/near-vm-runner-standalone/src/main.rs +++ b/runtime/near-vm-runner-standalone/src/main.rs @@ -4,6 +4,7 @@ mod script; use crate::script::Script; use clap::Parser; +use near_primitives::serialize::DeserializedWithDebug; use near_vm_logic::VMOutcome; use near_vm_logic::{mocks::mock_external::Receipt, ProtocolVersion}; use near_vm_runner::internal::VMKind; @@ -127,7 +128,7 @@ fn main() { _ => (), }; if let Some(config) = &cli_args.config { - script.vm_config(serde_json::from_str(config).unwrap()); + script.vm_config(serde_json::from_str::>(config).unwrap().0); } if let Some(path) = &cli_args.config_file { script.vm_config_from_file(path); @@ -137,7 +138,8 @@ fn main() { } if let Some(state_str) = &cli_args.state { - script.initial_state(serde_json::from_str(state_str).unwrap()); + script + .initial_state(serde_json::from_str::>(state_str).unwrap().0); } if let Some(path) = &cli_args.state_file { script.initial_state_from_file(path); @@ -149,7 +151,7 @@ fn main() { let step = script.step(contract, &cli_args.method_name); if let Some(value) = &cli_args.context { - step.context(serde_json::from_str(value).unwrap()); + step.context(serde_json::from_str::>(value).unwrap().0); } if let Some(path) = &cli_args.context_file { step.context_from_file(path); @@ -159,8 +161,11 @@ fn main() { step.input(value.as_bytes().to_vec()); } - let promise_results = - cli_args.promise_results.iter().map(|it| serde_json::from_str(it).unwrap()).collect(); + let promise_results = cli_args + .promise_results + .iter() + .map(|it| serde_json::from_str::>(it).unwrap().0) + .collect(); step.promise_results(promise_results); let mut results = script.run(); diff --git a/runtime/near-vm-runner-standalone/src/script.rs b/runtime/near-vm-runner-standalone/src/script.rs index 27c850558ef..feaf4150488 100644 --- a/runtime/near-vm-runner-standalone/src/script.rs +++ b/runtime/near-vm-runner-standalone/src/script.rs @@ -3,6 +3,7 @@ use std::path::Path; use near_primitives::contract::ContractCode; use near_primitives::runtime::config_store::RuntimeConfigStore; +use near_primitives::serialize::DeserializedWithDebug; use near_primitives::types::CompiledContractCache; use near_primitives::version::PROTOCOL_VERSION; use near_vm_logic::mocks::mock_external::MockedExternal; @@ -81,7 +82,7 @@ impl Script { pub(crate) fn vm_config_from_file(&mut self, path: &Path) { let data = fs::read(path).unwrap(); - let vm_config = serde_json::from_slice(&data).unwrap(); + let vm_config = serde_json::from_slice::>(&data).unwrap().0; self.vm_config(vm_config) } @@ -101,7 +102,7 @@ impl Script { pub(crate) fn initial_state_from_file(&mut self, path: &Path) { let data = fs::read(path).unwrap(); - let state = serde_json::from_slice(&data).unwrap(); + let state = serde_json::from_slice::>(&data).unwrap().0; self.initial_state(state) } @@ -159,7 +160,7 @@ impl Step { } pub(crate) fn context_from_file(&mut self, path: &Path) -> &mut Step { let data = fs::read(path).unwrap(); - let context = serde_json::from_slice(&data).unwrap(); + let context = serde_json::from_slice::>(&data).unwrap().0; self.context(context) } pub(crate) fn input(&mut self, input: Vec) -> &mut Step { diff --git a/test-utils/runtime-tester/src/run_test.rs b/test-utils/runtime-tester/src/run_test.rs index 74156bd0a99..24147e82e57 100644 --- a/test-utils/runtime-tester/src/run_test.rs +++ b/test-utils/runtime-tester/src/run_test.rs @@ -9,6 +9,7 @@ use near_client::test_utils::TestEnv; use near_client_primitives::types::Error; use near_crypto::InMemorySigner; use near_primitives::hash::CryptoHash; +use near_primitives::serialize::DeserializedWithDebug; use near_primitives::transaction::{Action, SignedTransaction}; use near_primitives::types::{AccountId, BlockHeight, BlockHeightDelta, Gas, Nonce}; use near_store::create_store; @@ -29,8 +30,9 @@ pub struct ScenarioResult { } impl Scenario { - pub fn from_file(path: &Path) -> io::Result { - serde_json::from_str::(&std::fs::read_to_string(path)?).map_err(io::Error::from) + pub fn from_file(path: &Path) -> io::Result> { + serde_json::from_str::>(&std::fs::read_to_string(path)?) + .map_err(io::Error::from) } pub fn run(&self) -> ScenarioResult { @@ -194,7 +196,8 @@ mod test { init_test_logger(); let path = Path::new("./fuzz/scenario.json"); - let scenario = Scenario::from_file(path).expect("Failed to deserialize the scenario file."); + let scenario = + Scenario::from_file(path).expect("Failed to deserialize the scenario file.").0; let starting_time = Instant::now(); let runtime_stats = scenario.run().result.expect("Error while running scenario"); info!("Time to run: {:?}", starting_time.elapsed()); diff --git a/tools/rpctypegen/core/Cargo.toml b/tools/rpctypegen/core/Cargo.toml index 516bb16f5c8..08d07f63e30 100644 --- a/tools/rpctypegen/core/Cargo.toml +++ b/tools/rpctypegen/core/Cargo.toml @@ -19,6 +19,7 @@ quote = "1.0" [dev-dependencies] serde_json = {version = "1.0", features = ["preserve_order"]} +near-primitives = { path = "../../../core/primitives"} [features] test = [] diff --git a/tools/rpctypegen/core/src/lib.rs b/tools/rpctypegen/core/src/lib.rs index ae4e245ec94..09ac056b696 100644 --- a/tools/rpctypegen/core/src/lib.rs +++ b/tools/rpctypegen/core/src/lib.rs @@ -102,7 +102,9 @@ pub fn parse_error_type(schema: &mut BTreeMap, input: &Derive #[cfg(test)] mod tests { use super::*; + use near_primitives::serialize::DeserializedWithDebug; use quote::quote; + #[test] fn should_merge_kind() { let mut schema = BTreeMap::default(); @@ -114,8 +116,9 @@ mod tests { }) .unwrap(); parse_error_type(&mut schema, &error_type); - let expected: BTreeMap = serde_json::from_str( - r#" + let expected: BTreeMap = + serde_json::from_str::>( + r#" { "ActionError": { "name": "ActionError", @@ -126,8 +129,9 @@ mod tests { } } "#, - ) - .unwrap(); + ) + .unwrap() + .0; assert_eq!( serde_json::to_string(&expected).unwrap(), serde_json::to_string(&schema).unwrap() @@ -138,8 +142,9 @@ mod tests { } }) .unwrap(); - let expected: BTreeMap = serde_json::from_str( - r#" + let expected: BTreeMap = + serde_json::from_str::>( + r#" { "ActionError": { "name": "ActionError", @@ -157,8 +162,9 @@ mod tests { } } "#, - ) - .unwrap(); + ) + .unwrap() + .0; parse_error_type(&mut schema, &error_type_kind); assert_eq!( serde_json::to_string(&expected).unwrap(), @@ -218,8 +224,9 @@ mod tests { }) .unwrap(), ); - let expected: BTreeMap = serde_json::from_str( - r#" + let expected: BTreeMap = + serde_json::from_str::>( + r#" { "AccessKeyNotFound": { "name": "AccessKeyNotFound", @@ -276,8 +283,9 @@ mod tests { "props": {} } }"#, - ) - .unwrap(); + ) + .unwrap() + .0; assert_eq!( serde_json::to_string(&expected).unwrap(), serde_json::to_string(&schema).unwrap() diff --git a/tools/rpctypegen/macro/src/lib.rs b/tools/rpctypegen/macro/src/lib.rs index 2838b47e515..c1a3d43e1b9 100644 --- a/tools/rpctypegen/macro/src/lib.rs +++ b/tools/rpctypegen/macro/src/lib.rs @@ -38,8 +38,9 @@ impl Drop for Schema { let schema_json = serde_json::to_value(self).expect("Schema serialize failed"); let new_schema_json = if let Ok(data) = std::fs::read(filename) { // merge to the existing file - let mut existing_schema = serde_json::from_slice::(&data) - .expect("cannot deserialize target/existing_schema.json"); + let mut existing_schema = serde_json::from_slice::>(&data) + .expect("cannot deserialize target/existing_schema.json") + .0; merge(&mut existing_schema, &schema_json); existing_schema } else {