You can be interested in this document if:
- you want to create your own implementation of the Request protocol
- you want to implement a new extension in the advanced logic
- you are curious enough to dive and see what is under the hood of the Request protocol
You don't need to read this document if:
- you want to develop an app using the request protocol (see the API library instead here)
Prerequisite: Having read the request logic specification (see here)
The advanced logic is made of extensions
that add features to simple requests from the request logic.
This list of possible extension types:
Extension type | type code | Description | Note |
---|---|---|---|
Content data | contentData |
Extra data to document the request | see request data format |
Payment Network | paymentNetwork |
Payment detection | 3 types: - Declarative (Bilateral consensus) - Read (Proof of payment offchain) - Write (Proof written by third party on chain) Linked to currencies: - BTC - ETH - [...] |
Other features (e.g. Escrow, Payment conditions...) are not handled in this first version but maybe develop later.
The extensions of the advanced logic follow the same design as the requests in the request logic (properties, state, actions...). It provides also a description
and warnings
.
An extension is defined by :
- a list of
properties
(thestate
of an extension is its properties value at time t) - a list of
actions
able to modify thestate
. Every action:- can have a list of
parameters
as input - must have a list of
conditions
, if they are not satisfied the action is ignored - can have a list of
warnings
to show the well-known vulnerabilities under conditions - can modify the
state
- can have a list of
- a way to interpret the
properties
offchain - a
description
in English that explains the purpose of the extension. This explanation is targeted at the users of applications that don't support the extension in their UI.
The actions
are stored in the array extensionsData
of the request state.
The extensionsData
are stored in the actions of the request logic.
There are two types of actions:
- Creation
- Update
An extension must have one and only one creation action.
An extension can only be created at the creation of the request.
Only one instance of an extension type
can be created for each request.
The actions
are ordered, the first action
must be the creation
and the following ones will be updates
.
The actions
are interpreted to build the state
of the extension.
The properties are in a JSON object.
Property | Type | Description |
---|---|---|
id | String | Unique identification of the extension implementation |
type | String | Type of the extension (e.g: "paymentNetwork", "contentData" ... ) |
version | String | Specifications version of the extension |
values | Object | Specific properties of the extension |
events | Array | List of the actions performed on the extension |
The types allowed in values
are:
- Object
- Array
- String
- Enum
- Amount
- Identity
Example:
{
"type": "paymentNetwork",
"id": "pn-bitcoin-address-based",
"version": "0.1.0",
"values": {
"paymentAddress": "mt2pvgxvLv1A51A9CG8Qqo5YpAjfc7yChx",
}
}
Specify an action of an extension is defining:
- is the action a
creation
or anupdate
? - the
action name
, if an update (for creation it is 'create') - the
parameters
- the
conditions
of validity (it can use the request state and the extension state ) - the
result
(the modification on the extension state)
If the action is the creation, the name must be create
.
Otherwise, the name must be unique regarding the other actions name of the extension.
The parameters are specific to the extension.
The conditions
validate the context of the actions.
The action will be taken into account only if all the conditions are satisfied.
Example:
- request currency must be 'BTC'
- transaction signer must be Payer
- request state must be 'accepted'
The warnings
are shown when the actions match specific conditions.
The action will be applied but a message must be displayed.
Example:
- a bitcoin request created by a payer with the paymentAddress must show "the payment address have not been confirmed by the payee"
The action result defines the modification made on the extension state
from the action
and its parameters
.
Example:
- the property 'paymentAddress' takes the value of paymentAddress from the action parameters
- increases the property 'lateFees' by 10 percent
The key point of creating an extension is to provide an offchain interpretation.
The interpretation explains to the users on how to use the state
and actions
offchain.
Example:
- When a bitcoin transaction reaches the address given in
payeeAddress
, consider this transaction as payment for this request
Type | Description | Requirement | |
---|---|---|---|
type | String | Type of the extension | Mandatory |
version | String | Specification version of the extension | Mandatory |
id | String | Unique identification of the extension | Mandatory |
parameters | Object | Parameters of the creation - specific for each extension | Optional |
Example:
{
"type": "paymentNetwork",
"id": "pn-bitcoin-address-based",
"version": "0.1.0",
"parameters": {
"paymentAddress": "mt2pvgxvLv1A51A9CG8Qqo5YpAjfc7yChx",
}
}
Type | Description | Requirement | |
---|---|---|---|
id | String | Unique identification of the extension | Mandatory |
action | String | Name of the action - specific for each extension | Mandatory |
parameters | Object | Parameters of the creation - specific for each extension | Optional |
Example:
{
"id": "pn-bitcoin-address-based",
"action": "addRefundAddress",
"parameters": {
"refundAddress": "mfsSPZdcdXwSMVkPwCsiW39P5y6eYE1bDM"
}
}
All the extensions share one version instead of having a version per extension. Having only one version for all the extensions, avoid the interdependence nightmare of having many extensions with many versions.
The rules to handle a difference of extension versions are:
- extension.version.major > expected
- Ignore the request
- Search for a new version of extensions implementation
- extension.version.major < expected
- Ignore the request
- warning: "obsolete version"
- extension.version.minor > expected
- Ignore the request
- Search for a new version of extensions implementation
- Otherwise:
- Handle the request normally
Note: A special attention must be paid about the request that triggers research of a new version of the protocol implementation. This can be a way to make users to download malicious software.
If an extensionsData does not follow the specification, it can be a difference of version. See the chapter above.
If the version is correct, then 2 cases are possible:
-
The request action is the request creation:
- Ignore the request
- warning: "unknown extension"
-
Otherwise:
- Ignore the extensionsData
- warning : "Unknown extension data"