Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
L
libdap-chain-mempool
Manage
Activity
Members
Labels
Plan
Issues
0
Issue boards
Milestones
Wiki
Code
Merge requests
0
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
This is an archived project. Repository and other project resources are read-only.
Show more breadcrumbs
cellframe
libdap-chain-mempool
Commits
4d156a2f
Commit
4d156a2f
authored
5 years ago
by
dmitriy.gerasimov
Browse files
Options
Downloads
Patches
Plain Diff
[*] Refactoring, renames, added authors
parent
08d0dab9
No related branches found
No related tags found
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
client_mempool.c
+24
-0
24 additions, 0 deletions
client_mempool.c
client_mempool.h
+24
-0
24 additions, 0 deletions
client_mempool.h
dap_chain_mempool.c
+200
-4
200 additions, 4 deletions
dap_chain_mempool.c
dap_chain_mempool.h
+10
-1
10 additions, 1 deletion
dap_chain_mempool.h
with
258 additions
and
5 deletions
client_mempool.c
+
24
−
0
View file @
4d156a2f
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* Alexander Lysikov <alexander.lysikov@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* Kelvin Project https://github.com/kelvinblockchain
* Copyright (c) 2017-2019
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#include
<stdlib.h>
#include
<stdlib.h>
#include
<stdio.h>
#include
<stdio.h>
#include
<string.h>
#include
<string.h>
...
...
This diff is collapsed.
Click to expand it.
client_mempool.h
+
24
−
0
View file @
4d156a2f
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* Alexander Lysikov <alexander.lysikov@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* Kelvin Project https://github.com/kelvinblockchain
* Copyright (c) 2017-2019
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#pragma once
#include
<pthread.h>
#include
<pthread.h>
...
...
This diff is collapsed.
Click to expand it.
dap_chain_mempool.c
+
200
−
4
View file @
4d156a2f
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* Alexander Lysikov <alexander.lysikov@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* Kelvin Project https://github.com/kelvinblockchain
* Copyright (c) 2017-2019
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#include
<stddef.h>
#include
<stddef.h>
#include
<stdio.h>
#include
<stdio.h>
#include
<string.h>
#include
<string.h>
#include
<stdio.h>
#include
<stdio.h>
#include
<assert.h>
#include
<assert.h>
#include
<memory.h>
//#include <dap_http_simple.h>
//#include <dap_http_simple.h>
//#include <http_status_code.h>
//#include <http_status_code.h>
#include
"dap_common.h"
#include
"dap_common.h"
...
@@ -22,7 +48,176 @@
...
@@ -22,7 +48,176 @@
#include
<dap_enc_ks.h>
#include
<dap_enc_ks.h>
#include
"dap_chain_mempool.h"
#include
"dap_chain_mempool.h"
#define LOG_TAG "MEMPOOL"
#include
"dap_common.h"
#include
"dap_list.h"
#include
"dap_chain_sign.h"
#include
"dap_chain_datum_tx.h"
#include
"dap_chain_utxo.h"
#include
"dap_chain_datum_tx_items.h"
#define LOG_TAG "dap_chain_mempool"
typedef
struct
list_used_item
{
dap_chain_hash_fast_t
tx_hash_fast
;
int
num_idx_out
;
uint64_t
value
;
//dap_chain_tx_out_t *tx_out;
}
list_used_item_t
;
const
char
*
c_dap_datum_mempool_gdb_group
=
NULL
;
int
dap_datum_mempool_init
()
{
c_dap_datum_mempool_gdb_group
=
dap_config_get_item_str_default
(
g_config
,
"mempool"
,
"gdb_group"
,
"datum-pool"
);
return
0
;
}
/**
* @brief dap_chain_mempool_datum_add
* @param a_datum
* @return
*/
int
dap_chain_mempool_datum_add
(
dap_chain_datum_t
*
a_datum
)
{
return
0
;
}
/**
* Make transfer transaction & insert to cache
*
* return 1 Ok, 0 not enough funds to transfer, -1 other Error
*/
int
dap_chain_mempool_tx_create
(
dap_enc_key_t
*
a_key_from
,
const
dap_chain_addr_t
*
a_addr_from
,
const
dap_chain_addr_t
*
a_addr_to
,
const
dap_chain_addr_t
*
a_addr_fee
,
const
char
a_token_ticker
[
10
],
uint64_t
a_value
,
uint64_t
a_value_fee
)
{
// check valid param
if
(
!
a_key_from
||
!
a_key_from
->
priv_key_data
||
!
a_key_from
->
priv_key_data_size
||
!
dap_chain_addr_check_sum
(
a_addr_from
)
||
!
dap_chain_addr_check_sum
(
a_addr_to
)
||
(
a_addr_fee
&&
!
dap_chain_addr_check_sum
(
a_addr_fee
))
||
!
a_value
)
return
-
1
;
// find the transactions from which to take away coins
dap_list_t
*
l_list_used_out
=
NULL
;
// list of transaction with 'out' items
uint64_t
l_value_transfer
=
0
;
// how many coins to transfer
{
dap_chain_hash_fast_t
l_tx_cur_hash
=
{
0
};
uint64_t
l_value_need
=
a_value
+
a_value_fee
;
while
(
l_value_transfer
<
l_value_need
)
{
// Get the transaction in the cache by the addr in out item
const
dap_chain_datum_tx_t
*
l_tx
=
dap_chain_utxo_tx_find_by_addr
(
a_addr_from
,
&
l_tx_cur_hash
);
if
(
!
l_tx
)
break
;
// Get all item from transaction by type
int
l_item_count
=
0
;
dap_list_t
*
l_list_out_items
=
dap_chain_datum_tx_items_get
((
dap_chain_datum_tx_t
*
)
l_tx
,
TX_ITEM_TYPE_OUT
,
&
l_item_count
);
dap_list_t
*
l_list_tmp
=
l_list_out_items
;
int
l_out_idx_tmp
=
0
;
// current index of 'out' item
while
(
l_list_tmp
)
{
dap_chain_tx_out_t
*
out_item
=
l_list_tmp
->
data
;
// if 'out' item has addr = a_addr_from
if
(
out_item
&&
&
out_item
->
addr
&&
!
memcmp
(
a_addr_from
,
&
out_item
->
addr
,
sizeof
(
dap_chain_addr_t
)))
{
// Check whether used 'out' items
if
(
!
dap_chain_utxo_tx_hash_is_used_out_item
(
&
l_tx_cur_hash
,
l_out_idx_tmp
))
{
list_used_item_t
*
item
=
DAP_NEW
(
list_used_item_t
);
memcpy
(
&
item
->
tx_hash_fast
,
&
l_tx_cur_hash
,
sizeof
(
dap_chain_hash_fast_t
));
item
->
num_idx_out
=
l_out_idx_tmp
;
item
->
value
=
out_item
->
header
.
value
;
l_list_used_out
=
dap_list_append
(
l_list_used_out
,
item
);
l_value_transfer
+=
item
->
value
;
// already accumulated the required value, finish the search for 'out' items
if
(
l_value_transfer
>=
l_value_need
){
break
;
}
}
}
// go to the next 'out' item in l_tx transaction
l_out_idx_tmp
++
;
l_list_tmp
=
dap_list_next
(
l_list_tmp
);
}
dap_list_free
(
l_list_out_items
);
}
// nothing to tranfer (not enough funds)
if
(
!
l_list_used_out
||
l_value_transfer
<
l_value_need
)
{
dap_list_free_full
(
l_list_used_out
,
free
);
return
0
;
}
}
// create empty transaction
dap_chain_datum_tx_t
*
l_tx
=
dap_chain_datum_tx_create
();
// add 'in' items
{
dap_list_t
*
l_list_tmp
=
l_list_used_out
;
uint64_t
l_value_to_items
=
0
;
// how many coins to transfer
while
(
l_list_tmp
)
{
list_used_item_t
*
item
=
l_list_tmp
->
data
;
if
(
dap_chain_datum_tx_add_in_item
(
&
l_tx
,
&
item
->
tx_hash_fast
,
item
->
num_idx_out
)
==
1
)
{
l_value_to_items
+=
item
->
value
;
}
l_list_tmp
=
dap_list_next
(
l_list_tmp
);
}
assert
(
l_value_to_items
==
l_value_transfer
);
dap_list_free_full
(
l_list_used_out
,
free
);
}
// add 'out' items
{
uint64_t
l_value_pack
=
0
;
// how much coin add to 'out' items
if
(
dap_chain_datum_tx_add_out_item
(
&
l_tx
,
a_addr_to
,
a_value
)
==
1
)
{
l_value_pack
+=
a_value
;
// transaction fee
if
(
a_addr_fee
)
{
if
(
dap_chain_datum_tx_add_out_item
(
&
l_tx
,
a_addr_fee
,
a_value_fee
)
==
1
)
l_value_pack
+=
a_value_fee
;
}
}
// coin back
uint64_t
l_value_back
=
l_value_transfer
-
l_value_pack
;
if
(
l_value_back
)
{
if
(
dap_chain_datum_tx_add_out_item
(
&
l_tx
,
a_addr_from
,
l_value_back
)
!=
1
)
{
dap_chain_datum_tx_delete
(
l_tx
);
return
-
1
;
}
}
}
// add 'sign' items
if
(
dap_chain_datum_tx_add_sign_item
(
&
l_tx
,
a_key_from
)
!=
1
)
{
dap_chain_datum_tx_delete
(
l_tx
);
return
-
1
;
}
size_t
l_datum_data_size
=
dap_chain_datum_tx_get_size
(
l_tx
);
dap_chain_datum_t
*
l_datum
=
DAP_NEW_Z_SIZE
(
dap_chain_datum_t
,
sizeof
(
l_datum
->
header
)
+
l_datum_data_size
);
memcpy
(
l_datum
->
data
,
l_tx
,
l_datum_data_size
);
l_datum
->
header
.
data_size
=
l_datum_data_size
;
l_datum
->
header
.
version_id
=
DAP_CHAIN_DATUM_VERSION
;
DAP_DELETE
(
l_tx
);
dap_chain_hash_fast_t
l_key_hash
;
dap_hash_fast
(
l_datum
,
l_datum_data_size
+
sizeof
(
l_datum
->
header
),
&
l_key_hash
);
char
*
l_key_str
=
dap_chain_hash_fast_to_str_new
(
&
l_key_hash
);
if
(
dap_chain_global_db_gr_set
(
l_key_str
,(
uint8_t
*
)
l_datum
,
l_datum_data_size
,
c_dap_datum_mempool_gdb_group
))
{
log_it
(
L_NOTICE
,
"Transaction %s placed in mempool"
,
l_key_str
);
}
DAP_DELETE
(
l_key_str
);
return
0
;
}
uint8_t
*
dap_datum_mempool_serialize
(
dap_datum_mempool_t
*
datum_mempool
,
size_t
*
size
)
uint8_t
*
dap_datum_mempool_serialize
(
dap_datum_mempool_t
*
datum_mempool
,
size_t
*
size
)
{
{
...
@@ -193,7 +388,8 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
...
@@ -193,7 +388,8 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
case
DAP_DATUM_MEMPOOL_ADD
:
// add datum in base
case
DAP_DATUM_MEMPOOL_ADD
:
// add datum in base
//a_value = DAP_NEW_Z_SIZE(char, request_size * 2);
//a_value = DAP_NEW_Z_SIZE(char, request_size * 2);
//bin2hex((char*) a_value, (const unsigned char*) request_str, request_size);
//bin2hex((char*) a_value, (const unsigned char*) request_str, request_size);
if
(
dap_chain_global_db_gr_set
(
a_key
,
request_str
,
request_size
,
DAP_CHAIN_GDB_GROUP_DATUM_POOL
))
{
if
(
dap_chain_global_db_gr_set
(
a_key
,
request_str
,
request_size
,
dap_config_get_item_str_default
(
g_config
,
"mempool"
,
"gdb_group"
,
"datum-pool"
)
))
{
*
return_code
=
Http_Status_OK
;
*
return_code
=
Http_Status_OK
;
}
}
log_it
(
L_INFO
,
"Insert hash: key=%s result:%s"
,
a_key
,
log_it
(
L_INFO
,
"Insert hash: key=%s result:%s"
,
a_key
,
...
@@ -204,7 +400,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
...
@@ -204,7 +400,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
case
DAP_DATUM_MEMPOOL_CHECK
:
// check datum in base
case
DAP_DATUM_MEMPOOL_CHECK
:
// check datum in base
strcpy
(
cl_st
->
reply_mime
,
"text/text"
);
strcpy
(
cl_st
->
reply_mime
,
"text/text"
);
char
*
str
=
dap_chain_global_db_gr_get
((
const
char
*
)
a_key
,
NULL
,
DAP_CHAIN_GDB_GROUP_DATUM_POOL
);
char
*
str
=
dap_chain_global_db_gr_get
((
const
char
*
)
a_key
,
NULL
,
dap_config_get_item_str_default
(
g_config
,
"mempool"
,
"gdb_group"
,
"datum-pool"
)
);
if
(
str
)
{
if
(
str
)
{
dg
->
response
=
strdup
(
"1"
);
dg
->
response
=
strdup
(
"1"
);
DAP_DELETE
(
str
);
DAP_DELETE
(
str
);
...
@@ -222,7 +418,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
...
@@ -222,7 +418,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg)
case
DAP_DATUM_MEMPOOL_DEL
:
// delete datum in base
case
DAP_DATUM_MEMPOOL_DEL
:
// delete datum in base
strcpy
(
cl_st
->
reply_mime
,
"text/text"
);
strcpy
(
cl_st
->
reply_mime
,
"text/text"
);
if
(
dap_chain_global_db_gr_del
(
((
const
char
*
)
a_key
),
DAP_CHAIN_GDB_GROUP_DATUM_POOL
)
)
{
if
(
dap_chain_global_db_gr_del
(
((
const
char
*
)
a_key
),
dap_config_get_item_str_default
(
g_config
,
"mempool"
,
"gdb_group"
,
"datum-pool"
)
)
)
{
dg
->
response
=
strdup
(
"1"
);
dg
->
response
=
strdup
(
"1"
);
DAP_DELETE
(
str
);
DAP_DELETE
(
str
);
log_it
(
L_INFO
,
"Delete hash: key=%s result: Ok"
,
a_key
);
log_it
(
L_INFO
,
"Delete hash: key=%s result: Ok"
,
a_key
);
...
...
This diff is collapsed.
Click to expand it.
dap_chain_mempool.h
+
10
−
1
View file @
4d156a2f
...
@@ -15,7 +15,6 @@
...
@@ -15,7 +15,6 @@
*/
*/
#define DAP_DATUM_MEMPOOL_VERSION "01"
#define DAP_DATUM_MEMPOOL_VERSION "01"
#define DAP_CHAIN_GDB_GROUP_DATUM_POOL "datum_pool"
// action
// action
enum
{
enum
{
...
@@ -29,6 +28,10 @@ typedef struct dap_datum_mempool {
...
@@ -29,6 +28,10 @@ typedef struct dap_datum_mempool {
dap_chain_datum_t
**
data
;
// mass of datums
dap_chain_datum_t
**
data
;
// mass of datums
}
DAP_ALIGN_PACKED
dap_datum_mempool_t
;
}
DAP_ALIGN_PACKED
dap_datum_mempool_t
;
int
dap_datum_mempool_init
();
extern
const
char
*
c_dap_datum_mempool_gdb_group
;
uint8_t
*
dap_datum_mempool_serialize
(
dap_datum_mempool_t
*
datum_mempool
,
size_t
*
size
);
uint8_t
*
dap_datum_mempool_serialize
(
dap_datum_mempool_t
*
datum_mempool
,
size_t
*
size
);
dap_datum_mempool_t
*
dap_datum_mempool_deserialize
(
uint8_t
*
datum_mempool_str
,
size_t
size
);
dap_datum_mempool_t
*
dap_datum_mempool_deserialize
(
uint8_t
*
datum_mempool_str
,
size_t
size
);
...
@@ -37,3 +40,9 @@ void dap_datum_mempool_free(dap_datum_mempool_t *datum);
...
@@ -37,3 +40,9 @@ void dap_datum_mempool_free(dap_datum_mempool_t *datum);
void
dap_chain_mempool_add_proc
(
struct
dap_http
*
sh
,
const
char
*
url
);
void
dap_chain_mempool_add_proc
(
struct
dap_http
*
sh
,
const
char
*
url
);
int
dap_chain_mempool_tx_create
(
dap_enc_key_t
*
a_key_from
,
const
dap_chain_addr_t
*
a_addr_from
,
const
dap_chain_addr_t
*
a_addr_to
,
const
dap_chain_addr_t
*
a_addr_fee
,
const
char
a_token_ticker
[
10
],
uint64_t
a_value
,
uint64_t
a_value_fee
);
int
dap_chain_mempool_datum_add
(
dap_chain_datum_t
*
a_datum
);
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment