MCPcopy Create free account
hub / github.com/base/triedb / from_bytes

Method from_bytes

src/node.rs:440–553  ·  view source on GitHub ↗
(bytes: &[u8])

Source from the content-addressed store, hash-verified

438 }
439
440 fn from_bytes(bytes: &[u8]) -> value::Result<Self> {
441 let flags = bytes[0];
442 match flags {
443 // StorageLeaf
444 0 => {
445 let prefix_length = bytes[1] as usize;
446 let packed_prefix_length = prefix_length.div_ceil(2);
447 let mut prefix = RawPath::unpack(&bytes[2..2 + packed_prefix_length]);
448 prefix.truncate(prefix_length);
449
450 let offset = 2 + packed_prefix_length;
451
452 let value_header = bytes[offset];
453 let value_rlp = if value_header <= 128 {
454 let mut value_rlp = ArrayVec::new();
455 value_rlp.push(value_header);
456 value_rlp
457 } else {
458 let value_len = value_header as usize - 128;
459 ArrayVec::from_iter(bytes[offset..offset + value_len + 1].iter().copied())
460 };
461
462 Ok(Self::new(prefix.try_into().unwrap(), NodeKind::StorageLeaf { value_rlp }))
463 }
464 // AccountLeaf
465 flags if flags & 1 == 1 => {
466 let has_storage = flags & 0b10000000 != 0;
467 let has_code = flags & 0b01000000 != 0;
468 let prefix_length = bytes[1] as usize;
469 let packed_prefix_length = prefix_length.div_ceil(2);
470 let mut prefix = RawPath::unpack(&bytes[2..2 + packed_prefix_length]);
471 prefix.truncate(prefix_length);
472
473 let mut offset = 2 + packed_prefix_length;
474
475 let nonce_header = bytes[offset];
476 let (nonce_rlp, nonce_len) = if nonce_header <= 128 {
477 let mut nonce_rlp = ArrayVec::new();
478 nonce_rlp.push(nonce_header);
479 (nonce_rlp, 1)
480 } else {
481 let nonce_len = nonce_header as usize - 128;
482 let nonce_rlp =
483 ArrayVec::from_iter(bytes[offset..offset + nonce_len + 1].iter().copied());
484 (nonce_rlp, nonce_len + 1)
485 };
486 offset += nonce_len;
487
488 let balance_header = bytes[offset];
489 let (balance_rlp, balance_len) = if balance_header <= 128 {
490 let mut balance_rlp = ArrayVec::new();
491 balance_rlp.push(balance_header);
492 (balance_rlp, 1)
493 } else {
494 let balance_len = balance_header as usize - 128;
495 let balance_rlp = ArrayVec::from_iter(
496 bytes[offset..offset + balance_len + 1].iter().copied(),
497 );

Callers

nothing calls this directly

Calls 6

unpackFunction · 0.85
truncateMethod · 0.80
try_intoMethod · 0.80
pushMethod · 0.45
iterMethod · 0.45
lenMethod · 0.45

Tested by

no test coverage detected