Skip to content

Programming Beam Wallet Transactions

Alex Romanov edited this page May 26, 2019 · 1 revision

This section describes the structure of Beam transactions. Transactions are created and managed locally in the Beam wallet.

Transaction parameters

Transactions are defined and stored in the database as a set of transaction parameters, thus allowing a lot of flexibility.

The complete list of transaction parameters is defined here

Transaction parameters are divided into two groups. Public parameters can be set during the interaction between wallets. Once public parameter is set, it can not be changed. Private parameters, can be set and reset at any time within the wallet and are not sent outside the wallet. The reason for this separation is to maintain a clear distinction between the parameters that are revealed to or received from the other wallet and can thus irreversibly affect the state of negotiation between the wallets creating the transaction.

Transaction id

TxID, defined here is the unique id of the transaction

ITransaction interface [ definition ]

Defines basic set of operations for each transaction, Update, Cancel and Rollback

struct ITransaction
    {
        using Ptr = std::shared_ptr<ITransaction>;
        virtual TxType GetType() const = 0;
        virtual void Update() = 0;
        virtual void Cancel() = 0;
        virtual bool Rollback(Height height) = 0;
    };

BaseTransaction [ definition ]

Implements the ITransaction interface and provides the state machine for creation of transactions. Constructor for BaseTransaction receives three parameters:

BaseTransaction(INegotiatorGateway& gateway, beam::IWalletDB::Ptr walletDB, const TxID& txID);

BaseTxBuilder

This class encapsulates all the methods necessary for transaction creation following the protocol described here.

INegotiatorGateway [ definition ]

Negotiator Gateway provides an abstraction of the messaging between the node or another wallet during the transaction creation. The INegotiatorGateway interface is implemented by the Wallet class.

BaseTransaction::Update method

The Update method describes generic logic of asynchronous transaction update. The update logic is implemented in the UpdateImpl method described below.

void BaseTransaction::Update()
    {
        AsyncContextHolder async(m_Gateway);
        try
        {
            if (CheckExternalFailures())
            {
                return;
            }

            UpdateImpl();

            CheckExpired();
        }
        catch (const TransactionFailedException& ex)
        {
            LOG_ERROR() << GetTxID() << " exception msg: " << ex.what();
            OnFailed(ex.GetReason(), ex.ShouldNofify());
        }
        catch (const exception& ex)
        {
            LOG_ERROR() << GetTxID() << " exception msg: " << ex.what();
            OnFailed(TxFailureReason::Unknown);
        }
    }

SimpleTransaction ( wallet_transaction.h )

SimpleTransaction extends BaseTransaction and provides an implementation of the basic confidential transaction between two wallets. The key part of the implementation is the void SimpleTransaction::UpdateImpl() method that provides the state machine for the transaction creation logic.

//TODO: Add detailed explanation for the transaction creation logic

Clone this wiki locally