Skip to content

Module dev_p4.erl

The HyperBEAM core payment ledger.

Description

This module allows the operator to specify another device that can act as a pricing mechanism for transactions on the node, as well as orchestrating a payment ledger to calculate whether the node should fulfil services for users.

The device requires the following node message settings in order to function:

  • p4_pricing-device: The device that will estimate the cost of a request.
  • p4_ledger-device: The device that will act as a payment ledger.

The pricing device should implement the following keys:

<code>GET /estimate?type=pre|post&body=[...]&request=RequestMessage</code><code>GET /price?type=pre|post&body=[...]&request=RequestMessage</code>

The body key is used to pass either the request or response messages to the device. The type key is used to specify whether the inquiry is for a request (pre) or a response (post) object. Requests carry lists of messages that will be executed, while responses carry the results of the execution. The price key may return infinity if the node will not serve a user under any circumstances. Else, the value returned by the price key will be passed to the ledger device as the amount key.

A ledger device should implement the following keys:

<code>POST /credit?message=PaymentMessage&request=RequestMessage</code><code>POST /charge?amount=PriceMessage&request=RequestMessage</code><code>GET /balance?request=RequestMessage</code>

The type key is optional and defaults to pre. If type is set to post, the charge must be applied to the ledger, whereas the pre type is used to check whether the charge would succeed before execution.

Function Index

balance/3Get the balance of a user in the ledger.
faff_test/0*Simple test of p4's capabilities with the faff@1.0 device.
hyper_token_ledger/0*
hyper_token_ledger_test_/0*Ensure that Lua scripts can be used as pricing and ledger devices.
is_chargable_req/2*The node operator may elect to make certain routes non-chargable, using the routes syntax also used to declare routes in router@1.0.
non_chargable_route_test/0*Test that a non-chargable route is not charged for.
request/3Estimate the cost of a transaction and decide whether to proceed with a request.
response/3Postprocess the request after it has been fulfilled.
test_opts/1*
test_opts/2*
test_opts/3*

Function Details

balance/3

balance(X1, Req, NodeMsg) -> any()

Get the balance of a user in the ledger.

faff_test/0 *

faff_test() -> any()

Simple test of p4's capabilities with the faff@1.0 device.

hyper_token_ledger/0 *

hyper_token_ledger() -> any()

hyper_token_ledger_test_/0 *

hyper_token_ledger_test_() -> any()

Ensure that Lua scripts can be used as pricing and ledger devices. Our scripts come in two components: 1. A process script which is executed as a persistent local-process on the node, and which maintains the state of the ledger. This process runs hyper-token.lua as its base, then adds the logic of hyper-token-p4.lua to it. This secondary script implements the charge function that p4@1.0 will call to charge a user's account. 2. A client script, which is executed as a p4@1.0 ledger device, which uses ~push@1.0 to send requests to the ledger process.

is_chargable_req/2 *

is_chargable_req(Req, NodeMsg) -> any()

The node operator may elect to make certain routes non-chargable, using the routes syntax also used to declare routes in router@1.0.

non_chargable_route_test/0 *

non_chargable_route_test() -> any()

Test that a non-chargable route is not charged for.

request/3

request(State, Raw, NodeMsg) -> any()

Estimate the cost of a transaction and decide whether to proceed with a request. The default behavior if pricing-device or p4_balances are not set is to proceed, so it is important that a user initialize them.

response/3

response(State, RawResponse, NodeMsg) -> any()

Postprocess the request after it has been fulfilled.

test_opts/1 *

test_opts(Opts) -> any()

test_opts/2 *

test_opts(Opts, PricingDev) -> any()

test_opts/3 *

test_opts(Opts, PricingDev, LedgerDev) -> any()