Skip to content

Commit 2df09f1

Browse files
author
Yucong Sun
authored
Cleanup account resource implementation (#11)
1 parent 35d1884 commit 2df09f1

File tree

4 files changed

+48
-95
lines changed

4 files changed

+48
-95
lines changed

libra-dev/include/data.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct CEventHandle {
1717
struct CDevAccountResource {
1818
uint64_t balance;
1919
uint64_t sequence;
20-
uint8_t* authentication_key;
20+
uint8_t authentication_key[32];
2121
bool delegated_key_rotation_capability;
2222
bool delegated_withdrawal_capability;
2323
struct CEventHandle sent_events;

libra-dev/src/account_resource.rs

+35-87
Original file line numberDiff line numberDiff line change
@@ -9,133 +9,74 @@ use libra_types::{
99
};
1010
use std::slice;
1111

12-
#[derive(Debug)]
13-
pub struct DevAccountResource {
14-
balance: u64,
15-
sequence_number: u64,
16-
authentication_key: ByteArray,
17-
delegated_key_rotation_capability: bool,
18-
delegated_withdrawal_capability: bool,
19-
sent_events: EventHandle,
20-
received_events: EventHandle,
21-
}
22-
23-
impl DevAccountResource {
24-
pub fn new(account_state_blob: AccountStateBlob) -> Self {
25-
let account_resource = get_account_resource_or_default(&Some(account_state_blob)).unwrap();
26-
27-
Self {
28-
balance: account_resource.balance(),
29-
sequence_number: account_resource.sequence_number(),
30-
authentication_key: account_resource.authentication_key().clone(),
31-
delegated_key_rotation_capability: account_resource.delegated_key_rotation_capability(),
32-
delegated_withdrawal_capability: account_resource.delegated_withdrawal_capability(),
33-
sent_events: account_resource.sent_events().clone(),
34-
received_events: account_resource.received_events().clone(),
35-
}
36-
}
37-
38-
/// Return the authentication_key field for the given AccountResource
39-
pub fn authentication_key(&self) -> &ByteArray {
40-
&self.authentication_key
41-
}
42-
43-
/// Return the balance field for the given AccountResource
44-
pub fn balance(&self) -> u64 {
45-
self.balance
46-
}
47-
48-
/// Return the sequence_number field for the given AccountResource
49-
pub fn sequence_number(&self) -> u64 {
50-
self.sequence_number
51-
}
52-
53-
/// Return the delegated_key_rotation_capability field for the given AccountResource
54-
pub fn delegated_key_rotation_capability(&self) -> bool {
55-
self.delegated_key_rotation_capability
56-
}
57-
58-
/// Return the delegated_withdrawal_capability field for the given AccountResource
59-
pub fn delegated_withdrawal_capability(&self) -> bool {
60-
self.delegated_withdrawal_capability
61-
}
62-
63-
/// Return the sent_events field for the given AccountResource
64-
pub fn sent_events(&self) -> &EventHandle {
65-
&self.sent_events
66-
}
67-
68-
/// Return the received_events field for the given AccountResource
69-
pub fn received_events(&self) -> &EventHandle {
70-
&self.received_events
71-
}
72-
}
73-
74-
#[no_mangle]
75-
pub unsafe extern "C" fn account_resource_free(account_resource: *mut CDevAccountResource) {
76-
let _: Box<DevAccountResource> = Box::from_raw(account_resource.cast());
77-
}
78-
7912
#[no_mangle]
80-
pub unsafe extern "C" fn account_resource_from_lcs(
13+
pub extern "C" fn account_resource_from_lcs(
8114
buf: *const u8,
8215
len: usize,
8316
) -> CDevAccountResource {
84-
let buf: &[u8] = slice::from_raw_parts(buf, len);
17+
let buf: &[u8] = unsafe { slice::from_raw_parts(buf, len) };
8518

86-
let account_state_blob: AccountStateBlob = AccountStateBlob::from(buf.to_vec());
87-
let account_resource = DevAccountResource::new(account_state_blob);
19+
let account_state_blob = AccountStateBlob::from(buf.to_vec());
20+
let account_resource =
21+
get_account_resource_or_default(&Some(account_state_blob)).expect("fixme!");
8822

89-
let authentication_key = account_resource.authentication_key.into_inner();
90-
let mut key_slice = authentication_key.into_boxed_slice();
91-
let authentication_key_ptr = key_slice.as_mut_ptr();
92-
std::mem::forget(key_slice);
23+
let mut authentication_key = [0u8; 32];
24+
authentication_key.copy_from_slice(account_resource.authentication_key().as_bytes());
9325

9426
let mut sent_key_copy = [0u8; EVENT_KEY_LENGTH];
95-
sent_key_copy.copy_from_slice(account_resource.sent_events.key().as_bytes());
27+
sent_key_copy.copy_from_slice(account_resource.sent_events().key().as_bytes());
9628

9729
let sent_events = CEventHandle {
98-
count: account_resource.sent_events.count(),
30+
count: account_resource.sent_events().count(),
9931
key: sent_key_copy,
10032
};
10133

10234
let mut received_key_copy = [0u8; EVENT_KEY_LENGTH];
103-
received_key_copy.copy_from_slice(account_resource.received_events.key().as_bytes());
35+
received_key_copy.copy_from_slice(account_resource.received_events().key().as_bytes());
10436

10537
let received_events = CEventHandle {
106-
count: account_resource.received_events.count(),
38+
count: account_resource.received_events().count(),
10739
key: received_key_copy,
10840
};
10941

110-
return CDevAccountResource {
111-
balance: account_resource.balance,
112-
sequence: account_resource.sequence_number,
113-
authentication_key: authentication_key_ptr,
114-
delegated_key_rotation_capability: account_resource.delegated_key_rotation_capability,
115-
delegated_withdrawal_capability: account_resource.delegated_withdrawal_capability,
42+
43+
let result = CDevAccountResource {
44+
balance: account_resource.balance(),
45+
sequence: account_resource.sequence_number(),
46+
delegated_key_rotation_capability: account_resource.delegated_key_rotation_capability(),
47+
delegated_withdrawal_capability: account_resource.delegated_withdrawal_capability(),
11648
sent_events,
11749
received_events,
50+
authentication_key,
11851
};
52+
53+
return result;
11954
}
12055

12156
/// Generate an AccountBlob and verify we can parse it
12257
#[test]
12358
fn test_get_account_resource() {
124-
use std::{collections::BTreeMap, convert::TryInto};
59+
use std::collections::BTreeMap;
12560
use libra_types::account_config::account_resource_path;
12661
use libra_types::account_config::AccountResource;
62+
use libra_crypto::ed25519::compat;
63+
use libra_types::account_address::AccountAddress;
64+
65+
66+
let keypair = compat::generate_keypair(None);
12767

12868
// Figure out how to use Libra code to generate AccountStateBlob directly, not involving btreemap directly
12969
let mut map: BTreeMap<Vec<u8>, Vec<u8>> = BTreeMap::new();
13070
let ar = AccountResource::new(
13171
987654321,
13272
123456789,
133-
ByteArray::new(vec![1,2,3,4]),
73+
ByteArray::new(AccountAddress::from_public_key(&keypair.1).to_vec()),
13474
true,
13575
false,
13676
EventHandle::default(),
13777
EventHandle::default(),
13878
);
79+
13980
// Fill in data
14081
map.insert(account_resource_path(), lcs::to_bytes(&ar ).expect("Must success"));
14182

@@ -147,4 +88,11 @@ fn test_get_account_resource() {
14788

14889
assert_eq!(result.balance, ar.balance());
14990
assert_eq!(result.sequence, ar.sequence_number());
91+
assert_eq!(result.authentication_key, ar.authentication_key().as_bytes() );
92+
assert_eq!(result.delegated_key_rotation_capability, ar.delegated_key_rotation_capability());
93+
assert_eq!(result.delegated_withdrawal_capability, ar.delegated_withdrawal_capability());
94+
assert_eq!(result.sent_events.count, ar.sent_events().count());
95+
assert_eq!(result.sent_events.key, ar.sent_events().key().as_bytes());
96+
assert_eq!(result.received_events.count, ar.received_events().count());
97+
assert_eq!(result.received_events.key, ar.received_events().key().as_bytes());
15098
}

libra-dev/src/data.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ fn bindgen_test_layout_CEventHandle() {
4444
pub struct CDevAccountResource {
4545
pub balance: u64,
4646
pub sequence: u64,
47-
pub authentication_key: *mut u8,
47+
pub authentication_key: [u8; 32usize],
4848
pub delegated_key_rotation_capability: bool,
4949
pub delegated_withdrawal_capability: bool,
5050
pub sent_events: CEventHandle,
@@ -54,7 +54,7 @@ pub struct CDevAccountResource {
5454
fn bindgen_test_layout_CDevAccountResource() {
5555
assert_eq!(
5656
::std::mem::size_of::<CDevAccountResource>(),
57-
112usize,
57+
136usize,
5858
concat!("Size of: ", stringify!(CDevAccountResource))
5959
);
6060
assert_eq!(
@@ -99,7 +99,7 @@ fn bindgen_test_layout_CDevAccountResource() {
9999
&(*(::std::ptr::null::<CDevAccountResource>())).delegated_key_rotation_capability
100100
as *const _ as usize
101101
},
102-
24usize,
102+
48usize,
103103
concat!(
104104
"Offset of field: ",
105105
stringify!(CDevAccountResource),
@@ -112,7 +112,7 @@ fn bindgen_test_layout_CDevAccountResource() {
112112
&(*(::std::ptr::null::<CDevAccountResource>())).delegated_withdrawal_capability
113113
as *const _ as usize
114114
},
115-
25usize,
115+
49usize,
116116
concat!(
117117
"Offset of field: ",
118118
stringify!(CDevAccountResource),
@@ -122,7 +122,7 @@ fn bindgen_test_layout_CDevAccountResource() {
122122
);
123123
assert_eq!(
124124
unsafe { &(*(::std::ptr::null::<CDevAccountResource>())).sent_events as *const _ as usize },
125-
32usize,
125+
56usize,
126126
concat!(
127127
"Offset of field: ",
128128
stringify!(CDevAccountResource),
@@ -134,7 +134,7 @@ fn bindgen_test_layout_CDevAccountResource() {
134134
unsafe {
135135
&(*(::std::ptr::null::<CDevAccountResource>())).received_events as *const _ as usize
136136
},
137-
72usize,
137+
96usize,
138138
concat!(
139139
"Offset of field: ",
140140
stringify!(CDevAccountResource),

libra-dev/src/lib.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
// Copyright (c) The Libra Core Contributors
22
// SPDX-License-Identifier: Apache-2.0
33

4-
pub mod account_resource;
4+
#![allow(non_upper_case_globals)]
5+
#![allow(non_camel_case_types)]
6+
#![allow(non_snake_case)]
57
mod data;
8+
9+
pub mod account_resource;
10+

0 commit comments

Comments
 (0)