Peerplays API Libraries
Tools and Integrations
Development Workflow Docs
Other Documentation
user-sidechain-addresses-mapping
User sidechain address mapping is a component containing sidechain addresses belonging to a particular Peerplays user account. User sidechain addresses mapping is used in sidechain handler, a component of a SON plugin, for filtering events reported by listener, to identify the transactions of interest.
Transactions of interest are:
  • For deposit handling, transfer on a sidechain network where from address is listed in user sidechain addresses mapping and to address is a sidechain address controlled by SON network (Primary wallet).
  • For withdrawal handling, still to decide… E.g. transfer on a Peerplays network where from address is listed in user sidechain addresses mapping and to address is a address on a Peerplays network controlled by SON network (Primary wallet).

Requirements

  • In database terms, user sidechain address mapping is one-to-many relation, where one user can have multiple addresses belonging to him on a different blockchain. No duplicates are allowed, so user can register only one address per sidechain.
  • User sidechain address mapping contains records with Peerplays account as a reference to user, and a string representing the address/account on a target sidechain.
  • User addresses can be added, deleted and updated. Update and delete may be executed only by user to owning the record.
  • User sidechain address mapping operations
    • add_user_sidechain_address - adds user sidechain address
    • update_user_sidechain_address - updates user sidechain address
    • delete_user_sidechain_address - deletes user sidechain address
  • User sidechain address mapping wallet functions
    • add_user_sidechain_address - adds user sidechain address
    • update_user_sidechain_address - updates user sidechain address
    • delete_user_sidechain_address - deletes user sidechain address
    • get_user_sidechain_address - gets a single user sidechain address (by user account id and network)
    • list_user_sidechain_address - lists all users sidechain addresses
    • get_sidechain_addresses - gets a list of all addresses belonging to a given sidechain network

Example of user sidechain addresses mapping

Following table shows user sidechain addresses mapping
User account ID
Network
Addreses
1.1.1
network::bitcoin
BitcoinAddress1
1.1.1
network::ethereum
EthereumAddress1
1.1.2
network::bitcoin
BitcoinAddress2
1.1.3
network::bitcoin
BitcoinAddress3
1.1.4
network::ethereum
EthereumAddress4

Implementation

Consider the following code as a suggestion, not as a 100% completed ad working implementation. Syntax errors may be present.
Following declaration needs to be moved from SON plugin, to the core:
enum networks {
bitcoin,
eos,
ethereum
};
User sidechain address object:
class user_sidechain_address_object : public graphene::db::abstract_object<user_sidechain_addresses_object> {
uint32_t id; // Primary key
account_id_type user; // User owning the address
network network; // Network to whom address belongs
std::string address; // Sidechain address
}
User sidechain address mapping index:
struct by_network;
struct by_user_network;
using user_sidechain_address_multi_index_type = multi_index_container<
user_sidechain_address_object,
indexed_by<
ordered_unique< tag<by_id>,
member<object, object_id_type, &object::id>
>,
ordered_unique< tag<by_network>,
member<user_sidechain_address_object, network, &user_sidechain_address_object::network>
>,
ordered_unique< tag<by_user_network>,
composite_key<user_sidechain_address_object,
member<user_sidechain_address_object, account_id_type, &user_sidechain_address_object::user>,
member<user_sidechain_address_object, network, &user_sidechain_address_object::network>,
>
>
>
>;
  • User sidechain address mapping should be indexed at least by:
    • Primary key index
    • Network field
    • User and network fields
User sidechain address create operations:
struct user_sidechain_address_create_operation : public base_operation
{
uint32_t id; // Primary key
account_id_type user; // User owning the address
network network; // Network to whom address belongs
std::string address; // Sidechain address
void validate()const;
};
Validation should check that the item is not duplicated, by checking user and network fields.
User sidechain address update operations:
struct user_sidechain_address_update_operation : public base_operation
{
uint32_t id; // Primary key
account_id_type user; // User owning the address
network network; // Network to whom address belongs
std::string address; // Sidechain address
void validate()const;
};
Validation should check that the item with the given id exists in the list.
User sidechain address delete operation:
struct user_sidechain_address_delete_operation : public base_operation
{
uint32_t id; // Primary key
void validate()const;
};
Validation should check that the item with the given id exists in the list.
Appropriate evaluators must be implemented too.