Packages

Receive Bitcoin transactions over HTTP in a concise and efficient binary serialisation format.

Current section

Files

Jump to
txpost lib txpost.ex
Raw

lib/txpost.ex

defmodule Txpost do
@moduledoc """
Receive Bitcoin transactions over HTTP in a concise and efficient binary
serialisation format.
Txpost implements a standard for encoding and decoding Bitcoin transactions
and other data in a concise binary format using [CBOR](https://cbor.io). A
number of modules following the Plug specification can easily be slotted in
your Phoenix or Plug based application's pipeline. An optional Router module
is available, allowing you to implement routing logic for different types of
transactions from a single endpoint.
* Concise and efficient binary data serialisation format
* Send transactions over HTTP - faster and cheaper
* Simple and flexible schema for transferring Bitcoin transations with arbitrary data parameters
* Send single or multiple transactions in one request
* Sign and verify data payloads with ECDSA signatures
### BRFC specifications
Txpost is an implementation of the following BRFC specifications. They
describe a standard for serialising Bitcoin transactions and associated
parameters, along with arbitrary meta data, in a concise binary format using
CBOR:
* BRFC `c9a2975b3d19` - [CBOR Tx Payload specification](cbor-tx-payload.md)
* BRFC `5b82a2ed7b16` - [CBOR Tx Envelope specification](cbor-tx-envelope.md)
## Installation
The package can be installed by adding `txpost` to your list of dependencies
in `mix.exs`.
def deps do
[
{:txpost, "~> 0.1"}
]
end
Add `Txpost.Parsers.CBOR` to your endpoint's list of parsers.
plug Plug.Parsers,
parsers: [
:json,
Txpost.Parsers.CBOR
]
Finally create any routes needed to handle transaction requests and add
`Txpost.Plug` to the plug pipeline. For example, adding a route to a Phoenix
router:
defmodule MyAppWeb.Router do
use MyAppWeb, :router
pipeline :tx_api do
plug :accepts, ["cbor"]
plug Txpost.Plug
end
scope "/tx" do
pipe_through :tx_api
post "/create", MyAppWeb.TxController, :create
end
end
## Transaction routing
The example above creates a single route passing all transactions to the same
controller. You could create many routes for different transactions but in
some applications it may be desirable to advertise a single endpoint to
receive different types of transactions, each handled by different
controllers. In this case `Txpost.Router` can be used to route transactions to
different controllers, using any logic you need.
A tx router is a module that implements the `c:Txpost.Router.handle_tx/2`
callback.
defmodule MyApp.TxRouter do
use Txpost.Router
def handle_tx(conn, _params) do
case get_req_meta(conn) do
%{"type" => "article"} -> ArticleController.call(conn, :create)
%{"type" => "image"} -> ImageController.call(conn, :create)
end
end
end
For more details, see `Txpost.Router`.
"""
end