dnslink resolution in go-ipfs
Package dnslink implements a DNSLink resolver. DNSLink is a basic standard for placing traversable links in DNS itself, with detailed documentation and specifications at dnslink.io
A dnslink is a path link in a DNS TXT record, like this:
dnslink=/ipfs/QmR7tiySn6vFHcEjBeZNtYGAFh735PJHfEMdVEycj9jAPy
For example:
> dig TXT ipfs.io
ipfs.io. 120 IN TXT dnslink=/ipfs/QmR7tiySn6vFHcEjBeZNtYGAFh735PJHfEMdVEycj9jAPy
This package eases resolving and working with thse DNS links. For example:
import (
dnslink "github.com/ipfs/go-dnslink"
)
link, err := dnslink.Resolve("ipfs.io")
// link = "/ipfs/QmR7tiySn6vFHcEjBeZNtYGAFh735PJHfEMdVEycj9jAPy"
It even supports recursive resolution. Suppose you have three domains with dnslink records like these:
> dig TXT foo.com
foo.com. 120 IN TXT dnslink=/ipns/bar.com/f/o/o
> dig TXT bar.com
bar.com. 120 IN TXT dnslink=/ipns/long.test.baz.it/b/a/r
> dig TXT long.test.baz.it
long.test.baz.it. 120 IN TXT dnslink=/b/a/z
Expect these resolutions:
dnslink.ResolveN("long.test.baz.it", 0) // "/ipns/long.test.baz.it"
dnslink.Resolve("long.test.baz.it") // "/b/a/z"
dnslink.ResolveN("bar.com", 1) // "/ipns/long.test.baz.it/b/a/r"
dnslink.Resolve("bar.com") // "/b/a/z/b/a/r"
dnslink.ResolveN("foo.com", 1) // "/ipns/bar.com/f/o/o/"
dnslink.ResolveN("foo.com", 2) // "/ipns/long.test.baz.it/b/a/r/f/o/o/"
dnslink.Resolve("foo.com") // "/b/a/z/b/a/r/f/o/o"
go get github.com/ipfs/go-dnslink
import (
log
fmt
dnslink "github.com/ipfs/go-dnslink"
)
func main() {
link, err := dnslink.Resolve("ipfs.io")
if err != nil {
log.Fatal(err)
}
fmt.Println(link) // string path
}
Check out the commandline tool, which works like this:
> dnslink ipfs.io
/ipfs/QmR7tiySn6vFHcEjBeZNtYGAFh735PJHfEMdVEycj9jAPy
Feel free to join in. All welcome. Open an issue!
This repository falls under the IPFS Code of Conduct.
MIT © Juan Benet-Batiz