171 lines
5.0 KiB
Markdown
171 lines
5.0 KiB
Markdown
# go-ens
|
|
|
|
[![Tag](https://img.shields.io/github/tag/wealdtech/go-ens.svg)](https://github.com/wealdtech/go-ens/releases/)
|
|
[![License](https://img.shields.io/github/license/wealdtech/go-ens.svg)](LICENSE)
|
|
[![GoDoc](https://godoc.org/github.com/wealdtech/go-ens?status.svg)](https://godoc.org/github.com/wealdtech/go-ens)
|
|
[![Travis CI](https://img.shields.io/travis/wealdtech/go-ens.svg)](https://travis-ci.org/wealdtech/go-ens)
|
|
[![codecov.io](https://img.shields.io/codecov/c/github/wealdtech/go-ens.svg)](https://codecov.io/github/wealdtech/go-ens)
|
|
[![Go Report Card](https://goreportcard.com/badge/github.com/wealdtech/go-ens)](https://goreportcard.com/report/github.com/wealdtech/go-ens)
|
|
|
|
Go module to simplify interacting with the [Ethereum Name Service](https://ens.domains/) contracts.
|
|
|
|
|
|
## Table of Contents
|
|
|
|
- [Install](#install)
|
|
- [Usage](#usage)
|
|
- [Maintainers](#maintainers)
|
|
- [Contribute](#contribute)
|
|
- [License](#license)
|
|
|
|
## Install
|
|
|
|
`go-ens` is a standard Go module which can be installed with:
|
|
|
|
```sh
|
|
go get github.com/wealdtech/go-ens
|
|
```
|
|
|
|
## Usage
|
|
|
|
`go-ens` provides simple access to the [Ethereum Name Service](https://ens.domains/) (ENS) contracts.
|
|
|
|
### Resolution
|
|
|
|
The most commonly-used feature of ENS is resolution: converting an ENS name to an Ethereum address. `go-ens` provides a simple call to allow this:
|
|
|
|
```go
|
|
address, err := ens.Resolve(client, domain)
|
|
```
|
|
|
|
where `client` is a connection to an Ethereum client and `domain` is the fully-qualified name you wish to resolve (e.g. `foo.mydomain.eth`) (full examples for using this are given in the [Example](#Example) section below).
|
|
|
|
The reverse process, converting an address to an ENS name, is just as simple:
|
|
|
|
```go
|
|
domain, err := ens.ReverseResolve(client, address)
|
|
```
|
|
|
|
Note that if the address does not have a reverse resolution this will return "". If you just want a string version of an address for on-screen display then you can use `ens.Format()`, for example:
|
|
|
|
```go
|
|
fmt.Printf("The address is %s\n", ens.Format(client, address))
|
|
```
|
|
|
|
This will carry out reverse resolution of the address and print the name if present; if not it will print a formatted version of the address.
|
|
|
|
|
|
### Management of names
|
|
|
|
A top-level name is one that sits directly underneath `.eth`, for example `mydomain.eth`. Lower-level names, such as `foo.mydomain.eth` are covered in the following section. `go-ens` provides a simplified `Name` interface to manage top-level, removing the requirement to understand registrars, controllers, _etc._
|
|
|
|
Starting out with names in `go-ens` is easy:
|
|
|
|
```go
|
|
client, err := ethclient.Dial("https://infura.io/v3/SECRET")
|
|
name, err := ens.NewName(client, "mydomain.eth")
|
|
```
|
|
|
|
Addresses can be set and obtained using the address functions, for example to get an address:
|
|
|
|
```go
|
|
COIN_TYPE_ETHEREUM := uint64(60)
|
|
address, err := name.Address(COIN_TYPE_ETHEREUM)
|
|
```
|
|
|
|
ENS supports addresses for multiple coin types; values of coin types can be found at https://github.com/satoshilabs/slips/blob/master/slip-0044.md
|
|
|
|
### Registering and extending names
|
|
|
|
Most operations on a domain will involve setting resolvers and resolver information.
|
|
|
|
|
|
### Management of subdomains
|
|
|
|
Because subdomains have their own registrars they do not work with the `Name` interface.
|
|
|
|
### Example
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/ethereum/go-ethereum/ethclient"
|
|
ens "github.com/wealdtech/go-ens/v3"
|
|
)
|
|
|
|
func main() {
|
|
// Replace SECRET with your own access token for this example to work.
|
|
client, err := ethclient.Dial("https://mainnet.infura.io/v3/SECRET")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// Resolve a name to an address
|
|
domain := "avsa.eth"
|
|
address, err := ens.Resolve(client, domain)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Printf("Address of %s is %s\n", domain, address.Hex())
|
|
|
|
// Reverse resolve an address to a name
|
|
reverse, err := ens.ReverseResolve(client, address)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if reverse == "" {
|
|
fmt.Printf("%s has no reverse lookup\n", address.Hex())
|
|
} else {
|
|
fmt.Printf("Name of %s is %s\n", address.Hex(), reverse)
|
|
}
|
|
}
|
|
|
|
package main
|
|
|
|
import (
|
|
"github.com/ethereum/go-ethereum/ethclient"
|
|
ens "github.com/wealdtech/go-ens/v3"
|
|
)
|
|
|
|
func main() {
|
|
client, err := ethclient.Dial("https://mainnet.infura.io/v3/SECRET")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// Resolve a name to an address
|
|
domain := "wealdtech.eth"
|
|
address, err := ens.Resolve(client, domain)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Printf("Address of %s is %s\n", domain, address.Hex())
|
|
|
|
// Reverse resolve an address to a name
|
|
reverse, err := ens.ReverseResolve(client, address)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if reverse == "" {
|
|
fmt.Printf("%s has no reverse lookup\n", address.Hex())
|
|
} else {
|
|
fmt.Printf("Name of %s is %s\n", address.Hex(), reverse)
|
|
}
|
|
}
|
|
```
|
|
|
|
## Maintainers
|
|
|
|
Jim McDonald: [@mcdee](https://github.com/mcdee).
|
|
|
|
## Contribute
|
|
|
|
Contributions welcome. Please check out [the issues](https://github.com/wealdtech/go-ens/issues).
|
|
|
|
## License
|
|
|
|
[Apache-2.0](LICENSE) © 2019 Weald Technology Trading Ltd
|