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  }