关于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)

输出结果符合预期。

0x24e76Ed92D5c0B1CACA4fA4A9e0A8FFBC63BB67C

由此世界太平了。

Subscribe to Webber Woo
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.