/ core / node / ipns.go
ipns.go
 1  package node
 2  
 3  import (
 4  	"fmt"
 5  	"time"
 6  
 7  	"github.com/ipfs/boxo/ipns"
 8  	util "github.com/ipfs/boxo/util"
 9  	record "github.com/libp2p/go-libp2p-record"
10  	"github.com/libp2p/go-libp2p/core/crypto"
11  	"github.com/libp2p/go-libp2p/core/peerstore"
12  	madns "github.com/multiformats/go-multiaddr-dns"
13  
14  	"github.com/ipfs/boxo/namesys"
15  	"github.com/ipfs/boxo/namesys/republisher"
16  	"github.com/ipfs/kubo/repo"
17  	irouting "github.com/ipfs/kubo/routing"
18  )
19  
20  const DefaultIpnsCacheSize = 128
21  
22  // RecordValidator provides namesys compatible routing record validator
23  func RecordValidator(ps peerstore.Peerstore) record.Validator {
24  	return record.NamespacedValidator{
25  		"pk":   record.PublicKeyValidator{},
26  		"ipns": ipns.Validator{KeyBook: ps},
27  	}
28  }
29  
30  // Namesys creates new name system
31  func Namesys(cacheSize int, cacheMaxTTL time.Duration) func(rt irouting.ProvideManyRouter, rslv *madns.Resolver, repo repo.Repo) (namesys.NameSystem, error) {
32  	return func(rt irouting.ProvideManyRouter, rslv *madns.Resolver, repo repo.Repo) (namesys.NameSystem, error) {
33  		opts := []namesys.Option{
34  			namesys.WithDatastore(repo.Datastore()),
35  			namesys.WithDNSResolver(rslv),
36  			namesys.WithMaxCacheTTL(cacheMaxTTL),
37  		}
38  
39  		if cacheSize > 0 {
40  			opts = append(opts, namesys.WithCache(cacheSize))
41  		}
42  
43  		return namesys.NewNameSystem(rt, opts...)
44  	}
45  }
46  
47  // IpnsRepublisher runs new IPNS republisher service
48  func IpnsRepublisher(repubPeriod time.Duration, recordLifetime time.Duration) func(lcStartStop, namesys.NameSystem, repo.Repo, crypto.PrivKey) error {
49  	return func(lc lcStartStop, namesys namesys.NameSystem, repo repo.Repo, privKey crypto.PrivKey) error {
50  		repub := republisher.NewRepublisher(namesys, repo.Datastore(), privKey, repo.Keystore())
51  
52  		if repubPeriod != 0 {
53  			if !util.Debug && (repubPeriod < time.Minute || repubPeriod > (time.Hour*24)) {
54  				return fmt.Errorf("config setting IPNS.RepublishPeriod is not between 1min and 1day: %s", repubPeriod)
55  			}
56  
57  			repub.Interval = repubPeriod
58  		}
59  
60  		if recordLifetime != 0 {
61  			repub.RecordLifetime = recordLifetime
62  		}
63  
64  		lc.Append(repub.Run)
65  		return nil
66  	}
67  }