1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use std::mem;
use byteorder::{ByteOrder, LittleEndian};
extern crate libc;
pub type address =  *const u8;
pub type Event = i32;
type pointer =  *mut u8;
pub type lparray =  *mut pointer;
extern {
   fn chain_storage_size_get(key: *const u8, length: u8 ) -> usize;
   fn chain_get_caller(caller: address) ;
   fn chain_get_creator(creator: address);
   fn chain_storage_get(key: *const u8, length: u8, value: *const u8) -> *const u8 ;
   fn chain_storage_set(key: *const u8, key_size: u8, value: *const u8, value_size: u8) ;
}

unsafe fn set(data: *mut pointer, offset: usize, value: *mut u8) {
    let ptr = data.offset(offset as isize) as *mut pointer;
    *ptr = value;
}

pub fn to_lparray (s: &[u8]) -> lparray {
    unsafe {
        let result = libc::malloc(2 * mem::size_of::<*mut pointer>()) as *mut pointer;
        let len = s.len();
        set(result,0, len as *mut u8);
        set(result,1, s.as_ptr() as *mut u8);
        return result
    }
}

pub fn get_caller() -> address {
    let caller: address = unsafe {
        libc::malloc((mem::size_of::<u8>() * 35) as libc::size_t ) as address
    };
    unsafe {
        chain_get_caller(caller) ;
    }
    return caller;
}
pub fn get_creator() -> address {
    let creator: address = unsafe {
        libc::malloc((mem::size_of::<u8>() * 35) as libc::size_t ) as address
    };
    unsafe {
        chain_get_creator(creator) ;
    }
    return creator;
}
pub fn storage_get(key: *const u8, key_size: u8) -> *const u8 {
    let size : usize = unsafe { chain_storage_size_get(key, key_size ) };
    if size == 0 {
        return 0 as *const u8;
    }
    unsafe {
        let ret : *const u8 = libc::malloc((mem::size_of::<u8>() * size) as libc::size_t ) as *const u8;
        chain_storage_get(key, key_size, ret);
        return ret ;
    };
}
pub fn storage_set(key: *const u8, key_size: u8 , value: *const u8, value_size: u8 ) {
    unsafe {
        chain_storage_set(key, key_size, value, value_size ) ;
    }
}
pub fn from_byte(x: *const u8, length: u8) -> u64 {
    let key = unsafe { std::slice::from_raw_parts(x, length as usize) };

    return LittleEndian::read_uint(key, length as usize).to_be();
}