A client for connecting to bitcoind from Go code. Safe for concurrent use. All RPC methods are code-generated from the bitcoind help output.
bitcoindclient "github.com/joakimofv/go-bitcoindclient/v23"
libzmq must be installed in order to compile, because it is needed by this import that handles ZMQ. See the instructions for your OS on the ZMQ website.
The major version of this package tracks the major version of bitcoind (starting with v22). Running the client against another version might or might not work, depending on specific changes to the RPC methods. There is no explicit version check by default.
You don't need to have bitcoind installed in order to compile. To run the tests or re-generate the code you would need it.
bc, err := bitcoindclient.New(bitcoindclient.Config{
RpcAddress: "localhost:8332",
RpcUser: "name",
RpcPassword: "password",
ZmqPubAddress: "tcp://localhost:12345",
})
if err != nil {
// Handle err
}
See Config
for options.
for {
if err := bc.Ready(); err != nil {
// Inspect error, maybe give up
} else {
// Success!
break
}
}
There are also options that can be given to Ready
to tell it to check the version or ZMQ messages received, see ReadyOption
.
resp, err := bc.GetBlock(ctx, GetBlockReq{
Blockhash: "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
})
if err != nil {
// Handle err
}
fmt.Println(resp.Hex)
See pkg.go.dev for the full list of methods. Or see BitcoinCore RPC Docs, the methods are the same (in camelcase). Input is always incapsulated in a struct called <Method>Req
(or empty) and output is always in a struct called <Method>Resp
(or empty).
if err := bc.Close(); err != nil {
// Handle err
}
ch, cancel, err := bc.SubscribeHashBlock()
if err != nil {
// Handle err
}
There are SubscribeHashTx
, SubscribeHashBlock
, SubscribeRawTx
, SubscribeRawBlock
, and SubscribeSequence
.
select {
case msg, open := <-ch:
if !open {
// return
}
fmt.Println(hex.EncodeToString(msg.Hash[:]))
}
The message types are HashMsg
, RawMsg
or SequenceMsg
.
cancel()
This closes the channel and releases resources. Closing the client will do that too.
The RPC methods may return errors that are of the type *BitcoindError
, that means the connection was successful but bitcoind had something to complain about related to the user input.
var bErr *bitcoindclient.BitcoindError
if errors.As(err, &bErr) {
fmt.Println(bErr.Code)
fmt.Println(bErr.Message)
}
Other expected errors are *url.Error
if the connection failed, or context.Canceled
/context.DeadlineExceeded
if the context was cancelled/expired.
If running against a different version of bitcoind you might get an error of type *UnmarshalError
because the response format was not as expected. If you get this when running against the matching version then please report an issue.
ctx = bitcoindclient.UseConnectionRetries(ctx, 2)
Enable retry on connection error by modifying the context with UseConnectionRetries
.
ctx = bitcoindclient.UseUriPath(ctx, "/wallet/mywallet")
Change the URI path for a call by modifying the context with UseUriPath
.