From 6fd0526376d8c1e26b6cf1e533accdd0f041568c Mon Sep 17 00:00:00 2001 From: Alex Grintsvayg Date: Fri, 31 Aug 2018 19:50:22 -0400 Subject: [PATCH] beginning of blocklist support --- cmd/test.go | 20 ++++++ reflector/blocklist.go | 112 +++++++++++++++++++++++++++++++++ {lbryumx => wallet}/client.go | 2 +- {lbryumx => wallet}/network.go | 2 +- {lbryumx => wallet}/tcp.go | 2 +- 5 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 cmd/test.go create mode 100644 reflector/blocklist.go rename {lbryumx => wallet}/client.go (98%) rename {lbryumx => wallet}/network.go (99%) rename {lbryumx => wallet}/tcp.go (98%) diff --git a/cmd/test.go b/cmd/test.go new file mode 100644 index 0000000..f2bdced --- /dev/null +++ b/cmd/test.go @@ -0,0 +1,20 @@ +package cmd + +import ( + "github.com/davecgh/go-spew/spew" + "github.com/lbryio/reflector.go/reflector" + "github.com/spf13/cobra" +) + +func init() { + var cmd = &cobra.Command{ + Use: "test", + Short: "Test things", + Run: testCmd, + } + rootCmd.AddCommand(cmd) +} + +func testCmd(cmd *cobra.Command, args []string) { + spew.Dump(reflector.BlockedSdHashes()) +} diff --git a/reflector/blocklist.go b/reflector/blocklist.go new file mode 100644 index 0000000..0a2d2ee --- /dev/null +++ b/reflector/blocklist.go @@ -0,0 +1,112 @@ +package reflector + +import ( + "encoding/hex" + "encoding/json" + "net/http" + "strconv" + "strings" + + "github.com/lbryio/reflector.go/wallet" + + "github.com/lbryio/lbry.go/errors" + types "github.com/lbryio/types/go" + + "github.com/golang/protobuf/proto" +) + +const blocklistURL = "https://api.lbry.io/file/list_blocked" + +type blockListResponse struct { + Success bool `json:"success"` + Error string `json:"error"` + Data struct { + Outpoints []string `json:"outpoints"` + } `json:"data"` +} + +func BlockedSdHashes() (map[string]string, error) { + blocked := make(map[string]string) + + resp, err := http.Get(blocklistURL) + if err != nil { + return nil, errors.Err(err) + } + defer resp.Body.Close() + + var r blockListResponse + if err = json.NewDecoder(resp.Body).Decode(&r); err != nil { + return nil, errors.Err(err) + } + + if !r.Success { + return nil, errors.Prefix("list_blocked API call", r.Error) + } + + for _, outpoint := range r.Data.Outpoints { + sdHash, err := sdHashForOutpoint(outpoint) + if err != nil { + blocked[outpoint] = err.Error() + } else { + blocked[outpoint] = sdHash + } + } + + return blocked, nil +} + +func sdHashForOutpoint(outpoint string) (string, error) { + val, err := valueForOutpoint(outpoint) + if err != nil { + return "", err + } + + return sdHashForValue(val) +} + +// decodeValue decodes a protobuf-encoded claim and returns the sd hash +func sdHashForValue(value []byte) (string, error) { + claim := &types.Claim{} + err := proto.Unmarshal(value, claim) + if err != nil { + return "", errors.Err(err) + } + + if claim.GetStream().GetSource().GetSourceType() != types.Source_lbry_sd_hash { + return "", errors.Err("source is nil or source type is not lbry_sd_hash") + } + + return hex.EncodeToString(claim.GetStream().GetSource().GetSource()), nil +} + +// valueForOutpoint queries wallet server for the value of the claim at the given outpoint +func valueForOutpoint(outpoint string) ([]byte, error) { + parts := strings.Split(outpoint, ":") + if len(parts) != 2 { + return nil, errors.Err("invalid outpoint format") + } + + nout, err := strconv.Atoi(parts[1]) + if err != nil { + return nil, errors.Prefix("invalid nout", err) + } + + node := wallet.NewNode() + err = node.ConnectTCP("victor.lbry.tech:50001") + if err != nil { + return nil, err + } + + resp, err := node.GetClaimsInTx(parts[0]) + if err != nil { + return nil, err + } + + for _, tx := range resp.Result { + if tx.Nout == nout { + return hex.DecodeString(tx.Value) + } + } + + return nil, errors.Err("outpoint not found") +} diff --git a/lbryumx/client.go b/wallet/client.go similarity index 98% rename from lbryumx/client.go rename to wallet/client.go index 80253a6..856dfcc 100644 --- a/lbryumx/client.go +++ b/wallet/client.go @@ -1,4 +1,4 @@ -package lbryumx +package wallet // ServerVersion returns the server's version. // https://electrumx.readthedocs.io/en/latest/protocol-methods.html#server-version diff --git a/lbryumx/network.go b/wallet/network.go similarity index 99% rename from lbryumx/network.go rename to wallet/network.go index 1301004..58ad935 100644 --- a/lbryumx/network.go +++ b/wallet/network.go @@ -1,4 +1,4 @@ -package lbryumx +package wallet // copied from https://github.com/d4l3k/go-electrum diff --git a/lbryumx/tcp.go b/wallet/tcp.go similarity index 98% rename from lbryumx/tcp.go rename to wallet/tcp.go index 8ab0c69..0fc06d7 100644 --- a/lbryumx/tcp.go +++ b/wallet/tcp.go @@ -1,4 +1,4 @@ -package lbryumx +package wallet // copied from https://github.com/d4l3k/go-electrum