github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/contracts/ens/ens.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2016 Go Ethereum作者 10 //此文件是Go以太坊库的一部分。 11 // 12 //Go-Ethereum库是免费软件:您可以重新分发它和/或修改 13 //根据GNU发布的较低通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊图书馆的发行目的是希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU较低的通用公共许可证,了解更多详细信息。 21 // 22 //你应该收到一份GNU较低级别的公共许可证副本 23 //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package ens 26 27 //go:生成abigen--sol contract/ens.sol--exc contract/abstractens.sol:abstractens--pkg contract--out contract/ens.go 28 //go:生成abigen--sol contract/fifsregistrar.sol--exc contract/abstractens.sol:abstractens--pkg contract--out contract/fifsregistrar.go 29 //go:生成abigen--sol contract/publicdolver.sol--exc contract/abstractens.sol:abstractens--pkg contract--out contract/publicdolver.go 30 31 import ( 32 "strings" 33 34 "github.com/ethereum/go-ethereum/accounts/abi/bind" 35 "github.com/ethereum/go-ethereum/common" 36 "github.com/ethereum/go-ethereum/contracts/ens/contract" 37 "github.com/ethereum/go-ethereum/core/types" 38 "github.com/ethereum/go-ethereum/crypto" 39 ) 40 41 var ( 42 MainNetAddress = common.HexToAddress("0x314159265dD8dbb310642f98f50C066173C1259b") 43 TestNetAddress = common.HexToAddress("0x112234455c3a32fd11230c42e7bccd4a84e02010") 44 ) 45 46 // 47 type ENS struct { 48 *contract.ENSSession 49 contractBackend bind.ContractBackend 50 } 51 52 //newens创建了一个结构,它公开了方便的高级操作,以便与 53 //以太坊名称服务。 54 func NewENS(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*ENS, error) { 55 ens, err := contract.NewENS(contractAddr, contractBackend) 56 if err != nil { 57 return nil, err 58 } 59 60 return &ENS{ 61 &contract.ENSSession{ 62 Contract: ens, 63 TransactOpts: *transactOpts, 64 }, 65 contractBackend, 66 }, nil 67 } 68 69 //Deployeens部署ENS名称服务的一个实例,具有“先进先服务”的根注册器。 70 func DeployENS(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend) (common.Address, *ENS, error) { 71 //部署ENS注册表。 72 ensAddr, _, _, err := contract.DeployENS(transactOpts, contractBackend) 73 if err != nil { 74 return ensAddr, nil, err 75 } 76 77 ens, err := NewENS(transactOpts, ensAddr, contractBackend) 78 if err != nil { 79 return ensAddr, nil, err 80 } 81 82 //部署注册器。 83 regAddr, _, _, err := contract.DeployFIFSRegistrar(transactOpts, contractBackend, ensAddr, [32]byte{}) 84 if err != nil { 85 return ensAddr, nil, err 86 } 87 //将注册器设置为ENS根目录的所有者。 88 if _, err = ens.SetOwner([32]byte{}, regAddr); err != nil { 89 return ensAddr, nil, err 90 } 91 92 return ensAddr, ens, nil 93 } 94 95 func ensParentNode(name string) (common.Hash, common.Hash) { 96 parts := strings.SplitN(name, ".", 2) 97 label := crypto.Keccak256Hash([]byte(parts[0])) 98 if len(parts) == 1 { 99 return [32]byte{}, label 100 } else { 101 parentNode, parentLabel := ensParentNode(parts[1]) 102 return crypto.Keccak256Hash(parentNode[:], parentLabel[:]), label 103 } 104 } 105 106 func EnsNode(name string) common.Hash { 107 parentNode, parentLabel := ensParentNode(name) 108 return crypto.Keccak256Hash(parentNode[:], parentLabel[:]) 109 } 110 111 func (self *ENS) getResolver(node [32]byte) (*contract.PublicResolverSession, error) { 112 resolverAddr, err := self.Resolver(node) 113 if err != nil { 114 return nil, err 115 } 116 117 resolver, err := contract.NewPublicResolver(resolverAddr, self.contractBackend) 118 if err != nil { 119 return nil, err 120 } 121 122 return &contract.PublicResolverSession{ 123 Contract: resolver, 124 TransactOpts: self.TransactOpts, 125 }, nil 126 } 127 128 func (self *ENS) getRegistrar(node [32]byte) (*contract.FIFSRegistrarSession, error) { 129 registrarAddr, err := self.Owner(node) 130 if err != nil { 131 return nil, err 132 } 133 134 registrar, err := contract.NewFIFSRegistrar(registrarAddr, self.contractBackend) 135 if err != nil { 136 return nil, err 137 } 138 139 return &contract.FIFSRegistrarSession{ 140 Contract: registrar, 141 TransactOpts: self.TransactOpts, 142 }, nil 143 } 144 145 //解析是一个非事务性调用,返回与名称关联的内容哈希。 146 func (self *ENS) Resolve(name string) (common.Hash, error) { 147 node := EnsNode(name) 148 149 resolver, err := self.getResolver(node) 150 if err != nil { 151 return common.Hash{}, err 152 } 153 154 ret, err := resolver.Content(node) 155 if err != nil { 156 return common.Hash{}, err 157 } 158 159 return common.BytesToHash(ret[:]), nil 160 } 161 162 //注册为调用者注册一个新域名,使其成为新名称的所有者。 163 //仅当父域的注册器实现FIFS注册器协议时才有效。 164 func (self *ENS) Register(name string) (*types.Transaction, error) { 165 parentNode, label := ensParentNode(name) 166 registrar, err := self.getRegistrar(parentNode) 167 if err != nil { 168 return nil, err 169 } 170 return registrar.Contract.Register(&self.TransactOpts, label, self.TransactOpts.From) 171 } 172 173 //setContentHash设置与名称关联的内容哈希。只有当呼叫方 174 //拥有名称,关联的冲突解决程序实现了一个“setcontent”函数。 175 func (self *ENS) SetContentHash(name string, hash common.Hash) (*types.Transaction, error) { 176 node := EnsNode(name) 177 178 resolver, err := self.getResolver(node) 179 if err != nil { 180 return nil, err 181 } 182 183 opts := self.TransactOpts 184 opts.GasLimit = 200000 185 return resolver.Contract.SetContent(&opts, node, hash) 186 }