2013-05-08 21:16:41 +02:00
|
|
|
btcwire
|
|
|
|
=======
|
|
|
|
|
2015-01-17 06:22:34 +01:00
|
|
|
[![Build Status](http://img.shields.io/travis/btcsuite/btcwire.svg)]
|
|
|
|
(https://travis-ci.org/btcsuite/btcwire) [![Coverage Status]
|
|
|
|
(https://img.shields.io/coveralls/btcsuite/btcwire.svg)]
|
|
|
|
(https://coveralls.io/r/btcsuite/btcwire?branch=master) [![ISC License]
|
2014-12-23 06:13:10 +01:00
|
|
|
(http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)
|
2013-12-09 12:41:54 +01:00
|
|
|
|
2013-05-08 21:31:00 +02:00
|
|
|
Package btcwire implements the bitcoin wire protocol. A comprehensive suite of
|
2014-04-19 21:44:14 +02:00
|
|
|
tests with 100% test coverage is provided to ensure proper functionality.
|
|
|
|
Package btcwire is licensed under the liberal ISC license.
|
2013-05-08 21:31:00 +02:00
|
|
|
|
|
|
|
There is an associated blog post about the release of this package
|
|
|
|
[here](https://blog.conformal.com/btcwire-the-bitcoin-wire-protocol-package-from-btcd/).
|
|
|
|
|
2013-05-10 18:04:30 +02:00
|
|
|
This package is one of the core packages from btcd, an alternative full-node
|
|
|
|
implementation of bitcoin which is under active development by Conformal.
|
|
|
|
Although it was primarily written for btcd, this package has intentionally been
|
|
|
|
designed so it can be used as a standalone package for any projects needing to
|
|
|
|
interface with bitcoin peers at the wire protocol level.
|
|
|
|
|
2013-05-08 21:31:00 +02:00
|
|
|
## Documentation
|
|
|
|
|
2014-12-23 06:13:10 +01:00
|
|
|
[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)]
|
2015-01-16 20:54:11 +01:00
|
|
|
(http://godoc.org/github.com/btcsuite/btcwire)
|
2014-04-19 22:46:03 +02:00
|
|
|
|
2013-05-08 21:31:00 +02:00
|
|
|
Full `go doc` style documentation for the project can be viewed online without
|
|
|
|
installing this package by using the GoDoc site here:
|
2015-01-16 20:54:11 +01:00
|
|
|
http://godoc.org/github.com/btcsuite/btcwire
|
2013-05-08 21:31:00 +02:00
|
|
|
|
|
|
|
You can also view the documentation locally once the package is installed with
|
|
|
|
the `godoc` tool by running `godoc -http=":6060"` and pointing your browser to
|
2015-01-16 20:54:11 +01:00
|
|
|
http://localhost:6060/pkg/github.com/btcsuite/btcwire
|
2013-05-08 21:31:00 +02:00
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
|
|
|
```bash
|
2015-01-16 20:54:11 +01:00
|
|
|
$ go get github.com/btcsuite/btcwire
|
2013-05-08 21:31:00 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
## Bitcoin Message Overview
|
|
|
|
|
|
|
|
The bitcoin protocol consists of exchanging messages between peers. Each message
|
|
|
|
is preceded by a header which identifies information about it such as which
|
|
|
|
bitcoin network it is a part of, its type, how big it is, and a checksum to
|
|
|
|
verify validity. All encoding and decoding of message headers is handled by this
|
|
|
|
package.
|
|
|
|
|
|
|
|
To accomplish this, there is a generic interface for bitcoin messages named
|
|
|
|
`Message` which allows messages of any type to be read, written, or passed
|
|
|
|
around through channels, functions, etc. In addition, concrete implementations
|
|
|
|
of most of the currently supported bitcoin messages are provided. For these
|
|
|
|
supported messages, all of the details of marshalling and unmarshalling to and
|
|
|
|
from the wire using bitcoin encoding are handled so the caller doesn't have to
|
|
|
|
concern themselves with the specifics.
|
|
|
|
|
|
|
|
## Reading Messages Example
|
|
|
|
|
|
|
|
In order to unmarshal bitcoin messages from the wire, use the `ReadMessage`
|
|
|
|
function. It accepts any `io.Reader`, but typically this will be a `net.Conn`
|
|
|
|
to a remote node running a bitcoin peer. Example syntax is:
|
|
|
|
|
|
|
|
```Go
|
2013-05-15 20:57:29 +02:00
|
|
|
// Use the most recent protocol version supported by the package and the
|
2013-05-08 21:31:00 +02:00
|
|
|
// main bitcoin network.
|
|
|
|
pver := btcwire.ProtocolVersion
|
|
|
|
btcnet := btcwire.MainNet
|
|
|
|
|
|
|
|
// Reads and validates the next bitcoin message from conn using the
|
|
|
|
// protocol version pver and the bitcoin network btcnet. The returns
|
|
|
|
// are a btcwire.Message, a []byte which contains the unmarshalled
|
|
|
|
// raw payload, and a possible error.
|
|
|
|
msg, rawPayload, err := btcwire.ReadMessage(conn, pver, btcnet)
|
|
|
|
if err != nil {
|
|
|
|
// Log and handle the error
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
See the package documentation for details on determining the message type.
|
|
|
|
|
|
|
|
## Writing Messages Example
|
|
|
|
|
|
|
|
In order to marshal bitcoin messages to the wire, use the `WriteMessage`
|
|
|
|
function. It accepts any `io.Writer`, but typically this will be a `net.Conn`
|
|
|
|
to a remote node running a bitcoin peer. Example syntax to request addresses
|
|
|
|
from a remote peer is:
|
|
|
|
|
|
|
|
```Go
|
2013-05-15 20:57:29 +02:00
|
|
|
// Use the most recent protocol version supported by the package and the
|
2013-05-08 21:31:00 +02:00
|
|
|
// main bitcoin network.
|
|
|
|
pver := btcwire.ProtocolVersion
|
|
|
|
btcnet := btcwire.MainNet
|
|
|
|
|
|
|
|
// Create a new getaddr bitcoin message.
|
|
|
|
msg := btcwire.NewMsgGetAddr()
|
|
|
|
|
|
|
|
// Writes a bitcoin message msg to conn using the protocol version
|
|
|
|
// pver, and the bitcoin network btcnet. The return is a possible
|
|
|
|
// error.
|
|
|
|
err := btcwire.WriteMessage(conn, msg, pver, btcnet)
|
|
|
|
if err != nil {
|
|
|
|
// Log and handle the error
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
## GPG Verification Key
|
|
|
|
|
|
|
|
All official release tags are signed by Conformal so users can ensure the code
|
|
|
|
has not been tampered with and is coming from Conformal. To verify the
|
|
|
|
signature perform the following:
|
|
|
|
|
|
|
|
- Download the public key from the Conformal website at
|
|
|
|
https://opensource.conformal.com/GIT-GPG-KEY-conformal.txt
|
|
|
|
|
|
|
|
- Import the public key into your GPG keyring:
|
|
|
|
```bash
|
|
|
|
gpg --import GIT-GPG-KEY-conformal.txt
|
|
|
|
```
|
|
|
|
|
|
|
|
- Verify the release tag with the following command where `TAG_NAME` is a
|
|
|
|
placeholder for the specific tag:
|
|
|
|
```bash
|
|
|
|
git tag -v TAG_NAME
|
|
|
|
```
|
|
|
|
|
|
|
|
## License
|
|
|
|
|
2014-07-13 19:15:50 +02:00
|
|
|
Package btcwire is licensed under the [copyfree](http://copyfree.org) ISC
|
|
|
|
License.
|