关于web3py解析ens的实践

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

第一步:按照Web3.py的文档执行pip install web3 命令,非常顺利。

第二步:根据doc中ens的文档依葫芦画瓢写下以下代码:

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,再次以葫芦画瓢并执行我的脚本

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构造方法
ENS构造方法

如果未传入address则使用内部写死的‘0x314159265dd8dbb310642f98f50c066173c1259b’ 这个合约地址构造ens合约对象。这个合约是在上古时代创建的。

ENS官网推荐的地址是:0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e,它是升级后的(找寻到该文档花费时间近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)

输出结果符合预期。

由此世界太平了。