beginning of blocklist support
This commit is contained in:
parent
cd236708b0
commit
6fd0526376
5 changed files with 135 additions and 3 deletions
20
cmd/test.go
Normal file
20
cmd/test.go
Normal file
|
@ -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())
|
||||||
|
}
|
112
reflector/blocklist.go
Normal file
112
reflector/blocklist.go
Normal file
|
@ -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")
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package lbryumx
|
package wallet
|
||||||
|
|
||||||
// ServerVersion returns the server's version.
|
// ServerVersion returns the server's version.
|
||||||
// https://electrumx.readthedocs.io/en/latest/protocol-methods.html#server-version
|
// https://electrumx.readthedocs.io/en/latest/protocol-methods.html#server-version
|
|
@ -1,4 +1,4 @@
|
||||||
package lbryumx
|
package wallet
|
||||||
|
|
||||||
// copied from https://github.com/d4l3k/go-electrum
|
// copied from https://github.com/d4l3k/go-electrum
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package lbryumx
|
package wallet
|
||||||
|
|
||||||
// copied from https://github.com/d4l3k/go-electrum
|
// copied from https://github.com/d4l3k/go-electrum
|
||||||
|
|
Loading…
Reference in a new issue