-
Notifications
You must be signed in to change notification settings - Fork 785
/
interface.cpp
161 lines (140 loc) · 4.56 KB
/
interface.cpp
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include <rai/lib/interface.h>
#include <xxhash/xxhash.h>
#include <ed25519-donna/ed25519.h>
#include <blake2/blake2.h>
#include <boost/property_tree/json_parser.hpp>
#include <rai/lib/blocks.hpp>
#include <rai/lib/numbers.hpp>
#include <rai/lib/work.hpp>
#include <cstring>
extern "C" {
void xrb_uint256_to_string (xrb_uint256 source, char * destination)
{
auto const & number (*reinterpret_cast <rai::uint256_union *> (source));
strncpy (destination, number.to_string ().c_str (), 64);
}
void xrb_uint256_to_address (xrb_uint256 source, char * destination)
{
auto const & number (*reinterpret_cast <rai::uint256_union *> (source));
strncpy (destination, number.to_account ().c_str (), 65);
}
void xrb_uint512_to_string (xrb_uint512 source, char * destination)
{
auto const & number (*reinterpret_cast <rai::uint512_union *> (source));
strncpy (destination, number.to_string ().c_str (), 128);
}
int xrb_uint256_from_string (const char * source, xrb_uint256 destination)
{
auto & number (*reinterpret_cast <rai::uint256_union *> (destination));
auto error (number.decode_hex (source));
auto result (error ? 1 : 0);
return result;
}
int xrb_uint512_from_string (const char * source, xrb_uint512 destination)
{
auto & number (*reinterpret_cast <rai::uint512_union *> (destination));
auto error (number.decode_hex (source));
auto result (error ? 1 : 0);
return result;
}
int xrb_valid_address (const char * account_a)
{
rai::uint256_union account;
auto error (account.decode_account (account_a));
auto result (error ? 1 : 0);
return result;
}
void xrb_generate_random (xrb_uint256 seed)
{
auto & number (*reinterpret_cast <rai::uint256_union *> (seed));
rai::random_pool.GenerateBlock (number.bytes.data (), number.bytes.size ());
}
void xrb_seed_key (xrb_uint256 seed, int index, xrb_uint256 destination)
{
auto & seed_l (*reinterpret_cast <rai::uint256_union *> (seed));
auto & destination_l (*reinterpret_cast <rai::uint256_union *> (destination));
rai::deterministic_key (seed_l, index, destination_l);
}
void xrb_key_account (const xrb_uint256 key, xrb_uint256 pub)
{
ed25519_publickey (key, pub);
}
char * xrb_sign_transaction (const char * transaction, const xrb_uint256 private_key)
{
char * result (nullptr);
try
{
boost::property_tree::ptree block_l;
std::string transaction_l (transaction);
std::stringstream block_stream (transaction_l);
boost::property_tree::read_json (block_stream, block_l);
auto block (rai::deserialize_block_json (block_l));
if (block != nullptr)
{
rai::uint256_union pub;
ed25519_publickey (private_key, pub.bytes.data ());
rai::raw_key prv;
prv.data = *reinterpret_cast <rai::uint256_union *> (private_key);
block->signature_set (rai::sign_message (prv, pub, block->hash ()));
auto json (block->to_json ());
result = reinterpret_cast <char *> (malloc (json.size () + 1));
strncpy (result, json.c_str (), json.size () + 1);
}
}
catch (std::runtime_error const & err)
{
}
return result;
}
char * xrb_work_transaction (const char * transaction)
{
char * result (nullptr);
try
{
boost::property_tree::ptree block_l;
std::string transaction_l (transaction);
std::stringstream block_stream (transaction_l);
boost::property_tree::read_json (block_stream, block_l);
auto block (rai::deserialize_block_json (block_l));
if (block != nullptr)
{
rai::work_pool pool (std::thread::hardware_concurrency ());
auto work (pool.generate (block->root ()));
block->block_work_set (work);
auto json (block->to_json ());
result = reinterpret_cast <char *> (malloc (json.size () + 1));
strncpy (result, json.c_str (), json.size () + 1);
}
}
catch (std::runtime_error const & err)
{
}
return result;
}
#include <ed25519-donna/ed25519-hash-custom.h>
void ed25519_randombytes_unsafe (void * out, size_t outlen)
{
rai::random_pool.GenerateBlock (reinterpret_cast <uint8_t *> (out), outlen);
}
void ed25519_hash_init (ed25519_hash_context * ctx)
{
ctx->blake2 = new blake2b_state;
blake2b_init (reinterpret_cast <blake2b_state *> (ctx->blake2), 64);
}
void ed25519_hash_update (ed25519_hash_context * ctx, uint8_t const * in, size_t inlen)
{
blake2b_update (reinterpret_cast <blake2b_state *> (ctx->blake2), in, inlen);
}
void ed25519_hash_final (ed25519_hash_context * ctx, uint8_t * out)
{
blake2b_final (reinterpret_cast <blake2b_state *> (ctx->blake2), out, 64);
delete reinterpret_cast <blake2b_state *> (ctx->blake2);
}
void ed25519_hash (uint8_t * out, uint8_t const * in, size_t inlen)
{
ed25519_hash_context ctx;
ed25519_hash_init (&ctx);
ed25519_hash_update (&ctx, in, inlen);
ed25519_hash_final (&ctx, out);
}
}