github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/contracts/ens/ens.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:34</date> 10 //</624450076961411072> 11 12 13 package ens 14 15 //go:生成abigen--sol contract/ens.sol--exc contract/abstractens.sol:abstractens--pkg contract--out contract/ens.go 16 //go:生成abigen--sol contract/fifsregistrar.sol--exc contract/abstractens.sol:abstractens--pkg contract--out contract/fifsregistrar.go 17 //go:生成abigen--sol contract/publicdolver.sol--exc contract/abstractens.sol:abstractens--pkg contract--out contract/publicdolver.go 18 19 import ( 20 "strings" 21 22 "github.com/ethereum/go-ethereum/accounts/abi/bind" 23 "github.com/ethereum/go-ethereum/common" 24 "github.com/ethereum/go-ethereum/contracts/ens/contract" 25 "github.com/ethereum/go-ethereum/core/types" 26 "github.com/ethereum/go-ethereum/crypto" 27 ) 28 29 var ( 30 MainNetAddress = common.HexToAddress("0x314159265dD8dbb310642f98f50C066173C1259b") 31 TestNetAddress = common.HexToAddress("0x112234455c3a32fd11230c42e7bccd4a84e02010") 32 ) 33 34 //Swarm域名注册和解析程序 35 type ENS struct { 36 *contract.ENSSession 37 contractBackend bind.ContractBackend 38 } 39 40 //newens创建了一个结构,它公开了方便的高级操作,以便与 41 //以太坊名称服务。 42 func NewENS(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*ENS, error) { 43 ens, err := contract.NewENS(contractAddr, contractBackend) 44 if err != nil { 45 return nil, err 46 } 47 48 return &ENS{ 49 &contract.ENSSession{ 50 Contract: ens, 51 TransactOpts: *transactOpts, 52 }, 53 contractBackend, 54 }, nil 55 } 56 57 //Deployeens部署ENS名称服务的一个实例,具有“先进先服务”的根注册器。 58 func DeployENS(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend) (common.Address, *ENS, error) { 59 //部署ENS注册表。 60 ensAddr, _, _, err := contract.DeployENS(transactOpts, contractBackend) 61 if err != nil { 62 return ensAddr, nil, err 63 } 64 65 ens, err := NewENS(transactOpts, ensAddr, contractBackend) 66 if err != nil { 67 return ensAddr, nil, err 68 } 69 70 //部署注册器。 71 regAddr, _, _, err := contract.DeployFIFSRegistrar(transactOpts, contractBackend, ensAddr, [32]byte{}) 72 if err != nil { 73 return ensAddr, nil, err 74 } 75 //将注册器设置为ENS根目录的所有者。 76 if _, err = ens.SetOwner([32]byte{}, regAddr); err != nil { 77 return ensAddr, nil, err 78 } 79 80 return ensAddr, ens, nil 81 } 82 83 func ensParentNode(name string) (common.Hash, common.Hash) { 84 parts := strings.SplitN(name, ".", 2) 85 label := crypto.Keccak256Hash([]byte(parts[0])) 86 if len(parts) == 1 { 87 return [32]byte{}, label 88 } else { 89 parentNode, parentLabel := ensParentNode(parts[1]) 90 return crypto.Keccak256Hash(parentNode[:], parentLabel[:]), label 91 } 92 } 93 94 func EnsNode(name string) common.Hash { 95 parentNode, parentLabel := ensParentNode(name) 96 return crypto.Keccak256Hash(parentNode[:], parentLabel[:]) 97 } 98 99 func (self *ENS) getResolver(node [32]byte) (*contract.PublicResolverSession, error) { 100 resolverAddr, err := self.Resolver(node) 101 if err != nil { 102 return nil, err 103 } 104 105 resolver, err := contract.NewPublicResolver(resolverAddr, self.contractBackend) 106 if err != nil { 107 return nil, err 108 } 109 110 return &contract.PublicResolverSession{ 111 Contract: resolver, 112 TransactOpts: self.TransactOpts, 113 }, nil 114 } 115 116 func (self *ENS) getRegistrar(node [32]byte) (*contract.FIFSRegistrarSession, error) { 117 registrarAddr, err := self.Owner(node) 118 if err != nil { 119 return nil, err 120 } 121 122 registrar, err := contract.NewFIFSRegistrar(registrarAddr, self.contractBackend) 123 if err != nil { 124 return nil, err 125 } 126 127 return &contract.FIFSRegistrarSession{ 128 Contract: registrar, 129 TransactOpts: self.TransactOpts, 130 }, nil 131 } 132 133 //解析是一个非事务性调用,返回与名称关联的内容哈希。 134 func (self *ENS) Resolve(name string) (common.Hash, error) { 135 node := EnsNode(name) 136 137 resolver, err := self.getResolver(node) 138 if err != nil { 139 return common.Hash{}, err 140 } 141 142 ret, err := resolver.Content(node) 143 if err != nil { 144 return common.Hash{}, err 145 } 146 147 return common.BytesToHash(ret[:]), nil 148 } 149 150 // 151 func (self *ENS) Addr(name string) (common.Address, error) { 152 node := EnsNode(name) 153 154 resolver, err := self.getResolver(node) 155 if err != nil { 156 return common.Address{}, err 157 } 158 159 ret, err := resolver.Addr(node) 160 if err != nil { 161 return common.Address{}, err 162 } 163 164 return common.BytesToAddress(ret[:]), nil 165 } 166 167 //setaddress设置与名称关联的地址。只有当呼叫方 168 //拥有名称,关联的冲突解决程序实现了一个“setaddress”函数。 169 func (self *ENS) SetAddr(name string, addr common.Address) (*types.Transaction, error) { 170 node := EnsNode(name) 171 172 resolver, err := self.getResolver(node) 173 if err != nil { 174 return nil, err 175 } 176 177 opts := self.TransactOpts 178 opts.GasLimit = 200000 179 return resolver.Contract.SetAddr(&opts, node, addr) 180 } 181 182 //注册为调用者注册一个新域名,使其成为新名称的所有者。 183 //仅当父域的注册器实现FIFS注册器协议时才有效。 184 func (self *ENS) Register(name string) (*types.Transaction, error) { 185 parentNode, label := ensParentNode(name) 186 registrar, err := self.getRegistrar(parentNode) 187 if err != nil { 188 return nil, err 189 } 190 return registrar.Contract.Register(&self.TransactOpts, label, self.TransactOpts.From) 191 } 192 193 //setContentHash设置与名称关联的内容哈希。只有当呼叫方 194 //拥有名称,关联的冲突解决程序实现了一个“setcontent”函数。 195 func (self *ENS) SetContentHash(name string, hash common.Hash) (*types.Transaction, error) { 196 node := EnsNode(name) 197 198 resolver, err := self.getResolver(node) 199 if err != nil { 200 return nil, err 201 } 202 203 opts := self.TransactOpts 204 opts.GasLimit = 200000 205 return resolver.Contract.SetContent(&opts, node, hash) 206 } 207