Использование Go-IPFS программно - PullRequest
0 голосов
/ 05 сентября 2018

Мне бы очень хотелось иметь возможность использовать Go-IPFS в моей программе Go, однако это полностью недокументировано. Вот куда меня привел мой исследователь:

package main

import (
    "context"
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"

    "gx/ipfs/QmSP88ryZkHSRn1fnngAaV2Vcn63WUJzAavnRM9CVdU1Ky/go-ipfs-cmdkit/files"

    "github.com/ipfs/go-ipfs/core"
    "github.com/ipfs/go-ipfs/core/coreunix"
)

func main() {
    ctx := context.Background()

    node, err := core.NewNode(ctx, &core.BuildCfg{})
    if err != nil {
        log.Fatalf("Failed to start IPFS node: %v", err)
    }
    reader, err := coreunix.Cat(ctx, node, "QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB")
    if err != nil {
        log.Fatalf("Failed to look up IPFS welcome page: %v", err)
    }
    blob, err := ioutil.ReadAll(reader)
    if err != nil {
        log.Fatalf("Failed to retrieve IPFS welcome page: %v", err)
    }
    fmt.Println(string(blob))
}

Однако я не уверен в разнице

context.Background() против context.TODO() против context.WithCancel(context.Background()).

И самое главное, как можно выбрать, куда IPFS будет помещать репозиторий IPFS и убедиться, что он также инициализирует его?

Как включить и использовать Pubsub вместе с его командами subscribe и publish?

Как я могу добавить и закрепить файл в IPFS с возможностью ввода потока для больших файлов?

Подходит ли coreunix.Cat для чтения файлов в потоке?

Как я могу сохранить узел "слушающим", как когда вы запускаете демон ipfs из CLI и у вас все работает на всех портах, таких как webui, swarm и т. Д .?

Как насчет этого, чтобы добавить файлы? Использует ли это потоки или читает весь файл в память? Как это можно улучшить?

func addFile(ctx *context.Context, node *core.IpfsNode, path *string) error {
    file, err := os.Open(*path)
    if err != nil {
        return err
    }
    adder, err := coreunix.NewAdder(*ctx, node.Pinning, node.Blockstore, node.DAG)
    if err != nil {
        return err
    }
    filename := filepath.Base(*path)
    fileReader := files.NewReaderFile(filename, filename, file, nil)
    adder.AddFile(fileReader)
    adder.PinRoot()
    return nil
}

1 Ответ

0 голосов
/ 10 октября 2018

Возможно, вы захотите разбить ваш вопрос на более мелкие части, я какое-то время играл с исходным кодом go-ipfs, и вот общая инструкция, которую я мог бы дать вам:

  1. Большинство структур данных, таких как context, DAG, IPFSNode и т. Д., Определены в виде структур go, и вы должны быть в состоянии найти их в каталоге gx / ... / ..., где также вы должны быть возможность видеть подробную информацию о каждой используемой переменной (простой поиск строки в каталоге должен привести вас к нужному исходному файлу)
  2. Все методы определены в папке github.com/../ .. directory
  3. Очистить понятие указателей, так как они используют указатели большую часть времени для передачи параметров в функции
...