Skip to content
Snippets Groups Projects
Commit 08e6546a authored by alexey.stratulat's avatar alexey.stratulat
Browse files

[-] Deleted libdap-chain-common submodule.

parent e86b7d47
No related branches found
No related tags found
1 merge request!7Bugs 2846
Showing
with 0 additions and 1471 deletions
......@@ -82,9 +82,6 @@
[submodule "libdap-client-python"]
path = libdap-client-python
url = https://gitlab.demlabs.net/cellframe/libdap-client-python.git
[submodule "libdap-chain-common"]
path = libdap-chain-common
url = https://gitlab.demlabs.net/cellframe/libdap-chain-common.git
[submodule "libdap-stream-ch-chain-net-srv"]
path = libdap-stream-ch-chain-net-srv
url = https://gitlab.demlabs.net/cellframe/libdap-stream-ch-chain-net-srv.git
......
*.autosave
*.user
*.o
*.obj
Makefile
cmake_minimum_required(VERSION 2.8)
project (dap_chain_common)
set(DAP_CHAIN_COMMON_SRCS
src/dap_chain_common.c
src/dap_chain_datum.c
src/dap_chain_datum_token.c
src/dap_chain_datum_hashtree_roots.c
src/dap_chain_datum_tx_items.c
src/dap_chain_datum_tx.c
src/dap_chain_datum_tx_out_cond.c
src/dap_chain_datum_tx_token.c
src/dap_chain_datum_tx_receipt.c
)
set(DAP_CHAIN_COMMON_HEADERS
include/dap_chain_common.h
include/dap_chain_datum.h
include/dap_chain_datum_token.h
include/dap_chain_datum_hashtree_roots.h
include/dap_chain_datum_tx_items.h
include/dap_chain_datum_tx.h
include/dap_chain_datum_tx_in.h
include/dap_chain_datum_tx_in_cond.h
include/dap_chain_datum_tx_out.h
include/dap_chain_datum_tx_out_cond.h
include/dap_chain_datum_tx_pkey.h
include/dap_chain_datum_tx_sig.h
include/dap_chain_datum_tx_token.h
include/dap_chain_datum_tx_receipt.h
)
add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_COMMON_SRCS} ${DAP_CHAIN_COMMON_HEADERS})
target_link_libraries(dap_chain_common dap_core dap_crypto )
target_include_directories(dap_chain_common PUBLIC include/ )
# libdap-chain-common
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* DeM Labs Inc. https://demlabs.net https:/gitlab.com/demlabs
* Kelvin Project https://github.com/kelvinblockchain
* Copyright (c) 2017-2018
* 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
#include <stdint.h>
#include <stdio.h>
#include "dap_common.h"
#include "dap_math_ops.h"
#include "dap_enc_key.h"
#include "dap_pkey.h"
#include "dap_sign.h"
#include "dap_hash.h"
#define DAP_CHAIN_ADDR_VERSION_CURRENT 1
#define DAP_CHAIN_ID_SIZE 8
#define DAP_CHAIN_SHARD_ID_SIZE 8
#define DAP_CHAIN_NET_ID_SIZE 8
#define DAP_CHAIN_NODE_ROLE_SIZE 2
#define DAP_CHAIN_HASH_SLOW_SIZE 32
#define DAP_CHAIN_TIMESTAMP_SIZE 8
#define DAP_CHAIN_TICKER_SIZE_MAX 10
#define DATOSHI_LD 1000000000.0L
// Chain ID of the whole system
typedef union dap_chain_id {
uint8_t raw[DAP_CHAIN_ID_SIZE];
uint64_t uint64;
} DAP_ALIGN_PACKED dap_chain_id_t;
// Shard ID
typedef union dap_chain_cell_id {
uint8_t raw[DAP_CHAIN_SHARD_ID_SIZE];
uint64_t uint64;
} DAP_ALIGN_PACKED dap_chain_cell_id_t;
/**
* @struct Node address
*
*/
typedef union dap_chain_node_addr {
uint64_t uint64;
uint16_t words[sizeof(uint64_t)/2];
uint8_t raw[sizeof(uint64_t)]; // Access to selected octects
} DAP_ALIGN_PACKED dap_chain_node_addr_t;
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#define NODE_ADDR_FP_STR "%04hX::%04hX::%04hX::%04hX"
#define NODE_ADDR_FP_ARGS(a) a->words[2],a->words[3],a->words[0],a->words[1]
#define NODE_ADDR_FPS_ARGS(a) &a->words[2],&a->words[3],&a->words[0],&a->words[1]
#define NODE_ADDR_FP_ARGS_S(a) a.words[2],a.words[3],a.words[0],a.words[1]
#define NODE_ADDR_FPS_ARGS_S(a) &a.words[2],&a.words[3],&a.words[0],&a.words[1]
#else
#define NODE_ADDR_FP_STR "%04hX::%04hX::%04hX::%04hX"
#define NODE_ADDR_FP_ARGS(a) a->words[3],a->words[2],a->words[1],a->words[0]
#define NODE_ADDR_FPS_ARGS(a) &a->words[3],&a->words[2],&a->words[1],&a->words[0]
#define NODE_ADDR_FP_ARGS_S(a) a.words[3],a.words[2],a.words[1],a.words[0]
#define NODE_ADDR_FPS_ARGS_S(a) &a.words[3],&a.words[2],&a.words[1],&a.words[0]
#endif
inline static int dap_chain_node_addr_from_str( dap_chain_node_addr_t * a_addr, const char * a_addr_str){
return (int) sscanf(a_addr_str,NODE_ADDR_FP_STR,NODE_ADDR_FPS_ARGS(a_addr) )-4;
}
/**
*
*
*
*
*/
typedef union dap_chain_node_role{
enum {
NODE_ROLE_ROOT_MASTER=0x00,
NODE_ROLE_ROOT=0x01,
NODE_ROLE_ARCHIVE=0x02,
NODE_ROLE_CELL_MASTER=0x10,
NODE_ROLE_MASTER = 0x20,
NODE_ROLE_FULL=0xf0,
NODE_ROLE_LIGHT=0xff } enums;
uint8_t raw[DAP_CHAIN_NODE_ROLE_SIZE];
} DAP_ALIGN_PACKED dap_chain_node_role_t;
typedef union dap_chain_net_id{
uint64_t uint64;
uint8_t raw[DAP_CHAIN_NET_ID_SIZE];
} DAP_ALIGN_PACKED dap_chain_net_id_t;
typedef union dap_chain_hash_slow{
uint8_t raw[DAP_CHAIN_HASH_SLOW_SIZE];
} dap_chain_hash_slow_t;
typedef enum dap_chain_hash_slow_kind {
HASH_GOLD = 0, HASH_SILVER, HASH_COPPER, HASH_USELESS = -1
} dap_chain_hash_slow_kind_t;
typedef struct dap_chain_addr{
uint8_t addr_ver; // 0 for default
dap_chain_net_id_t net_id; // Testnet, mainnet or alternet
dap_sign_type_t sig_type;
union{
//dap_chain_hash_fast_t hash;
struct {
uint8_t key_spend[sizeof(dap_chain_hash_fast_t)/2];
uint8_t key_view[sizeof(dap_chain_hash_fast_t)/2];
} key_sv;
uint8_t key[sizeof(dap_chain_hash_fast_t)];
uint8_t hash[sizeof(dap_chain_hash_fast_t)];
dap_chain_hash_fast_t hash_fast;
} data;
dap_chain_hash_fast_t checksum;
} DAP_ALIGN_PACKED dap_chain_addr_t;
typedef uint64_t dap_chain_time_t;
static inline dap_chain_time_t dap_chain_time_now() { return (dap_chain_time_t) time(NULL); }
#define DAP_CHAIN_NET_SRV_UID_SIZE 8
typedef union {
uint8_t raw[DAP_CHAIN_NET_SRV_UID_SIZE];
#if DAP_CHAIN_NET_SRV_UID_SIZE == 8
uint64_t raw_ui64[1];
uint64_t uint64;
#elif DAP_CHAIN_NET_SRV_UID_SIZE == 16
uint64_t raw_ui64[1];
uint128_t uint128;
#endif
} dap_chain_net_srv_uid_t;
typedef union {
uint8_t raw[4];
uint32_t raw_ui32[1];
uint32_t uint32;
enum {
SERV_UNIT_UNDEFINED = 0 ,
SERV_UNIT_MB = 0x00000001, // megabytes
SERV_UNIT_SEC = 0x00000002, // seconds
SERV_UNIT_DAY = 0x00000003, // days
SERV_UNIT_KB = 0x00000010, // kilobytes
SERV_UNIT_B = 0x00000011, // bytes
} enm;
} dap_chain_net_srv_price_unit_uid_t;
typedef enum dap_chain_tx_item_type {
TX_ITEM_TYPE_IN = 0x00, /// @brief Transaction: inputs
TX_ITEM_TYPE_OUT = 0x10, /// @brief Transaction: outputs
TX_ITEM_TYPE_PKEY = 0x20,
TX_ITEM_TYPE_SIG = 0x30,
TX_ITEM_TYPE_TOKEN = 0x40,
TX_ITEM_TYPE_IN_COND = 0x50, /// @brief Transaction: conditon inputs
TX_ITEM_TYPE_OUT_COND = 0x60, /// @brief Transaction: conditon outputs
TX_ITEM_TYPE_RECEIPT = 0x70,
TX_ITEM_TYPE_ANY = 0xff,
} dap_chain_tx_item_type_t;
typedef struct dap_chain_receipt{
dap_chain_net_srv_uid_t srv_uid; // Service UID
dap_chain_net_srv_price_unit_uid_t units_type;
uint64_t units; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT
uint64_t value_datoshi; // Receipt value
} dap_chain_receipt_info_t;
#ifdef __cplusplus
extern "C" {
#endif
size_t dap_chain_hash_slow_to_str(dap_chain_hash_slow_t * a_hash, char * a_str, size_t a_str_max);
char* dap_chain_addr_to_str(const dap_chain_addr_t *a_addr);
dap_chain_addr_t* dap_chain_addr_from_str(const char *str);
dap_chain_net_id_t dap_chain_net_id_from_str(const char* a_str);
dap_chain_net_srv_uid_t dap_chain_net_srv_uid_from_str(const char* a_str);
void dap_chain_addr_fill(dap_chain_addr_t *a_addr, dap_enc_key_t *a_key, dap_chain_net_id_t *a_net_id);
int dap_chain_addr_check_sum(const dap_chain_addr_t *a_addr);
static inline long double dap_chain_balance_to_coins( uint128_t a_balance){
return (long double) a_balance / DATOSHI_LD;
}
static inline uint128_t dap_chain_coins_to_balance( long double a_balance){
return (uint128_t)( a_balance * DATOSHI_LD) ;
}
/**
* @brief dap_chain_hash_to_str
* @param a_hash
* @return
*/
static inline char * dap_chain_hash_slow_to_str_new(dap_chain_hash_slow_t * a_hash)
{
const size_t c_hash_str_size = sizeof(*a_hash)*2 +1 /*trailing zero*/ +2 /* heading 0x */ ;
char * ret = DAP_NEW_Z_SIZE(char, c_hash_str_size);
dap_chain_hash_slow_to_str(a_hash,ret,c_hash_str_size);
return ret;
}
/**
* @brief dap_chain_hash_kind_check
* @param a_hash
* @details
*/
static inline dap_chain_hash_slow_kind_t dap_chain_hash_slow_kind_check(dap_chain_hash_slow_t * a_hash, const uint8_t a_valuable_head )
{
register uint8_t i;
register uint8_t l_hash_first = a_hash->raw[0];
register uint8_t * l_hash_data = a_hash->raw;
for ( i = 1; i < a_valuable_head; ++i ){
if ( l_hash_data[i] != l_hash_first )
return HASH_USELESS;
}
if( l_hash_first == 0 )
return HASH_GOLD;
else
return HASH_SILVER;
}
#ifdef __cplusplus
}
#endif
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* Kelvin Project https://github.com/kelvinblockchain
* Copyright (c) 2017-2018
* 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
#include <stdint.h>
#include "dap_common.h"
#include "dap_math_ops.h"
#include "dap_chain_common.h"
#define DAP_CHAIN_DATUM_VERSION 0x00
/// End section, means all the rest of the block is empty
#define DAP_CHAIN_DATUM_BLOCK_END 0x0000
/// Section with additional roots, for example transaction roots
#define DAP_CHAIN_DATUM_BLOCK_ROOTS 0x0001
/// Transaction header section
#define DAP_CHAIN_DATUM_TX 0x0100
/// Transaction request section
#define DAP_CHAIN_DATUM_TX_REQUEST 0x0300
/// Smart contract: DVM code section
#define DAP_CHAIN_DATUM_WASM_CODE 0x0900
/// Smart contract: DVM code section
#define DAP_CHAIN_DATUM_WASM_DATA 0x0901
/// Smart contract: EVM code section
#define DAP_CHAIN_DATUM_EVM_CODE 0x0910
/// Smart contract: EVM data section
#define DAP_CHAIN_DATUM_EVM_DATA 0x0911
/// Pub key section, with sign and address
#define DAP_CHAIN_DATUM_PKEY 0x0c00
/// Token
#define DAP_CHAIN_DATUM_TOKEN_DECL 0xf000
#define DAP_CHAIN_DATUM_TOKEN_EMISSION 0xf100
static const char * c_datum_type_str[]={
[DAP_CHAIN_DATUM_TX]="DATUM_TX",
[DAP_CHAIN_DATUM_TX_REQUEST]="DATUM_TX_REQUEST",
[DAP_CHAIN_DATUM_WASM_CODE]="DATUM_WASM_CODE",
[DAP_CHAIN_DATUM_WASM_DATA]="DATUM_WASM_DATA",
[DAP_CHAIN_DATUM_EVM_CODE]="DATUM_EVM_CODE",
[DAP_CHAIN_DATUM_EVM_DATA]="DATUM_EVM_DATA",
[DAP_CHAIN_DATUM_PKEY]="DATUM_PKEY",
[DAP_CHAIN_DATUM_TOKEN_DECL]="DATUM_TOKEN_DECL",
[DAP_CHAIN_DATUM_TOKEN_EMISSION]="DATUM_TOKEN_EMISSION",
};
#define DAP_CHAIN_DATUM_ID_SIZE 4
// Datum subchain type id
typedef union dap_chain_datum_typeid{
uint8_t data[DAP_CHAIN_DATUM_ID_SIZE];
} DAP_ALIGN_PACKED dap_chain_datum_typeid_t;
/**
* @struct dap_chain_block_section
* @brief section inside the block
*/
typedef struct dap_chain_datum{
struct{
/// Datum version
uint8_t version_id;
/// Section type id
uint16_t type_id;
/// Data section size
uint32_t data_size;
/// Create timestamp (GM time)
uint64_t ts_create;
} DAP_ALIGN_PACKED header;
uint8_t data[]; /// Stored datum body
} DAP_ALIGN_PACKED dap_chain_datum_t;
struct dap_chain;
typedef struct dap_chain dap_chain_t;
typedef struct dap_chain_datum_iter{
dap_chain_t * chain;
dap_chain_datum_t * cur;
void * cur_item;
void * atom_iter;
} dap_chain_datum_iter_t;
typedef dap_chain_datum_iter_t* (*dap_chain_datum_callback_iter_create_t)(dap_chain_t * );
typedef dap_chain_datum_t* (*dap_chain_datum_callback_iter_get_first_t)(dap_chain_datum_iter_t * );
typedef dap_chain_datum_t* (*dap_chain_datum_callback_iter_get_next_t)(dap_chain_datum_iter_t * );
typedef void (*dap_chain_datum_callback_iter_delete_t)(dap_chain_datum_iter_t * );
static inline size_t dap_chain_datum_size(dap_chain_datum_t * a_datum)
{
if(!a_datum)
return 0;
return sizeof(a_datum->header) + a_datum->header.data_size;
}
dap_chain_datum_t * dap_chain_datum_create(uint16_t a_type_id, const void * a_data, size_t a_data_size);
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* 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
#include "dap_common.h"
#include "dap_chain_common.h"
/**
* @struct dap_chain_datum_hashtree_roots_v1
* @brief Hash tree roots for block, version 1
*/
typedef struct dap_chain_datum_hashtree_roots_v1{
dap_chain_hash_fast_t main;
} DAP_ALIGN_PACKED dap_chain_block_roots_v1_t;
/**
* @struct dap_chain_datum_hashtree_roots_v2
* @brief Hash tree roots for block, version 2
*/
typedef struct dap_chain_datum_hashtree_roots_v2{
dap_chain_hash_fast_t main;
dap_chain_hash_fast_t txs;
} DAP_ALIGN_PACKED dap_chain_datum_hashtree_roots_v2_t;
typedef dap_chain_datum_hashtree_roots_v2_t dap_chain_datum_hashtree_roots_t;
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* CellFrame https://cellframe.net
* Sources https://gitlab.demlabs.net/cellframe
* Copyright (c) 2017-2019
* All rights reserved.
This file is part of CellFrame SDK the open source project
CellFrame SDK 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.
CellFrame SDK 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 CellFrame SDK based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "dap_chain_common.h"
#include "dap_sign.h"
// Token declaration
typedef struct dap_chain_datum_token{
struct {
uint16_t version;
char ticker[DAP_CHAIN_TICKER_SIZE_MAX];
uint64_t total_supply;
uint16_t signs_valid; // Emission auth signs
uint16_t signs_total; // Emission auth signs
} DAP_ALIGN_PACKED header;
uint8_t signs[]; // Signs if exists
} DAP_ALIGN_PACKED dap_chain_datum_token_t;
#define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED 0x00
#define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH 0x01
#define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO 0x02
#define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER 0x03
#define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT 0x04
extern const char *c_dap_chain_datum_token_emission_type_str[];
// Token emission
typedef struct dap_chain_datum_token_emission{
struct {
uint8_t version;
uint8_t type; // Emission Type
char ticker[DAP_CHAIN_TICKER_SIZE_MAX];
dap_chain_addr_t address; // Emission holder's address
uint64_t value;
} DAP_ALIGN_PACKED hdr;
union {
struct {
dap_chain_addr_t addr;
int flags;
uint64_t lock_time;
} DAP_ALIGN_PACKED type_smart_contract;
struct {
uint64_t value_start;// Default value. Static if nothing else is defined
char value_change_algo_codename[32];
} DAP_ALIGN_PACKED type_atom_owner;
struct {
char codename[32];
} DAP_ALIGN_PACKED type_algo;
struct {
uint16_t signs_count;
uint8_t signs[];
} DAP_ALIGN_PACKED type_auth;// Signs if exists
} data;
} DAP_ALIGN_PACKED dap_chain_datum_token_emission_t;
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* 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
#include "dap_enc_key.h"
#include "dap_chain_common.h"
#include "dap_chain_datum.h"
typedef enum dap_chain_tx_cond_type {
COND_SERVICE_PROVIDE = 0x20, //
COND_SERVICE_BILL = 0x30, //
} dap_chain_tx_cond_type_t;
/**
* @struct dap_chain_datum_tx
* @brief Transaction section, consists from lot of tx_items
*/
typedef struct dap_chain_datum_tx{
struct {
uint64_t ts_created;
uint32_t tx_items_size; // size of next sequencly lying tx_item sections would be decided to belong this transaction
} DAP_ALIGN_PACKED header;
uint8_t tx_items[];
} DAP_ALIGN_PACKED dap_chain_datum_tx_t;
/**
* Create empty transaction
*
* return transaction, 0 Error
*/
dap_chain_datum_tx_t* dap_chain_datum_tx_create(void);
/**
* Delete transaction
*/
void dap_chain_datum_tx_delete(dap_chain_datum_tx_t *a_tx);
/**
* Get size of transaction
*
* return size, 0 Error
*/
size_t dap_chain_datum_tx_get_size(dap_chain_datum_tx_t *a_tx);
/**
* Insert item to transaction
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_item(dap_chain_datum_tx_t **a_tx, const uint8_t *a_item);
/**
* Create 'in' item and insert to transaction
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_in_item(dap_chain_datum_tx_t **a_tx, dap_chain_hash_fast_t *a_tx_prev_hash,
uint32_t a_tx_out_prev_idx);
/**
* Create 'in_cond' item and insert to transaction
*
* return 0 Ok, -1 Error
*/
int dap_chain_datum_tx_add_in_cond_item(dap_chain_datum_tx_t **a_tx, dap_chain_hash_fast_t *a_tx_prev_hash,
uint32_t a_tx_out_prev_idx,
uint32_t a_receipt_idx);
/**
* Create 'out' item and insert to transaction
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint64_t a_value);
/**
* Create 'out_cond' item and insert to transaction
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size);
/**
* Sign a transaction (Create sign item and insert to transaction)
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_sign_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key);
/**
* Verify all sign item in transaction
*
* return 1 Ok, 0 Invalid sign, -1 Not found sing or other Error
*/
int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *a_tx);
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* 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
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_item
* @brief Sections belongs to heading tx section, with inputs, outputs and others tx relatated items
*/
typedef struct dap_chain_tx_in{
struct {
dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type
dap_chain_hash_fast_t tx_prev_hash; /// @param tx_prev_hash @brief Hash of the previous transaction. 0 for generation TX
uint32_t tx_out_prev_idx; /// @param tx_prev_idx @brief Previous tx_out index. 0 for generation TX
// dap_sign_type_t sig_type; /// Signature type
// uint32_t sig_size; /// Signature size
} header; /// Only header's hash is used for verification
// uint32_t seq_no; /// Sequence number, out of the header so could be changed during reorganization
// uint8_t sig[]; /// @param sig @brief raw signatura dat
} DAP_ALIGN_PACKED dap_chain_tx_in_t;
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* 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
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_item
* @brief Sections belongs to heading tx section, with inputs, outputs and others tx relatated items
*/
typedef struct dap_chain_tx_in_cond {
struct {
dap_chain_tx_item_type_t type :8; /// @param type @brief Transaction item type
dap_chain_hash_fast_t tx_prev_hash; /// @param tx_prev_hash @brief Hash of the previous transaction. 0 for generation TX
uint32_t tx_out_prev_idx; /// @param tx_prev_idx @brief Previous tx_out index. 0 for generation TX
uint32_t receipt_idx;
} header; /// Only header's hash is used for verification
}DAP_ALIGN_PACKED dap_chain_tx_in_cond_t;
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* 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
#include <stdint.h>
#include <string.h>
//#include <glib.h>
#include "dap_common.h"
#include "dap_list.h"
#include "dap_chain_common.h"
#include "dap_sign.h"
#include "dap_chain_datum_tx.h"
#include "dap_chain_datum_tx_in.h"
#include "dap_chain_datum_tx_out.h"
#include "dap_chain_datum_tx_in_cond.h"
#include "dap_chain_datum_tx_out_cond.h"
#include "dap_chain_datum_tx_sig.h"
#include "dap_chain_datum_tx_pkey.h"
#include "dap_chain_datum_tx_token.h"
#include "dap_chain_datum_tx_receipt.h"
/**
* Get item type
*
* return type, or TX_ITEM_TYPE_ANY if error
*/
dap_chain_tx_item_type_t dap_chain_datum_tx_item_get_type(const uint8_t *a_item);
/**
* Get item size
*
* return size, 0 Error
*/
size_t dap_chain_datum_item_tx_get_size(const uint8_t *a_item);
/**
* Create item dap_chain_tx_token_t
*
* return item, NULL Error
*/
dap_chain_tx_token_t* dap_chain_datum_tx_item_token_create(dap_chain_hash_fast_t * a_datum_token_hash,const char * a_ticker);
/**
* Create item dap_chain_tx_out_t
*
* return item, NULL Error
*/
dap_chain_tx_in_t* dap_chain_datum_tx_item_in_create(dap_chain_hash_fast_t *a_tx_prev_hash, uint32_t a_tx_out_prev_idx);
dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fast_t *a_tx_prev_hash, uint32_t a_tx_out_prev_idx,
uint32_t a_receipt_idx);
/**
* Create item dap_chain_tx_out_t
*
* return item, NULL Error
*/
dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint64_t a_value);
/**
* Create item dap_chain_tx_out_cond_t
*
* return item, NULL Error
*/
dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit,
const void *a_cond, size_t a_cond_size);
/**
* Create item dap_chain_tx_sig_t
*
* return item, NULL Error
*/
dap_chain_tx_sig_t* dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, const void *a_data, size_t a_data_size);
/**
* Get sign from sign item
*
* return sign, NULL Error
*/
dap_sign_t* dap_chain_datum_tx_item_sign_get_sig(dap_chain_tx_sig_t *a_tx_sig);
/**
* Get item from transaction
*
* a_tx [in] transaction
* a_item_idx_start[in/out] start index / found index of item in transaction, if 0 then from beginning
* a_type[in] type of item being find, if TX_ITEM_TYPE_ANY - any item
* a_item_out_size size[out] size of returned item
* return item data, NULL Error index or bad format transaction
*/
uint8_t* dap_chain_datum_tx_item_get( dap_chain_datum_tx_t *a_tx, int *a_item_idx_start,
dap_chain_tx_item_type_t a_type, int *a_item_out_size);
// Get all item from transaction by type
dap_list_t* dap_chain_datum_tx_items_get(dap_chain_datum_tx_t *a_tx, dap_chain_tx_item_type_t a_type, int *a_item_count);
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* 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
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_out
* @brief Transaction item outout
*/
typedef struct dap_chain_tx_out{
struct {
dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type
uint64_t value; /// @param value @brief Number of Datoshis ( DAP/10^9 ) to be transfered
} header; /// Only header's hash is used for verification
dap_chain_addr_t addr; ////
} DAP_ALIGN_PACKED dap_chain_tx_out_t;
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* Alexander Lysikov <alexander.lysikov@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* 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
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
#define DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY 0x01
/**
* @struct dap_chain_tx_out
* @brief Transaction item out_cond
*/
typedef struct dap_chain_tx_out_cond {
struct {
/// Transaction item type
dap_chain_tx_item_type_t item_type :8;
/// Condition subtype
uint8_t subtype;
/// Number of Datoshis ( DAP/10^9 ) to be reserver for service
uint64_t value;
/// When time expires this output could be used only by transaction owner
dap_chain_time_t ts_expires;
} header;
union {
struct {
/// Structure with specific for service pay condition subtype
struct {
/// Public key hash that could use this conditioned outout
dap_chain_hash_fast_t pkey_hash;
/// Service uid that only could be used for this outout
dap_chain_net_srv_uid_t srv_uid;
/// Price unit thats used to check price max
dap_chain_net_srv_price_unit_uid_t unit;
/// Maximum price per unit
uint64_t unit_price_max_datoshi;
/// Condition parameters size
uint32_t params_size;
} DAP_ALIGN_PACKED header;
uint8_t params[]; // condition parameters, pkey, hash or smth like this
} DAP_ALIGN_PACKED srv_pay;
} subtype;
}DAP_ALIGN_PACKED dap_chain_tx_out_cond_t;
uint8_t* dap_chain_datum_tx_out_cond_item_get_params(dap_chain_tx_out_cond_t *a_tx_out_cond, size_t *a_params_size_out);
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* 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
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_pkey
* @brief TX item with one of the transaction's public keys
*/
typedef struct dap_chain_tx_pkey{
struct {
dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type
dap_sign_type_t sig_type; /// Signature type
uint32_t sig_size; /// Signature size
} header; /// Only header's hash is used for verification
uint32_t seq_no; /// Sequence number, out of the header so could be changed during reorganization
uint8_t pkey[]; /// @param sig @brief raw pkey dat
} DAP_ALIGN_PACKED dap_chain_tx_pkey_t;
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* CellFrame https://cellframe.net
* Sources https://gitlab.demlabs.net/cellframe
* Copyright (c) 2017-2019
* All rights reserved.
This file is part of CellFrame SDK the open source project
CellFrame SDK 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.
CellFrame SDK 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 CellFrame SDK based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include "dap_chain_common.h"
/**
* @struct dap_chain_tx_out
* @brief Transaction item out_cond
*/
typedef struct dap_chain_datum_tx_receipt {
dap_chain_tx_item_type_t type :8; // Transaction item type
dap_chain_receipt_info_t receipt_info; // Receipt itself
uint16_t size;
uint16_t exts_size;
byte_t exts_n_signs[]; // Signatures, first from provider, second from client
}DAP_ALIGN_PACKED dap_chain_datum_tx_receipt_t;
#ifdef __cplusplus
extern "C" {
#endif
static inline size_t dap_chain_datum_tx_receipt_get_size_hdr(){ return 1+sizeof (dap_chain_receipt_info_t)+sizeof (uint16_t) +sizeof (uint16_t); }
dap_chain_datum_tx_receipt_t * dap_chain_datum_tx_receipt_create( dap_chain_net_srv_uid_t srv_uid,
dap_chain_net_srv_price_unit_uid_t units_type,
uint64_t units, uint64_t value_datoshi, const void * a_ext, size_t a_ext_size);
size_t dap_chain_datum_tx_receipt_sign_add(dap_chain_datum_tx_receipt_t * a_receipt, size_t a_receipt_size, dap_enc_key_t *a_key );
dap_sign_t* dap_chain_datum_tx_receipt_sign_get(dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size , uint16_t sign_position);
uint16_t dap_chain_datum_tx_receipt_signs_count(dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size);
static inline uint16_t dap_chain_datum_tx_receipt_get_size(const dap_chain_datum_tx_receipt_t * l_receipt)
{
return l_receipt->size;
}
#ifdef __cplusplus
}
#endif
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* 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
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_sig
* @brief Section with set of transaction signatures
*/
typedef struct dap_chain_tx_sig{
struct {
dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type
// dap_sign_type_t sig_type; /// Signature type
uint32_t sig_size; /// Signature size
} header; /// Only header's hash is used for verification
uint8_t sig[]; /// @param sig @brief raw signature data
} DAP_ALIGN_PACKED dap_chain_tx_sig_t;
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* 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
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_token
* @brief Token item
*/
typedef struct dap_chain_tx_token{
struct {
dap_chain_tx_item_type_t type:8;
char ticker[DAP_CHAIN_TICKER_SIZE_MAX];
uint8_t padding; // Padding
dap_chain_id_t token_emission_chain_id;
dap_chain_hash_fast_t token_emission_hash;
} header; /// Only header's hash is used for verification
} DAP_ALIGN_PACKED dap_chain_tx_token_t;
HEADERS += $$PWD/include/dap_chain_common.h \
$$PWD/include/dap_chain_datum.h \
$$PWD/include/dap_chain_datum_hashtree_roots.h \
$$PWD/include/dap_chain_datum_token.h \
$$PWD/include/dap_chain_datum_tx.h \
$$PWD/include/dap_chain_datum_tx_in_cond.h \
$$PWD/include/dap_chain_datum_tx_in.h \
$$PWD/include/dap_chain_datum_tx_items.h \
$$PWD/include/dap_chain_datum_tx_out_cond.h \
$$PWD/include/dap_chain_datum_tx_out.h \
$$PWD/include/dap_chain_datum_tx_pkey.h \
$$PWD/include/dap_chain_datum_tx_receipt.h \
$$PWD/include/dap_chain_datum_tx_sig.h \
$$PWD/include/dap_chain_datum_tx_token.h
SOURCES += $$PWD/src/dap_chain_common.c \
$$PWD/src/dap_chain_datum.c \
$$PWD/src/dap_chain_datum_hashtree_roots.c \
$$PWD/src/dap_chain_datum_token.c \
$$PWD/src/dap_chain_datum_tx.c \
$$PWD/src/dap_chain_datum_tx_items.c \
$$PWD/src/dap_chain_datum_tx_out_cond.c \
$$PWD/src/dap_chain_datum_tx_receipt.c \
$$PWD/src/dap_chain_datum_tx_token.c
INCLUDEPATH += $$PWD/include
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* Kelvin Project https://github.com/kelvinblockchain
* Copyright (c) 2017-2018
* 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 <string.h>
#include "dap_common.h"
#include "dap_sign.h"
#include "dap_chain_common.h"
#include "dap_enc_base58.h"
#include "dap_hash.h"
#define LOG_TAG "dap_chain_common"
/**
* @brief dap_chain_hash_to_str
* @param a_hash
* @param a_str
* @param a_str_max
* @return
*/
size_t dap_chain_hash_slow_to_str( dap_chain_hash_slow_t *a_hash, char *a_str, size_t a_str_max )
{
const size_t c_hash_str_size = sizeof(*a_hash) * 2 + 1 /*trailing zero*/+ 2 /* heading 0x */;
if(a_str_max < c_hash_str_size) {
log_it(L_ERROR, "String for hash too small, need %u but have only %u", c_hash_str_size, a_str_max);
}
size_t i;
dap_snprintf(a_str, 3, "0x");
for(i = 0; i < sizeof(a_hash->raw); ++i)
dap_snprintf( a_str + i * 2 + 2, 3, "%02x", a_hash->raw[i] );
a_str[c_hash_str_size] = '\0';
//#define dap_htoa64( out, in, len ) \
return strlen(a_str);
}
/**
* @brief dap_chain_hash_fast_to_str
* @param a_hash
* @param a_str
* @param a_str_max
* @return
*/
#if 0
size_t dap_chain_hash_fast_to_str( dap_chain_hash_fast_t *a_hash, char *a_str, size_t a_str_max )
{
const size_t c_hash_str_size = sizeof(*a_hash) * 2 + 1 /*trailing zero*/+ 2 /* heading 0x */;
if ( a_str_max < c_hash_str_size ) {
log_it( L_ERROR, "String for hash too small, need %u but have only %u", c_hash_str_size, a_str_max );
}
// size_t i;
// faster conversion to string
dap_snprintf( a_str, 3, "0x" );
size_t l_ret = dap_bin2hex(a_str + 2, a_hash->raw, sizeof(a_hash->raw));
//for(i = 0; i < sizeof(a_hash->raw); ++i)
// dap_snprintf(a_str + i * 2 + 2, 3, "%02x", (a_hash->raw[i]));
a_str[c_hash_str_size - 1] = '\0';
if(!l_ret)
return 0;
return c_hash_str_size - 1; //strlen(a_str);
}
#endif
/**
* @brief dap_chain_addr_to_str
* @param a_addr
* @return
*/
char* dap_chain_addr_to_str(const dap_chain_addr_t *a_addr)
{
if ( a_addr ==NULL)
return NULL;
size_t l_ret_size = DAP_ENC_BASE58_ENCODE_SIZE(sizeof(dap_chain_addr_t));
char * l_ret = DAP_NEW_SIZE(char, l_ret_size);
if(dap_enc_base58_encode(a_addr, sizeof(dap_chain_addr_t), l_ret) > 0)
return l_ret;
else {
DAP_DELETE(l_ret);
return NULL;
}
}
/**
* @brief dap_chain_str_to_addr
* @param a_addr
* @return
*/
dap_chain_addr_t* dap_chain_addr_from_str(const char *a_str)
{
size_t l_str_len = (a_str) ? strlen(a_str) : 0;
if(l_str_len <= 0)
return NULL;
size_t l_ret_size = DAP_ENC_BASE58_DECODE_SIZE(l_str_len);
dap_chain_addr_t * l_addr = DAP_NEW_Z_SIZE(dap_chain_addr_t, l_ret_size);
if(dap_enc_base58_decode(a_str, l_addr) == sizeof(dap_chain_addr_t) &&
dap_chain_addr_check_sum(l_addr)==1)
return l_addr;
else
DAP_DELETE(l_addr);
return NULL;
}
/**
* @brief dap_chain_net_id_from_str
* @param a_net_str
* @return
*/
dap_chain_net_id_t dap_chain_net_id_from_str( const char * a_net_str)
{
dap_chain_net_id_t l_ret={0};
size_t l_net_str_len = strlen( a_net_str);
if (l_net_str_len >2){
a_net_str+=2;
l_net_str_len-=2;
if (l_net_str_len == sizeof (l_ret)/2 ){
size_t l_pos =0;
char l_byte[3];
while(l_net_str_len){
// Copy two characters for bytes
memcpy(l_byte,a_net_str,2);
l_byte[2]='\0';
// Read byte chars
if ( sscanf(l_byte,"%02hhx",&l_ret.raw[l_pos] ) != 1)
if( sscanf(l_byte,"%02hhX",&l_ret.raw[l_pos] ) ==1 )
break;
// Update pos
l_pos++;
// Reduce in two steps to not to break if input will have bad input
l_net_str_len-=1;
if(l_net_str_len)
l_net_str_len-=1;
}
}else
log_it(L_WARNING,"Wrong input string \"%s\" not recognized as network id", a_net_str);
}
return l_ret;
}
/**
* @brief dap_chain_net_srv_uid_from_str
* @param a_net_str
* @return
*/
dap_chain_net_srv_uid_t dap_chain_net_srv_uid_from_str( const char * a_net_srv_uid_str)
{
dap_chain_net_srv_uid_t l_ret={{0}};
size_t l_net_srv_uid_str_len = strlen( a_net_srv_uid_str);
if (l_net_srv_uid_str_len >2){
a_net_srv_uid_str+=2;
l_net_srv_uid_str_len-=2;
if (l_net_srv_uid_str_len == sizeof (l_ret)/2 ){
size_t l_pos =0;
char l_byte[3];
while(l_net_srv_uid_str_len){
// Copy two characters for bytes
memcpy(l_byte,a_net_srv_uid_str,2);
l_byte[2]='\0';
// Read byte chars
if ( sscanf(l_byte,"%02hhx",&l_ret.raw[l_pos] ) != 1)
if( sscanf(l_byte,"%02hhX",&l_ret.raw[l_pos] ) ==1 )
break;
// Update pos
l_pos++;
// Reduce in two steps to not to break if input will have bad input
l_net_srv_uid_str_len-=1;
if(l_net_srv_uid_str_len)
l_net_srv_uid_str_len-=1;
}
}else
log_it(L_WARNING,"Wrong input string \"%s\" not recognized as network id", a_net_srv_uid_str);
}
return l_ret;
}
/**
* @brief dap_chain_addr_fill
* @param a_addr
* @param a_key
* @param a_net_id
* @return
*/
void dap_chain_addr_fill(dap_chain_addr_t *a_addr, dap_enc_key_t *a_key, dap_chain_net_id_t *a_net_id)
{
if(!a_addr || !a_key || !a_net_id)
return;
a_addr->addr_ver = DAP_CHAIN_ADDR_VERSION_CURRENT;
a_addr->net_id.uint64 = a_net_id->uint64;
a_addr->sig_type.raw = dap_sign_type_from_key_type(a_key->type).raw;
// key -> serialized key
dap_chain_hash_fast_t l_hash_public_key;
size_t l_pub_key_data_size;
uint8_t *l_pub_key_data = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_data_size);
// serialized key -> key hash
if(dap_hash_fast(l_pub_key_data, l_pub_key_data_size, &l_hash_public_key))
memcpy(a_addr->data.hash, l_hash_public_key.raw, sizeof(l_hash_public_key.raw));
DAP_DELETE(l_pub_key_data);
// calc checksum
dap_hash_fast(a_addr, sizeof(dap_chain_addr_t) - sizeof(dap_chain_hash_fast_t), &a_addr->checksum);
}
/**
* @brief dap_chain_addr_check_sum
* @param a_addr
* @return 1 Ok, -1 Invalid a_addr or checksum
*/
int dap_chain_addr_check_sum(const dap_chain_addr_t *a_addr)
{
if(!a_addr)
return -1;
dap_chain_hash_fast_t l_checksum;
// calc checksum
dap_hash_fast(a_addr, sizeof(dap_chain_addr_t) - sizeof(dap_chain_hash_fast_t), &l_checksum);
if(!memcmp(a_addr->checksum.raw, l_checksum.raw, sizeof(l_checksum.raw)))
return 1;
return -1;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment