Skip to content

Commit c84476a

Browse files
authored
[libra-dev] Adding account resource API (#3)
1 parent a9ca0ef commit c84476a

File tree

9 files changed

+1901
-7
lines changed

9 files changed

+1901
-7
lines changed

libra-dev/Cargo.lock

+1,518
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

libra-dev/Cargo.toml

+5
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,8 @@ edition = "2018"
77
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
88

99
[dependencies]
10+
libra-types = { git = "https://github.com/libra/libra.git", branch = "testnet" }
11+
libra-crypto = { git = "https://github.com/libra/libra.git", branch = "testnet" }
12+
13+
[lib]
14+
crate-type = ["staticlib"]

libra-dev/Makefile

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
all:
2+
bindgen data.h --whitelist-type=CEventHandle --whitelist-type=CDevAccountResource -o src/data.rs
3+
cargo build
4+
cc -flto --std=c11 -fno-omit-frame-pointer -o a.out main.c -L target/debug -llibra_dev -framework Security
5+
./a.out

libra-dev/account_resource.h

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#include <stdint.h>
2+
#include <stdbool.h>
3+
4+
struct CDevAccountResource account_resource_from_lcs(const uint8_t *buf, size_t len);
5+
6+
void account_resource_free(struct CDevAccountResource *point);

libra-dev/data.h

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#include <stdint.h>
2+
#include <stdbool.h>
3+
4+
struct CEventHandle {
5+
uint64_t count;
6+
uint8_t key[32];
7+
};
8+
9+
struct CDevAccountResource {
10+
uint64_t balance;
11+
uint64_t sequence;
12+
uint8_t* authentication_key;
13+
bool delegated_key_rotation_capability;
14+
bool delegated_withdrawal_capability;
15+
struct CEventHandle sent_events;
16+
struct CEventHandle received_events;
17+
};

libra-dev/main.c

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
#include <stdio.h>
2+
#include <stdint.h>
3+
#include <string.h>
4+
#include <stdlib.h>
5+
#include "account_resource.h"
6+
#include "data.h"
7+
8+
int hexchr2bin(const char hex, char *out)
9+
{
10+
if (out == NULL)
11+
return 0;
12+
13+
if (hex >= '0' && hex <= '9') {
14+
*out = hex - '0';
15+
} else if (hex >= 'A' && hex <= 'F') {
16+
*out = hex - 'A' + 10;
17+
} else if (hex >= 'a' && hex <= 'f') {
18+
*out = hex - 'a' + 10;
19+
} else {
20+
return 0;
21+
}
22+
23+
return 1;
24+
}
25+
26+
size_t hexs2bin(const char *hex, unsigned char **out)
27+
{
28+
size_t len;
29+
char b1;
30+
char b2;
31+
size_t i;
32+
33+
if (hex == NULL || *hex == '\0' || out == NULL)
34+
return 0;
35+
36+
len = strlen(hex);
37+
if (len % 2 != 0)
38+
return 0;
39+
len /= 2;
40+
41+
*out = malloc(len);
42+
memset(*out, 0 , len);
43+
for (i=0; i<len; i++) {
44+
if (!hexchr2bin(hex[i*2], &b1) || !hexchr2bin(hex[i*2+1], &b2)) {
45+
return 0;
46+
}
47+
(*out)[i] = (b1 << 4) | b2;
48+
}
49+
return len;
50+
}
51+
52+
int main(int argc, const char **argv)
53+
{
54+
const char* blob = "020000002100000001674deac5e7fca75f00ca92b1ba3697f5f01ef585011beea7b361150f4504638f0800000002000000000000002100000001a208df134fefed8442b1f01fab59071898f5a1af5164e12c594de55a7004a91c8e0000002000000036ccb9ba8b4f0cd1f3e2d99338806893dff7478c69acee9b8e1247c053783a4800e876481700000000000200000000000000200000000b14ed4f5af8f8f077c7ec4313c6d395b9a7eb5f41eab9ec15367215ca9e420a01000000000000002000000032f56f77b09773aa64c78ee39943da7ec73f91cd757e325098e11b3edc4eccb10100000000000000";
55+
56+
uint8_t * result;
57+
int len = hexs2bin(blob, &result);
58+
59+
struct CDevAccountResource account_resource = account_resource_from_lcs((const uint8_t *) result, len);
60+
printf("balance: %llu \n", account_resource.balance);
61+
printf("sequence: %llu \n", account_resource.sequence);
62+
printf("delegated_key_rotation_capability: %d \n", account_resource.delegated_key_rotation_capability);
63+
64+
struct CEventHandle sent_events = account_resource.sent_events;
65+
printf("sent events count: %llu \n", sent_events.count);
66+
67+
printf("sent events key: ");
68+
for(int i = 0; i < 32; i++) {
69+
printf("%d ", sent_events.key[i]);
70+
}
71+
72+
struct CEventHandle received_events = account_resource.received_events;
73+
printf("received events count: %llu \n", received_events.count);
74+
75+
printf("received events key: ");
76+
for(int i = 0; i < 32; i++) {
77+
printf("%d ", received_events.key[i]);
78+
}
79+
80+
return 0;
81+
}

libra-dev/src/account_resource.rs

+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
// Copyright (c) The Libra Core Contributors
2+
// SPDX-License-Identifier: Apache-2.0
3+
use crate::data::{CDevAccountResource, CEventHandle};
4+
use libra_types::{
5+
account_config::get_account_resource_or_default,
6+
account_state_blob::AccountStateBlob,
7+
byte_array::ByteArray,
8+
event::{EventHandle, EVENT_KEY_LENGTH},
9+
};
10+
use std::slice;
11+
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+
79+
#[no_mangle]
80+
pub unsafe extern "C" fn account_resource_from_lcs(
81+
buf: *const u8,
82+
len: usize,
83+
) -> CDevAccountResource {
84+
let buf: &[u8] = slice::from_raw_parts(buf, len);
85+
86+
let account_state_blob: AccountStateBlob = AccountStateBlob::from(buf.to_vec());
87+
let account_resource = DevAccountResource::new(account_state_blob);
88+
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);
93+
94+
let mut sent_key_copy = [0u8; EVENT_KEY_LENGTH];
95+
sent_key_copy.copy_from_slice(account_resource.sent_events.key().as_bytes());
96+
97+
let sent_events = CEventHandle {
98+
count: account_resource.sent_events.count(),
99+
key: sent_key_copy,
100+
};
101+
102+
let mut received_key_copy = [0u8; EVENT_KEY_LENGTH];
103+
received_key_copy.copy_from_slice(account_resource.received_events.key().as_bytes());
104+
105+
let received_events = CEventHandle {
106+
count: account_resource.received_events.count(),
107+
key: received_key_copy,
108+
};
109+
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,
116+
sent_events,
117+
received_events,
118+
};
119+
}

libra-dev/src/data.rs

+145
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
/* automatically generated by rust-bindgen */
2+
3+
#[repr(C)]
4+
#[derive(Debug, Copy, Clone)]
5+
pub struct CEventHandle {
6+
pub count: u64,
7+
pub key: [u8; 32usize],
8+
}
9+
#[test]
10+
fn bindgen_test_layout_CEventHandle() {
11+
assert_eq!(
12+
::std::mem::size_of::<CEventHandle>(),
13+
40usize,
14+
concat!("Size of: ", stringify!(CEventHandle))
15+
);
16+
assert_eq!(
17+
::std::mem::align_of::<CEventHandle>(),
18+
8usize,
19+
concat!("Alignment of ", stringify!(CEventHandle))
20+
);
21+
assert_eq!(
22+
unsafe { &(*(::std::ptr::null::<CEventHandle>())).count as *const _ as usize },
23+
0usize,
24+
concat!(
25+
"Offset of field: ",
26+
stringify!(CEventHandle),
27+
"::",
28+
stringify!(count)
29+
)
30+
);
31+
assert_eq!(
32+
unsafe { &(*(::std::ptr::null::<CEventHandle>())).key as *const _ as usize },
33+
8usize,
34+
concat!(
35+
"Offset of field: ",
36+
stringify!(CEventHandle),
37+
"::",
38+
stringify!(key)
39+
)
40+
);
41+
}
42+
#[repr(C)]
43+
#[derive(Debug, Copy, Clone)]
44+
pub struct CDevAccountResource {
45+
pub balance: u64,
46+
pub sequence: u64,
47+
pub authentication_key: *mut u8,
48+
pub delegated_key_rotation_capability: bool,
49+
pub delegated_withdrawal_capability: bool,
50+
pub sent_events: CEventHandle,
51+
pub received_events: CEventHandle,
52+
}
53+
#[test]
54+
fn bindgen_test_layout_CDevAccountResource() {
55+
assert_eq!(
56+
::std::mem::size_of::<CDevAccountResource>(),
57+
112usize,
58+
concat!("Size of: ", stringify!(CDevAccountResource))
59+
);
60+
assert_eq!(
61+
::std::mem::align_of::<CDevAccountResource>(),
62+
8usize,
63+
concat!("Alignment of ", stringify!(CDevAccountResource))
64+
);
65+
assert_eq!(
66+
unsafe { &(*(::std::ptr::null::<CDevAccountResource>())).balance as *const _ as usize },
67+
0usize,
68+
concat!(
69+
"Offset of field: ",
70+
stringify!(CDevAccountResource),
71+
"::",
72+
stringify!(balance)
73+
)
74+
);
75+
assert_eq!(
76+
unsafe { &(*(::std::ptr::null::<CDevAccountResource>())).sequence as *const _ as usize },
77+
8usize,
78+
concat!(
79+
"Offset of field: ",
80+
stringify!(CDevAccountResource),
81+
"::",
82+
stringify!(sequence)
83+
)
84+
);
85+
assert_eq!(
86+
unsafe {
87+
&(*(::std::ptr::null::<CDevAccountResource>())).authentication_key as *const _ as usize
88+
},
89+
16usize,
90+
concat!(
91+
"Offset of field: ",
92+
stringify!(CDevAccountResource),
93+
"::",
94+
stringify!(authentication_key)
95+
)
96+
);
97+
assert_eq!(
98+
unsafe {
99+
&(*(::std::ptr::null::<CDevAccountResource>())).delegated_key_rotation_capability
100+
as *const _ as usize
101+
},
102+
24usize,
103+
concat!(
104+
"Offset of field: ",
105+
stringify!(CDevAccountResource),
106+
"::",
107+
stringify!(delegated_key_rotation_capability)
108+
)
109+
);
110+
assert_eq!(
111+
unsafe {
112+
&(*(::std::ptr::null::<CDevAccountResource>())).delegated_withdrawal_capability
113+
as *const _ as usize
114+
},
115+
25usize,
116+
concat!(
117+
"Offset of field: ",
118+
stringify!(CDevAccountResource),
119+
"::",
120+
stringify!(delegated_withdrawal_capability)
121+
)
122+
);
123+
assert_eq!(
124+
unsafe { &(*(::std::ptr::null::<CDevAccountResource>())).sent_events as *const _ as usize },
125+
32usize,
126+
concat!(
127+
"Offset of field: ",
128+
stringify!(CDevAccountResource),
129+
"::",
130+
stringify!(sent_events)
131+
)
132+
);
133+
assert_eq!(
134+
unsafe {
135+
&(*(::std::ptr::null::<CDevAccountResource>())).received_events as *const _ as usize
136+
},
137+
72usize,
138+
concat!(
139+
"Offset of field: ",
140+
stringify!(CDevAccountResource),
141+
"::",
142+
stringify!(received_events)
143+
)
144+
);
145+
}

0 commit comments

Comments
 (0)