interface.go 4.02 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*
Package namesys implements resolvers and publishers for the IPFS
naming system (IPNS).

The core of IPFS is an immutable, content-addressable Merkle graph.
That works well for many use cases, but doesn't allow you to answer
questions like "what is Alice's current homepage?".  The mutable name
system allows Alice to publish information like:

  The current homepage for alice.example.com is
  /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj

or:

  The current homepage for node
  QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
  is
  /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj

The mutable name system also allows users to resolve those references
to find the immutable IPFS object currently referenced by a given
mutable name.

For command-line bindings to this functionality, see:

  ipfs name
  ipfs dns
  ipfs resolve
*/
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
30 31 32 33
package namesys

import (
	"errors"
34
	"time"
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
35

36
	context "context"
Jan Winkelmann's avatar
Jan Winkelmann committed
37

38
	path "github.com/ipfs/go-ipfs/path"
39
	ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto"
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
40 41
)

42 43 44 45 46 47 48 49 50 51 52
const (
	// DefaultDepthLimit is the default depth limit used by Resolve.
	DefaultDepthLimit = 32

	// UnlimitedDepth allows infinite recursion in ResolveN.  You
	// probably don't want to use this, but it's here if you absolutely
	// trust resolution to eventually complete and can't put an upper
	// limit on how many steps it will take.
	UnlimitedDepth = 0
)

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
53
// ErrResolveFailed signals an error when attempting to resolve.
Richard Littauer's avatar
Richard Littauer committed
54
var ErrResolveFailed = errors.New("Could not resolve name.")
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
55

56 57
// ErrResolveRecursion signals a recursion-depth limit.
var ErrResolveRecursion = errors.New(
Richard Littauer's avatar
Richard Littauer committed
58
	"Could not resolve name (recursion limit exceeded).")
59

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
60
// ErrPublishFailed signals an error when attempting to publish.
Richard Littauer's avatar
Richard Littauer committed
61
var ErrPublishFailed = errors.New("Could not publish name.")
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
62 63 64 65 66 67 68 69 70 71 72

// Namesys represents a cohesive name publishing and resolving system.
//
// Publishing a name is the process of establishing a mapping, a key-value
// pair, according to naming rules and databases.
//
// Resolving a name is the process of looking up the value associated with the
// key (name).
type NameSystem interface {
	Resolver
	Publisher
vyzo's avatar
vyzo committed
73
	ResolverLookup
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
74 75 76 77 78
}

// Resolver is an object capable of resolving names.
type Resolver interface {

79 80 81 82 83 84 85 86 87 88 89 90 91 92
	// Resolve performs a recursive lookup, returning the dereferenced
	// path.  For example, if ipfs.io has a DNS TXT record pointing to
	//   /ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
	// and there is a DHT IPNS entry for
	//   QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy
	//   -> /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj
	// then
	//   Resolve(ctx, "/ipns/ipfs.io")
	// will resolve both names, returning
	//   /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj
	//
	// There is a default depth-limit to avoid infinite recursion.  Most
	// users will be fine with this default limit, but if you need to
	// adjust the limit you can use ResolveN.
93
	Resolve(ctx context.Context, name string) (value path.Path, err error)
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
94

95 96 97 98 99 100 101 102
	// ResolveN performs a recursive lookup, returning the dereferenced
	// path.  The only difference from Resolve is that the depth limit
	// is configurable.  You can use DefaultDepthLimit, UnlimitedDepth,
	// or a depth limit of your own choosing.
	//
	// Most users should use Resolve, since the default limit works well
	// in most real-world situations.
	ResolveN(ctx context.Context, name string, depth int) (value path.Path, err error)
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
103 104 105 106 107 108 109
}

// Publisher is an object capable of publishing particular names.
type Publisher interface {

	// Publish establishes a name-value mapping.
	// TODO make this not PrivKey specific.
110
	Publish(ctx context.Context, name ci.PrivKey, value path.Path) error
111 112 113 114

	// TODO: to be replaced by a more generic 'PublishWithValidity' type
	// call once the records spec is implemented
	PublishWithEOL(ctx context.Context, name ci.PrivKey, value path.Path, eol time.Time) error
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
115
}
vyzo's avatar
vyzo committed
116 117 118 119 120 121 122

// ResolverLookup is an object capable of finding resolvers for a subsystem
type ResolverLookup interface {

	// GetResolver retrieves a resolver associated with a subsystem
	GetResolver(subs string) (Resolver, bool)
}