diff --git a/README.md b/README.md index 4e4e897f..f5a8635e 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ go get github.com/gorilla/handlers go get github.com/gorilla/mux go get github.com/pebbe/zmq4 go get github.com/pkg/profile +go get github.com/juju/errors ``` Install blockbook: diff --git a/bchain/bitcoinrpc.go b/bchain/bitcoinrpc.go index 28c221c1..620a16be 100644 --- a/bchain/bitcoinrpc.go +++ b/bchain/bitcoinrpc.go @@ -9,6 +9,7 @@ import ( "time" "github.com/golang/glog" + "github.com/juju/errors" ) type RPCError struct { @@ -239,10 +240,10 @@ func (b *BitcoinRPC) GetBlockHash(height uint32) (string, error) { err := b.call(&req, &res) if err != nil { - return "", err + return "", errors.Annotatef(err, "height %v", height) } if res.Error != nil { - return "", res.Error + return "", errors.Annotatef(res.Error, "height %v", height) } return res.Result, nil } @@ -258,10 +259,10 @@ func (b *BitcoinRPC) GetBlockHeader(hash string) (*BlockHeader, error) { err := b.call(&req, &res) if err != nil { - return nil, err + return nil, errors.Annotatef(err, "hash %v", hash) } if res.Error != nil { - return nil, res.Error + return nil, errors.Annotatef(res.Error, "hash %v", hash) } return &res.Result, nil } @@ -281,7 +282,7 @@ func (b *BitcoinRPC) GetBlock(hash string) (*Block, error) { } block, err := b.Parser.ParseBlock(data) if err != nil { - return nil, err + return nil, errors.Annotatef(err, "hash %v", hash) } block.BlockHeader = *header return block, nil @@ -299,7 +300,7 @@ func (b *BitcoinRPC) GetBlockWithoutHeader(hash string, height uint32) (*Block, } block, err := b.Parser.ParseBlock(data) if err != nil { - return nil, err + return nil, errors.Annotatef(err, "%v %v", height, hash) } block.BlockHeader.Hash = hash block.BlockHeader.Height = height @@ -317,10 +318,10 @@ func (b *BitcoinRPC) GetBlockRaw(hash string) ([]byte, error) { err := b.call(&req, &res) if err != nil { - return nil, err + return nil, errors.Annotatef(err, "hash %v", hash) } if res.Error != nil { - return nil, res.Error + return nil, errors.Annotatef(res.Error, "hash %v", hash) } return hex.DecodeString(res.Result) } @@ -337,10 +338,10 @@ func (b *BitcoinRPC) GetBlockList(hash string) (*Block, error) { err := b.call(&req, &res) if err != nil { - return nil, err + return nil, errors.Annotatef(err, "hash %v", hash) } if res.Error != nil { - return nil, res.Error + return nil, errors.Annotatef(res.Error, "hash %v", hash) } txs := make([]Tx, len(res.Result.Txids)) @@ -369,10 +370,10 @@ func (b *BitcoinRPC) GetBlockFull(hash string) (*Block, error) { err := b.call(&req, &res) if err != nil { - return nil, err + return nil, errors.Annotatef(err, "hash %v", hash) } if res.Error != nil { - return nil, res.Error + return nil, errors.Annotatef(res.Error, "hash %v", hash) } return &res.Result, nil } @@ -405,10 +406,10 @@ func (b *BitcoinRPC) GetTransaction(txid string) (*Tx, error) { err := b.call(&req, &res) if err != nil { - return nil, err + return nil, errors.Annotatef(err, "txid %v", txid) } if res.Error != nil { - return nil, res.Error + return nil, errors.Annotatef(res.Error, "txid %v", txid) } return &res.Result, nil } diff --git a/blockbook.go b/blockbook.go index 8126e7ff..7ba130bf 100644 --- a/blockbook.go +++ b/blockbook.go @@ -3,15 +3,15 @@ package main import ( "context" "encoding/hex" - "errors" "flag" - "fmt" "os" "os/signal" "sync" "syscall" "time" + "github.com/juju/errors" + "blockbook/bchain" "blockbook/db" "blockbook/server" @@ -500,7 +500,7 @@ func connectBlocksParallel( for { block, err = chain.GetBlockWithoutHeader(hh.hash, hh.height) if err != nil { - glog.Error("Connect block ", hh.height, " ", hh.hash, " error ", err, ". Retrying...") + glog.Error("Connect block error ", err, ". Retrying...") time.Sleep(time.Millisecond * 500) } else { break @@ -540,12 +540,12 @@ ConnectLoop: } break } - err = errors.New(fmt.Sprint("connectBlocksParallel interrupted at height ", h)) + err = errors.Errorf("connectBlocksParallel interrupted at height %d", h) break ConnectLoop default: hash, err = chain.GetBlockHash(h) if err != nil { - glog.Error("GetBlockHash ", h, " error ", err) + glog.Error("GetBlockHash error ", err) time.Sleep(time.Millisecond * 500) continue } diff --git a/db/rocksdb.go b/db/rocksdb.go index 28908325..fcd178d8 100644 --- a/db/rocksdb.go +++ b/db/rocksdb.go @@ -5,10 +5,11 @@ import ( "bytes" "encoding/binary" "encoding/hex" - "errors" "os" "path/filepath" + "github.com/juju/errors" + "github.com/bsm/go-vlq" "github.com/golang/glog" diff --git a/server/socketio.go b/server/socketio.go index c9f2fc11..d5ecde0a 100644 --- a/server/socketio.go +++ b/server/socketio.go @@ -5,11 +5,12 @@ import ( "blockbook/db" "context" "encoding/json" - "errors" "fmt" "net/http" "strings" + "github.com/juju/errors" + "github.com/golang/glog" "github.com/martinboehm/golang-socketio" "github.com/martinboehm/golang-socketio/transport" @@ -193,7 +194,7 @@ func (s *SocketIoServer) onMessage(c *gosocketio.Channel, req map[string]json.Ra glog.V(1).Info(c.Id(), " onMessage ", method, " success") return rv } - glog.Error(c.Id(), " onMessage ", method, ": ", err) + glog.Error(c.Id(), " onMessage ", method, ": ", errors.ErrorStack(err)) e := resultError{} e.Error.Message = err.Error() return e