Skip to content

Commit c4a9c8b

Browse files
fee1-deadTyera Eulberg
and
Tyera Eulberg
authored
Remove dependency on hex (solana-labs#21567)
* Remove dependency on `hex` * Update lock file * Use `debug_struct` instead of own format * Share code, add test, and fix rent_epoch spelling Co-authored-by: Tyera Eulberg <[email protected]>
1 parent e130b2c commit c4a9c8b

File tree

8 files changed

+136
-49
lines changed

8 files changed

+136
-49
lines changed

Cargo.lock

-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

programs/bpf/Cargo.lock

-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sdk/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ digest = { version = "0.9.0", optional = true }
5151
ed25519-dalek = { version = "=1.0.1", optional = true }
5252
ed25519-dalek-bip32 = { version = "0.1.1", optional = true }
5353
generic-array = { version = "0.14.4", default-features = false, features = ["serde", "more_lengths"], optional = true }
54-
hex = "0.4.3"
5554
hmac = "0.11.0"
5655
itertools = "0.10.1"
5756
lazy_static = "1.4.0"

sdk/program/Cargo.toml

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ borsh-derive = "0.9.1"
1818
bs58 = "0.4.0"
1919
bytemuck = { version = "1.7.2", features = ["derive"] }
2020
bv = { version = "0.11.1", features = ["serde"] }
21-
hex = "0.4.2"
22-
itertools = "0.10.1"
21+
itertools = "0.10.1"
2322
lazy_static = "1.4.0"
2423
log = "0.4.14"
2524
num-derive = "0.3"

sdk/program/src/account_info.rs

+102-24
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use {
22
crate::{
3-
clock::Epoch, program_error::ProgramError, program_memory::sol_memset, pubkey::Pubkey,
3+
clock::Epoch, debug_account_data::*, program_error::ProgramError,
4+
program_memory::sol_memset, pubkey::Pubkey,
45
},
56
std::{
67
cell::{Ref, RefCell, RefMut},
7-
cmp, fmt,
8+
fmt,
89
rc::Rc,
910
},
1011
};
@@ -32,28 +33,19 @@ pub struct AccountInfo<'a> {
3233

3334
impl<'a> fmt::Debug for AccountInfo<'a> {
3435
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
35-
let data_len = cmp::min(64, self.data_len());
36-
let data_str = if data_len > 0 {
37-
format!(
38-
" data: {} ...",
39-
hex::encode(self.data.borrow()[..data_len].to_vec())
40-
)
41-
} else {
42-
"".to_string()
43-
};
44-
write!(
45-
f,
46-
"AccountInfo {{ key: {} owner: {} is_signer: {} is_writable: {} executable: {} rent_epoch: {} lamports: {} data.len: {} {} }}",
47-
self.key,
48-
self.owner,
49-
self.is_signer,
50-
self.is_writable,
51-
self.executable,
52-
self.rent_epoch,
53-
self.lamports(),
54-
self.data_len(),
55-
data_str,
56-
)
36+
let mut f = f.debug_struct("AccountInfo");
37+
38+
f.field("key", &self.key)
39+
.field("owner", &self.owner)
40+
.field("is_signer", &self.is_signer)
41+
.field("is_writable", &self.is_writable)
42+
.field("executable", &self.executable)
43+
.field("rent_epoch", &self.rent_epoch)
44+
.field("lamports", &self.lamports())
45+
.field("data.len", &self.data_len());
46+
debug_account_data(&self.data.borrow(), &mut f);
47+
48+
f.finish_non_exhaustive()
5749
}
5850
}
5951

