Мне бы очень хотелось иметь возможность использовать 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
}