diff --git a/README.md b/README.md index 54536456..b065c8a3 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,13 @@ CGO_LDFLAGS="-L/path/to/rocksdb -lrocksdb -lstdc++ -lm -lz -lbz2 -lsnappy -llz4 go get github.com/tecbot/gorocksdb ``` +Install ZeroMQ: https://github.com/zeromq/libzmq + +Install Go interface to ZeroMQ: +``` +go get github.com/pebbe/zmq4 +``` + Install blockbook: ``` diff --git a/bitcoin/mq.go b/bitcoin/mq.go new file mode 100644 index 00000000..a7f01b05 --- /dev/null +++ b/bitcoin/mq.go @@ -0,0 +1,39 @@ +package bitcoin + +import ( + "encoding/binary" + "encoding/hex" + "log" + + zmq "github.com/pebbe/zmq4" +) + +func ZeroMQ(binding string) { + context, err := zmq.NewContext() + if err != nil { + log.Fatal(err) + } + socket, err := context.NewSocket(zmq.SUB) + if err != nil { + log.Fatal(err) + } + socket.SetSubscribe("hashblock") + socket.SetSubscribe("hashtx") + socket.SetSubscribe("rawblock") + socket.SetSubscribe("rawtx") + socket.Connect(binding) + defer socket.Close() + for i := 0; i < 101; i++ { + msg, err := socket.RecvMessageBytes(0) + if err != nil { + log.Fatal(err) + } + topic := string(msg[0]) + body := hex.EncodeToString(msg[1]) + sequence := uint32(0) + if len(msg[len(msg)-1]) == 4 { + sequence = binary.LittleEndian.Uint32(msg[len(msg)-1]) + } + log.Printf("%s-%d (%v) %s", topic, sequence, msg[len(msg)-1], body) + } +} diff --git a/blockbook.go b/blockbook.go index 787cbd06..ebb6f0ed 100644 --- a/blockbook.go +++ b/blockbook.go @@ -54,12 +54,19 @@ var ( dryRun = flag.Bool("dryrun", false, "do not index blocks, only download") parse = flag.Bool("parse", false, "use in-process block parsing") - httpServerBinding = flag.String("httpserver", "nil", "http server binding [address]:port, by default no http server") + httpServerBinding = flag.String("httpserver", "nil", "http server binding [address]:port, if missing no http server") + + zeroMQBinding = flag.String("zeromq", "nil", "binding to zeromq, if missing no zeromq connection") ) func main() { flag.Parse() + if *zeroMQBinding != "nil" { + bitcoin.ZeroMQ(*zeroMQBinding) + return + } + if *repair { if err := db.RepairRocksDB(*dbPath); err != nil { log.Fatal(err)