@@ -415,4 +407,90 @@ mod tests {
415407
let info = AccountInfo::new(&k, false, false, l, d, &k, false, 0);
416408
assert_eq!(info.key, info.as_ref().key);
417409
}
410+
411+
#[test]
412+
fn test_account_info_debug_data() {
413+
let key = Pubkey::new_unique();
414+
let mut lamports = 42;
415+
let mut data = vec![5; 80];
416+
let data_str = format!("{:?}", Hex(&data[..MAX_DEBUG_ACCOUNT_DATA]));
417+
let info = AccountInfo::new(&key, false, false, &mut lamports, &mut data, &key, false, 0);
418+
assert_eq!(
419+
format!("{:?}", info),
420+
format!(
421+
"AccountInfo {{ \
422+
key: {}, \
423+
owner: {}, \
424+
is_signer: {}, \
425+
is_writable: {}, \
426+
executable: {}, \
427+
rent_epoch: {}, \
428+
lamports: {}, \
429+
data.len: {}, \
430+
data: {}, .. }}",
431+
key,
432+
key,
433+
false,
434+
false,
435+
false,
436+
0,
437+
lamports,
438+
data.len(),
439+
data_str,
440+
)
441+
);
442+
443+
let mut data = vec![5; 40];
444+
let data_str = format!("{:?}", Hex(&data));
445+
let info = AccountInfo::new(&key, false, false, &mut lamports, &mut data, &key, false, 0);
446+
assert_eq!(
447+
format!("{:?}", info),
448+
format!(
449+
"AccountInfo {{ \
450+
key: {}, \
451+
owner: {}, \
452+
is_signer: {}, \
453+
is_writable: {}, \
454+
executable: {}, \
455+
rent_epoch: {}, \
456+
lamports: {}, \
457+
data.len: {}, \
458+
data: {}, .. }}",
459+
key,
460+
key,
461+
false,
462+
false,
463+
false,
464+
0,
465+
lamports,
466+
data.len(),
467+
data_str,
468+
)
469+
);
470+
471+
let mut data = vec![];
472+
let info = AccountInfo::new(&key, false, false, &mut lamports, &mut data, &key, false, 0);
473+
assert_eq!(
474+
format!("{:?}", info),
475+
format!(
476+
"AccountInfo {{ \
477+
key: {}, \
478+
owner: {}, \
479+
is_signer: {}, \
480+
is_writable: {}, \
481+
executable: {}, \
482+
rent_epoch: {}, \
483+
lamports: {}, \
484+
data.len: {}, .. }}",
485+
key,
486+
key,
487+
false,
488+
false,
489+
false,
490+
0,
491+
lamports,
492+
data.len(),
493+
)
494+
);
495+
}
418496
}

sdk/program/src/debug_account_data.rs

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use std::{cmp, fmt};
2+
3+
pub(crate) const MAX_DEBUG_ACCOUNT_DATA: usize = 64;
4+
5+
pub fn debug_account_data(data: &[u8], f: &mut fmt::DebugStruct<'_, '_>) {
6+
let data_len = cmp::min(MAX_DEBUG_ACCOUNT_DATA, data.len());
7+
if data_len > 0 {
8+
f.field("data", &Hex(&data[..data_len]));
9+
}
10+
}
11+
12+
pub(crate) struct Hex<'a>(pub(crate) &'a [u8]);
13+
impl fmt::Debug for Hex<'_> {
14+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
15+
for &byte in self.0 {
16+
write!(f, "{:02x}", byte)?;
17+
}
18+
Ok(())
19+
}
20+
}

sdk/program/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ pub mod bpf_loader;
1313
pub mod bpf_loader_deprecated;
1414
pub mod bpf_loader_upgradeable;
1515
pub mod clock;
16+
pub mod debug_account_data;
1617
pub mod decode_error;
1718
pub mod ed25519_program;
1819
pub mod entrypoint;

sdk/src/account.rs

+12-18
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ use {
44
lamports::LamportsError,
55
pubkey::Pubkey,
66
},
7-
solana_program::{account_info::AccountInfo, sysvar::Sysvar},
7+
solana_program::{account_info::AccountInfo, debug_account_data::*, sysvar::Sysvar},
88
std::{
99
cell::{Ref, RefCell},
10-
cmp, fmt,
10+
fmt,
1111
rc::Rc,
1212
sync::Arc,
1313
},
@@ -280,22 +280,16 @@ impl ReadableAccount for Ref<'_, Account> {
280280
}
281281

282282
fn debug_fmt<T: ReadableAccount>(item: &T, f: &mut fmt::Formatter<'_>) -> fmt::Result {
283-
let data_len = cmp::min(64, item.data().len());
284-
let data_str = if data_len > 0 {
285-
format!(" data: {}", hex::encode(item.data()[..data_len].to_vec()))
286-
} else {
287-
"".to_string()
288-
};
289-
write!(
290-
f,
291-
"Account {{ lamports: {} data.len: {} owner: {} executable: {} rent_epoch: {}{} }}",
292-
item.lamports(),
293-
item.data().len(),
294-
item.owner(),
295-
item.executable(),
296-
item.rent_epoch(),
297-
data_str,
298-
)
283+
let mut f = f.debug_struct("Account");
284+
285+
f.field("lamports", &item.lamports())
286+
.field("data.len", &item.data().len())
287+
.field("owner", &item.owner())
288+
.field("executable", &item.executable())
289+
.field("rent_epoch", &item.rent_epoch());
290+
debug_account_data(item.data(), &mut f);
291+
292+
f.finish()
299293
}
300294

301295
impl fmt::Debug for Account {

0 commit comments

Comments
 (0)