# 关于web3py解析ens的实践

By [Webber Woo](https://paragraph.com/@webber-woo) · 2023-02-25

---

背景：线下将一批ENS地址需要转换成Address。由于本人是后端出生，本次任务挑选的技术栈是python。本以为10分钟能搞定的事情，花了整整2小时。。。以下是踩坑总结：

第一步：按照[Web3.py的文档](https://web3py.readthedocs.io/en/stable/index.html)执行`pip install web3` 命令，非常顺利。

第二步：根据[doc中ens](https://web3py.readthedocs.io/en/stable/ens_overview.html)的文档依葫芦画瓢写下以下代码：

    from web3 import Web3
    from ens import ENS
    
    # provider = IPCProvider(...) --我改成http的方式接入provider
    
    node_url = "我的节点"
    ns = ENS(Web3.HTTPProvider(node_url))
    
    eth_address = ns.address('jasoncarver.eth')
    print("【eth_address】: " + eth_address)
    
    assert eth_address == '0x5B2063246F2191f18F2675ceDB8b28102e957458'
    

输出结果与文档一直且符合预期，真tm简单😊：

    控制台输出：
    【eth_address】: 0x5B2063246F2191f18F2675ceDB8b28102e957458
    

第三步：看看换个输入是否ok呢？换成我自己的ens试试。

    from web3 import Web3
    from ens import ENS
    
    # provider = IPCProvider(...) --我改成http的方式接入provider
    
    node_url = "我的api url"
    ns = ENS(Web3.HTTPProvider(node_url))
    
    eth_address = ns.address('webber-woo.eth')
    print(eth_address)
    

输出结果

    None
    

难道是网络没连接上？重试了N次也是None，None，None……。 物理学以太坊不存在了？！😱😱😱一时间脑瓜子嗡嗡作响。

\==============================================================

喝了杯咖啡，胖揍了我那只乱叫的傻狗后再次坐在电脑前——我试试js的方式吧。

在Alchemy中找到了[example](https://docs.alchemy.com/docs/how-to-resolve-ewallet-given-ens)，再次以葫芦画瓢并执行我的脚本

    import { Network, Alchemy } from 'alchemy-sdk';
    
    const settings = {
        apiKey: "我的api key",
        network: Network.ETH_MAINNET,
    };
    
    const alchemy = new Alchemy(settings);
    
    const wl = [
        "webber-woo.eth",
        "jasoncarver.eth",
        "vitalik.eth",
    ];
    
    for (var i=0; i<wl.length; i++) {
        var addr = await alchemy.core.resolveName(wl[i]);
        console.log(wl[i] + ", " + addr);
    }
    

输出结果如下：

    webber-woo.eth, 0x24e76Ed92D5c0B1CACA4fA4A9e0A8FFBC63BB67C
    jasoncarver.eth, 0x5B2063246F2191f18F2675ceDB8b28102e957458
    vitalik.eth, 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
    

世界没有坏！🧐 有人在捣鬼，好奇心驱使我去抓鬼。

\==============================================================

回到`ENS(Web3.HTTPProvider(node_url))`这行代码。它的构造函数可以传入address

![ENS构造方法](https://storage.googleapis.com/papyrus_images/612b41d689b5de9f6740ca86ffe6b455f4f276c4491dc1f73ab2be472dcaf47d.png)

ENS构造方法

如果未传入address则使用内部写死的`‘0x314159265dd8dbb310642f98f50c066173c1259b’` 这个合约地址构造ens合约对象。这个合约是在[上古时代](https://etherscan.io/tx/0x40ea7c00f622a7c6699a0013a26e2399d0cd167f8565062a43eb962c6750f7db)创建的。

而[ENS官网推荐的地址](https://docs.ens.domains/ens-deployments)是：`0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e`，它是[升级后](https://etherscan.io/tx/0x00df88239dcc77e499f4ed3bad25bc58cc30663a26bc7c531decff94e861b9bf)的（找寻到该文档花费时间近2小时）。

将python代码中ENS构造方法添加推荐地址，

    from web3 import Web3
    from ens import ENS
    
    # provider = IPCProvider(...) --我改成http的方式接入provider
    
    node_url = "我的api url"
    ns = ENS(Web3.HTTPProvider(alchemy_url), '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e')
    
    eth_address = ns.address('webber-woo.eth')
    print(eth_address)
    

输出结果符合预期。

由此世界太平了。

---

*Originally published on [Webber Woo](https://paragraph.com/@webber-woo/web3py-ens)*
