Current section
Files
Jump to
Current section
Files
lib/txpost.ex
defmodule Txpost do
@moduledoc """


Send and receive Bitcoin transactions from your Phoenix or Plug-based Elixir
application.
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.
* Receive Bitcoin transactions in a concise and efficient binary serialisation format
* Simple and flexible schema for sending Bitcoin data with other data parameters
* Send multiple transactions in a single request, or build streaming applications
* 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